This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v3] Improve strsep
With a correction and a suggestion below I think this ok.
On 13/12/2016 10:44, Wilco Dijkstra wrote:
> -
> -__STRING_INLINE char *__strsep_3c (char **__s, char __reject1, char __reject2,
> - char __reject3);
> -__STRING_INLINE char *
> -__strsep_3c (char **__s, char __reject1, char __reject2, char __reject3)
> -{
> - char *__retval = *__s;
> - if (__retval != NULL)
> - {
> - char *__cp = __retval;
> - while (1)
> - {
> - if (*__cp == '\0')
> - {
> - __cp = NULL;
> - break;
> - }
> - if (*__cp == __reject1 || *__cp == __reject2 || *__cp == __reject3)
> - {
> - *__cp++ = '\0';
> - break;
> - }
> - ++__cp;
> - }
> - *__s = __cp;
> - }
> - return __retval;
> -}
> -# ifdef __USE_MISC
> -# define strsep(s, reject) __strsep (s, reject)
Without the indirection some link namespace tests fails with:
[initial] fpathconf -> [libc.a(fpathconf.o)] __fstatvfs64 -> [libc.a(fstatvfs.o)] __internal_statvfs -> [libc.a(internal_statvfs.o)] strsep
Previously strsep was redirected internally to __strsep_g and it
contains the requires libc_hidden_{def,proto}, however I think we
just can simplify internal strsep altogether by simply replace
__strset_g definition and usage with __strsep. We still need
to strong_alias strsep to __strsep_g and export it unfortunately.
Based on your patch:
diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c
index 116ec49..dd2edde 100644
--- a/elf/dl-minimal.c
+++ b/elf/dl-minimal.c
@@ -377,4 +377,3 @@ __strsep (char **stringp, const char *delim)
return begin;
}
weak_alias (__strsep, strsep)
-strong_alias (__strsep, __strsep_g)
diff --git a/include/string.h b/include/string.h
index e145bfd..dffafd5 100644
--- a/include/string.h
+++ b/include/string.h
@@ -91,8 +91,7 @@ libc_hidden_proto (strcoll)
libc_hidden_proto (__strcoll_l)
libc_hidden_proto (__strxfrm_l)
libc_hidden_proto (__strtok_r)
-extern char *__strsep_g (char **__stringp, const char *__delim);
-libc_hidden_proto (__strsep_g)
+libc_hidden_proto (__strsep)
libc_hidden_proto (strnlen)
libc_hidden_proto (__strnlen)
libc_hidden_proto (memmem)
@@ -125,7 +124,7 @@ libc_hidden_builtin_proto (ffs)
extern __typeof (__stpcpy) __stpcpy attribute_hidden;
extern __typeof (__strdup) __strdup attribute_hidden;
extern __typeof (__strerror_r) __strerror_r attribute_hidden;
-extern __typeof (__strsep_g) __strsep_g attribute_hidden;
+extern __typeof (__strsep) __strsep attribute_hidden;
extern __typeof (memchr) memchr attribute_hidden;
extern __typeof (memcmp) memcmp attribute_hidden;
diff --git a/string/strsep.c b/string/strsep.c
index 68581c8..6af0bdc 100644
--- a/string/strsep.c
+++ b/string/strsep.c
@@ -45,5 +45,5 @@ __strsep (char **stringp, const char *delim)
return begin;
}
weak_alias (__strsep, strsep)
+libc_hidden_def (__strsep)
strong_alias (__strsep, __strsep_g)
-libc_hidden_def (__strsep_g)
diff --git a/sysdeps/unix/sysv/linux/internal_statvfs.c b/sysdeps/unix/sysv/linux/internal_statvfs.c
index 012f93f..ce649cd 100644
--- a/sysdeps/unix/sysv/linux/internal_statvfs.c
+++ b/sysdeps/unix/sysv/linux/internal_statvfs.c
@@ -168,7 +168,7 @@ __statvfs_getflags (const char *name, int fstype, int fd)
char *cp = mntbuf.mnt_opts;
char *opt;
- while ((opt = strsep (&cp, ",")) != NULL)
+ while ((opt = __strsep (&cp, ",")) != NULL)
if (strcmp (opt, "ro") == 0)
result |= ST_RDONLY;
else if (strcmp (opt, "nosuid") == 0)