|
|
1.1 ! root 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: [email protected]; 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.