X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fbrkstring.c;h=a9446fef299512d5409b596b09a7ae1540bb3c19;hp=255abf7465bf8c5a97d7d7b026894f6100f82eb1;hb=f78e7c6e6e616cc4ff2bee8a726365fafef2d8ce;hpb=81a21a9a97d8633f6d6231e31fdb6e328d0d3ff2 diff --git a/sbr/brkstring.c b/sbr/brkstring.c index 255abf7..a9446fe 100644 --- a/sbr/brkstring.c +++ b/sbr/brkstring.c @@ -1,95 +1,75 @@ - /* - * brkstring.c -- (destructively) split a string into - * -- an array of substrings - * - * $Id$ - * - * This code is Copyright (c) 2002, by the authors of nmh. See the - * COPYRIGHT file in the root directory of the nmh distribution for - * complete copyright information. - */ - +** brkstring.c -- (destructively) split a string into +** -- an array of substrings +** +** This code is Copyright (c) 2002, by the authors of nmh. See the +** COPYRIGHT file in the root directory of the nmh distribution for +** complete copyright information. +*/ + +#include #include #include /* allocate this number of pointers at a time */ #define NUMBROKEN 256 -static char **broken = NULL; /* array of substring start addresses */ -static int len = 0; /* current size of "broken" */ - -/* - * static prototypes - */ -static int brkany (char, char *); +static char **broken = NULL; /* array of substring start addresses */ +static int len = 0; /* current size of "broken" */ +/* +** returns pointer to static memory +*/ char ** -brkstring (char *str, char *brksep, char *brkterm) +brkstring(char *str, char *brksep, char *brkterm) { - int i; - char c, *s; + int i; + char c, *s; - /* allocate initial space for pointers on first call */ - if (!broken) { - len = NUMBROKEN; - broken = (char **) mh_xmalloc ((size_t) (len * sizeof(*broken))); - } - - /* - * scan string, replacing separators with zeroes - * and enter start addresses in "broken". - */ - s = str; - - for (i = 0;; i++) { - - /* enlarge pointer array, if necessary */ - if (i >= len) { - len += NUMBROKEN; - if (!(broken = realloc (broken, (size_t) (len * sizeof(*broken))))) - adios (NULL, "unable to realloc array in brkstring"); + /* allocate initial space for pointers on first call */ + if (!broken) { + len = NUMBROKEN; + broken = mh_xcalloc(len, sizeof(*broken)); } - while (brkany (c = *s, brksep)) - *s++ = '\0'; - /* - * we are either at the end of the string, or the - * terminator found has been found, so finish up. - */ - if (!c || brkany (c, brkterm)) { - *s = '\0'; - broken[i] = NULL; - return broken; + ** scan string, replacing separators with zeroes + ** and enter start addresses in "broken". + */ + s = str; + for (i = 0;; i++) { + /* enlarge pointer array, if necessary */ + if (i >= len) { + len += NUMBROKEN; + broken = mh_xrealloc(broken, len * sizeof(*broken)); + } + + /* handle separators */ + while ((c=*s) && brksep && strchr(brksep, c)) { + *s++ = '\0'; + } + + /* + ** we are either at the end of the string, or the + ** terminator found has been found, so finish up. + */ + if (!c || (brkterm && strchr(brkterm, c))) { + *s = '\0'; + broken[i] = NULL; + return broken; + } + + /* set next start addr and walk over word */ + broken[i] = s; + while ((c = *++s)) { + if (brksep && strchr(brksep, c)) { + break; + } + if (brkterm && strchr(brkterm, c)) { + break; + } + } } - - /* set next start addr */ - broken[i] = s; - - while ((c = *++s) && !brkany (c, brksep) && !brkany (c, brkterm)) - ; /* empty body */ - } - - return broken; /* NOT REACHED */ -} - - -/* - * If the character is in the string, - * return 1, else return 0. - */ - -static int -brkany (char c, char *str) -{ - char *s; - - if (str) { - for (s = str; *s; s++) - if (c == *s) - return 1; - } - return 0; + adios(EX_SOFTWARE, "brkstring()", "reached unreachable point"); }