summaryrefslogtreecommitdiff
path: root/string
diff options
context:
space:
mode:
Diffstat (limited to 'string')
-rw-r--r--string/Makefile3
-rw-r--r--string/argz-addsep.c59
-rw-r--r--string/argz-ctsep.c47
-rw-r--r--string/argz.h7
-rw-r--r--string/strcoll.c2
5 files changed, 97 insertions, 21 deletions
diff --git a/string/Makefile b/string/Makefile
index d817d1504b..e91bd4deea 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -35,7 +35,8 @@ routines := strcat strchr strcmp strcoll strcpy strcspn \
memccpy memcpy wordcopy strsep \
swab strfry memfrob memmem \
$(addprefix argz-,append count create ctsep next \
- delete extract insert stringify) \
+ delete extract insert stringify \
+ addsep) \
envz basename
tests := tester testcopy test-ffs tst-strlen stratcliff
diff --git a/string/argz-addsep.c b/string/argz-addsep.c
new file mode 100644
index 0000000000..7405e9ad1a
--- /dev/null
+++ b/string/argz-addsep.c
@@ -0,0 +1,59 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <argz.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+error_t
+__argz_add_sep (char **argz, size_t *argz_len, const char *string, int delim)
+{
+ size_t nlen = strlen (string) + 1;
+
+ if (nlen > 1)
+ {
+ const char *rp;
+ char *wp;
+
+ *argz = (char *) realloc (*argz, *argz_len + nlen);
+ if (*argz == NULL)
+ return ENOMEM;
+
+ wp = *argz + *argz_len;
+ rp = string;
+ do
+ if (*rp == delim)
+ {
+ if (wp > *argz && wp[-1] != '\0')
+ *wp++ = '\0';
+ else
+ --nlen;
+ }
+ else
+ *wp++ = *rp;
+ while (*rp++ != '\0');
+
+ *argz_len += nlen;
+ }
+
+ return 0;
+}
+weak_alias (__argz_create_sep, argz_create_sep)
diff --git a/string/argz-ctsep.c b/string/argz-ctsep.c
index 9560591cb3..461b9beb87 100644
--- a/string/argz-ctsep.c
+++ b/string/argz-ctsep.c
@@ -1,21 +1,21 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Library General Public License for more details.
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
#include <argz.h>
#include <errno.h>
@@ -28,11 +28,11 @@ __argz_create_sep (const char *string, int delim, char **argz, size_t *len)
{
size_t nlen = strlen (string) + 1;
- if (nlen != 0)
+ if (nlen > 1)
{
const char *rp;
char *wp;
-
+
*argz = (char *) malloc (nlen);
if (*argz == NULL)
return ENOMEM;
@@ -50,10 +50,19 @@ __argz_create_sep (const char *string, int delim, char **argz, size_t *len)
else
*wp++ = *rp;
while (*rp++ != '\0');
+
+ if (nlen == 0)
+ {
+ free (*argz);
+ *argz = NULL;
+ *len = 0;
+ }
+ }
+ else
+ {
+ *argz = NULL;
+ *len = 0;
}
- if (nlen == 0)
- *argz = NULL;
- *len = nlen;
return 0;
}
diff --git a/string/argz.h b/string/argz.h
index 2cfb5b7be3..255e1d345d 100644
--- a/string/argz.h
+++ b/string/argz.h
@@ -71,6 +71,13 @@ extern error_t __argz_add __P ((char **__argz, size_t *__argz_len,
extern error_t argz_add __P ((char **__argz, size_t *__argz_len,
__const char *__str));
+/* Append SEP separated list in STRING to the argz vector in ARGZ &
+ ARGZ_LEN. */
+extern error_t __argz_add_sep __P ((char **__argz, size_t *__argz_len,
+ __const char *__string, int __delim));
+extern error_t argz_add_sep __P ((char **__argz, size_t *__argz_len,
+ __const char *__string, int __delim));
+
/* Delete ENTRY from ARGZ & ARGZ_LEN, if it appears there. */
extern void __argz_delete __P ((char **__argz, size_t *__argz_len,
char *__entry));
diff --git a/string/strcoll.c b/string/strcoll.c
index 7061a38026..fa1025e0d7 100644
--- a/string/strcoll.c
+++ b/string/strcoll.c
@@ -74,7 +74,7 @@ STRCOLL (s1, s2)
u_int32_t w1, w2;
/* Here we have to check for IGNORE entries. If these are
- found we count them and go on witht he next value. */
+ found we count them and go on with the next value. */
while ((w1 = s1run->data[pass].value[s1idx])
== (u_int32_t) IGNORE_CHAR)
{