X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fbrkstring.c;h=a9446fef299512d5409b596b09a7ae1540bb3c19;hp=1e78b172bb4b8722b7455960177dcb380e78d9dd;hb=f78e7c6e6e616cc4ff2bee8a726365fafef2d8ce;hpb=a485ed478abbd599d8c9aab48934e7a26733ecb1 diff --git a/sbr/brkstring.c b/sbr/brkstring.c index 1e78b17..a9446fe 100644 --- a/sbr/brkstring.c +++ b/sbr/brkstring.c @@ -1,12 +1,13 @@ /* - * 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. - */ - +** 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 @@ -16,14 +17,12 @@ static char **broken = NULL; /* array of substring start addresses */ static int len = 0; /* current size of "broken" */ -/* - * static prototypes - */ -static int brkany (char, char *); - +/* +** 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; @@ -31,61 +30,46 @@ brkstring (char *str, char *brksep, char *brkterm) /* allocate initial space for pointers on first call */ if (!broken) { len = NUMBROKEN; - broken = (char **) mh_xmalloc ((size_t) (len * sizeof(*broken))); + broken = mh_xcalloc(len, sizeof(*broken)); } /* - * scan string, replacing separators with zeroes - * and enter start addresses in "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, (size_t) (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; - } - - /* 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; + /* 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; + } + } } - return 0; + adios(EX_SOFTWARE, "brkstring()", "reached unreachable point"); }