Annotation of 43BSDTahoe/new/nntp/server/parsit.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.