1: #ifndef lint
2: static char *osccsid = "@(#)parsit.c 1.1 (Berkeley) 12/5/84";
3: static char *sccsid = "@(#)parsit.c 1.2 (Berkeley) 10/15/87";
4: #endif
5:
6: /*
7: * Parse a string of words separated by spaces into an
8: * array of pointers to characters, just like good ol' argv[]
9: * and argc.
10: *
11: * Usage:
12: *
13: * char line[132];
14: * char **argv;
15: * int argc;
16: *
17: * argv = (char **) NULL;
18: * argc = parsit(line, &argv);
19: *
20: * returns the number of words parsed in argc. argv[argc] will
21: * be (char *) NULL to indicate end of list, if you're not
22: * happy with just knowing how many words you have.
23: *
24: * Note that setting argv = (char **) NULL is only done the first
25: * time the routine is called with a new "argv" -- it tells
26: * parsit that "argv" is a new array, and parsit shouldn't free
27: * up the elements (as it would do if it were an old array).
28: *
29: * Phil Lapsley
30: * College of Engineering
31: * University of California, Berkeley
32: * (ARPA: phil@Berkeley.ARPA; UUCP: ...!ucbvax!phil)
33: */
34:
35: #include <stdio.h>
36:
37: extern char *malloc(), *strcpy();
38:
39: parsit(line, array)
40: char *line;
41: char ***array;
42: {
43: char **argv;
44: char word[132];
45: char *linecp;
46: int i, j, num_words;
47:
48: argv = *array;
49: if (argv != (char **) NULL) { /* Check to see if we should */
50: for (i = 0; argv[i] != (char *) NULL; i++) /* free */
51: free(argv[i]); /* the old array */
52: free((char *) argv); /* and then free the ptr itself */
53: }
54:
55: linecp = line;
56: num_words = 0;
57: while (1) { /* count words in input */
58: for (; *linecp == ' ' || *linecp == '\t'; ++linecp)
59: ;
60: if (*linecp == '\0')
61: break;
62:
63: for (; *linecp != ' ' && *linecp != '\t' && *linecp != '\0'; ++linecp)
64: ;
65: ++num_words;
66: if (*linecp == '\0')
67: break;
68: }
69:
70: /* Then malloc enough for that many words plus 1 (for null) */
71:
72: if ((argv = (char **) malloc((num_words + 1) * sizeof(char *))) ==
73: (char **) NULL) {
74: fprintf(stderr, "parsit: malloc out of space!\n");
75: return(0);
76: }
77:
78: j = i = 0;
79: while (1) { /* Now build the list of words */
80: for (; *line == ' ' || *line == '\t'; ++line)
81: ;
82: if (*line == '\0')
83: break;
84:
85: i = 0;
86: for (; *line != ' ' && *line != '\t' && *line != '\0'; ++line)
87: word[i++] = *line;
88: word[i] = '\0';
89: argv[j] = malloc(strlen(word) + 1);
90: if (argv[j] == (char *) NULL) {
91: fprintf(stderr, "parsit: malloc out of space!\n");
92: return(0);
93: }
94:
95: (void) strcpy(argv[j], word);
96: ++j;
97: if (*line == '\0')
98: break;
99: }
100: argv[j] = (char *) NULL; /* remember null at end of list */
101: *array = argv;
102: return(j);
103: }
Defined functions
Defined variables
sccsid
defined in line
3;
never used