X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=sbr%2Fbrkstring.c;h=a9446fef299512d5409b596b09a7ae1540bb3c19;hp=4e71ab544ce6b6c1f2281c4c1880750bb9579cac;hb=f78e7c6e6e616cc4ff2bee8a726365fafef2d8ce;hpb=714b5c530ece27ea2835a313013f5b770163403c diff --git a/sbr/brkstring.c b/sbr/brkstring.c index 4e71ab5..a9446fe 100644 --- a/sbr/brkstring.c +++ b/sbr/brkstring.c @@ -7,6 +7,7 @@ ** complete copyright information. */ +#include #include #include @@ -16,12 +17,10 @@ static char **broken = NULL; /* array of substring start addresses */ static int len = 0; /* current size of "broken" */ + /* -** static prototypes +** returns pointer to static memory */ -static int brkany(char, char *); - - char ** brkstring(char *str, char *brksep, char *brkterm) { @@ -31,7 +30,7 @@ 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)); } /* @@ -39,53 +38,38 @@ brkstring(char *str, char *brksep, char *brkterm) ** 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"); }