source: trunk/third/nmh/sbr/brkstring.c @ 12455

Revision 12455, 1.8 KB checked in by danw, 26 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r12454, which included commits to RCS files with non-trunk default branches.
Line 
1
2/*
3 * brkstring.c -- (destructively) split a string into
4 *             -- an array of substrings
5 *
6 * $Id: brkstring.c,v 1.1.1.1 1999-02-07 18:14:07 danw Exp $
7 */
8
9#include <h/mh.h>
10
11/* allocate this number of pointers at a time */
12#define NUMBROKEN 256
13
14static char **broken = NULL;    /* array of substring start addresses */
15static int len = 0;             /* current size of "broken"           */
16
17/*
18 * static prototypes
19 */
20static int brkany (char, char *);
21
22
23char **
24brkstring (char *str, char *brksep, char *brkterm)
25{
26    int i;
27    char c, *s;
28
29    /* allocate initial space for pointers on first call */
30    if (!broken) {
31        len = NUMBROKEN;
32        if (!(broken = (char **) malloc ((size_t) (len * sizeof(*broken)))))
33            adios (NULL, "unable to malloc array in brkstring");
34    }
35
36    /*
37     * scan string, replacing separators with zeroes
38     * and enter start addresses in "broken".
39     */
40    s = str;
41
42    for (i = 0;; i++) {
43
44        /* enlarge pointer array, if necessary */
45        if (i >= len) {
46            len += NUMBROKEN;
47            if (!(broken = realloc (broken, (size_t) (len * sizeof(*broken)))))
48                adios (NULL, "unable to realloc array in brkstring");
49        }
50
51        while (brkany (c = *s, brksep))
52            *s++ = '\0';
53
54        /*
55         * we are either at the end of the string, or the
56         * terminator found has been found, so finish up.
57         */
58        if (!c || brkany (c, brkterm)) {
59            *s = '\0';
60            broken[i] = NULL;
61            return broken;
62        }
63
64        /* set next start addr */
65        broken[i] = s;
66
67        while ((c = *++s) && !brkany (c, brksep) && !brkany (c, brkterm))
68            ;   /* empty body */
69    }
70
71    return broken;      /* NOT REACHED */
72}
73
74
75/*
76 * If the character is in the string,
77 * return 1, else return 0.
78 */
79
80static int
81brkany (char c, char *str)
82{
83    char *s;
84
85    if (str) {
86        for (s = str; *s; s++)
87            if (c == *s)
88                return 1;
89    }
90    return 0;
91}
Note: See TracBrowser for help on using the repository browser.