Annotation of coherent/b/bin/unzip/envargs.c, revision 1.1

1.1     ! root        1: /*****************************************************************
        !             2:  | envargs - add default options from environment to command line
        !             3:  |----------------------------------------------------------------
        !             4:  | Author: Bill Davidsen, original 10/13/91, revised 23 Oct 1991.
        !             5:  | This program is in the public domain.
        !             6:  |----------------------------------------------------------------
        !             7:  | Minor program notes:
        !             8:  |  1. Yes, the indirection is a tad complex
        !             9:  |  2. Parenthesis were added where not needed in some cases
        !            10:  |     to make the action of the code less obscure.
        !            11:  |  3. Set tabsize to four to make this pretty
        !            12:  |----------------------------------------------------------------
        !            13:  | UnZip notes 24 May 92 ("v1.4"):
        !            14:  |  1. #include "unzip.h" for prototypes
        !            15:  |  2. changed ch to type char
        !            16:  |  3. added an ifdef to avoid Borland warnings
        !            17:  *****************************************************************/
        !            18: 
        !            19: #include "unzip.h"
        !            20: static int count_args __((char *));
        !            21: static void mem_err __((void));
        !            22: 
        !            23: #if (defined(SCCS) && !defined(lint))  /* causes warnings:  annoying */
        !            24: static char *SCCSid = "@(#)envargs.c   1.3 23 Oct 1991";
        !            25: #endif
        !            26: 
        !            27: void
        !            28: envargs(Pargc, Pargv, envstr)
        !            29: int *Pargc;
        !            30: char ***Pargv;
        !            31: char *envstr;
        !            32: {
        !            33:        char *getenv();
        !            34:        char *envptr;                           /* value returned by getenv */
        !            35:        char *bufptr;                           /* copy of env info */
        !            36:        int argc = 0;                           /* internal arg count */
        !            37:        char ch;                                        /* spare temp value */
        !            38:        char **argv;                            /* internal arg vector */
        !            39:        char **argvect;                         /* copy of vector address */
        !            40: 
        !            41:        /* see if anything in the environment */
        !            42:        envptr = getenv(envstr);
        !            43:        if (envptr == (char *)NULL || *envptr == 0) return;
        !            44: 
        !            45:        /* count the args so we can allocate room for them */
        !            46:        argc = count_args(envptr);
        !            47:        bufptr = (char *)malloc(1+strlen(envptr));
        !            48:        if (bufptr == (char *)NULL) mem_err();
        !            49:        strcpy(bufptr, envptr);
        !            50: 
        !            51:        /* allocate a vector large enough for all args */
        !            52:        argv = (char **)malloc((argc+*Pargc+1)*sizeof(char *));
        !            53:        if (argv == (char **)NULL) mem_err();
        !            54:        argvect = argv;
        !            55: 
        !            56:        /* copy the program name first, that's always true */
        !            57:        *(argv++) = *((*Pargv)++);
        !            58: 
        !            59:        /* copy the environment args next, may be changed */
        !            60:        do {
        !            61:                *(argv++) = bufptr;
        !            62:                /* skip the arg and any trailing blanks */
        !            63:                while (((ch = *bufptr) != '\0') && ch != ' ') ++bufptr;
        !            64:                if (ch == ' ') *(bufptr++) = '\0';
        !            65:                while (((ch = *bufptr) != '\0') && ch == ' ') ++bufptr;
        !            66:        } while (ch);
        !            67: 
        !            68:        /* now save old argc and copy in the old args */
        !            69:        argc += *Pargc;
        !            70:        while (--(*Pargc)) *(argv++) = *((*Pargv)++);
        !            71: 
        !            72:        /* finally, add a NULL after the last arg, like UNIX */
        !            73:        *argv = (char *)NULL;
        !            74: 
        !            75:        /* save the values and return */
        !            76:        *Pargv = argvect;
        !            77:        *Pargc = argc;
        !            78: }
        !            79: 
        !            80: static int
        !            81: count_args(s)
        !            82: char *s;
        !            83: {
        !            84:        int count = 0;
        !            85:        char ch;
        !            86: 
        !            87:        do {
        !            88:                /* count and skip args */
        !            89:                ++count;
        !            90:                while (((ch = *s) != '\0') && ch != ' ') ++s;
        !            91:                while (((ch = *s) != '\0') && ch == ' ') ++s;
        !            92:        } while (ch);
        !            93: 
        !            94:        return count;
        !            95: }
        !            96: 
        !            97: static void
        !            98: mem_err()
        !            99: {
        !           100:        perror("Can't get memory for arguments");
        !           101:        exit(2);
        !           102: }
        !           103: 
        !           104: #ifdef TEST
        !           105: main(argc, argv)
        !           106: int argc;
        !           107: char **argv;
        !           108: {
        !           109:        int i;
        !           110: 
        !           111:        printf("Orig argv: %p\n", argv);
        !           112:        dump_args(argc, argv);
        !           113:        envargs(&argc, &argv, "ENVTEST");
        !           114:        printf(" New argv: %p\n", argv);
        !           115:        dump_args(argc, argv);
        !           116: }
        !           117: 
        !           118: dump_args(argc, argv)
        !           119: int argc;
        !           120: char *argv[];
        !           121: {
        !           122:        int i;
        !           123: 
        !           124:        printf("\nDump %d args:\n", argc);
        !           125:        for (i=0; i<argc; ++i) {
        !           126:                printf("%3d %s\n", i, argv[i]);
        !           127:        }
        !           128: }
        !           129: #endif

unix.superglobalmegacorp.com

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