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)
{
/* allocate initial space for pointers on first call */
if (!broken) {
len = NUMBROKEN;
- broken = (char **) mh_xmalloc((size_t) (len * sizeof(*broken)));
+ broken = (char **)mh_xmalloc((size_t)(len * sizeof(*broken)));
}
/*
** 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,
+ (size_t)(len * sizeof(*broken)));
+ }
+
+ /* handle separators */
+ while (strchr(brksep, c = *s)) {
+ *s++ = '\0';
+ }
+
+ /*
+ ** we are either at the end of the string, or the
+ ** terminator found has been found, so finish up.
+ */
+ if (!c || strchr(brkterm, c)) {
+ *s = '\0';
+ broken[i] = NULL;
+ return broken;
+ }
+
+ /* set next start addr and walk over word */
+ broken[i] = s;
+ while ((c=*++s) && !strchr(brksep, c) && !strchr(brkterm, c)) {
+ continue;
+ }
}
- return 0;
+ adios("brkstring()", "reached unreachable point");
}