|
|
1.1 root 1: /*
2: * libc/gen/_addargs.c
3: * Add environmental args to argc/argv.
4: */
5:
6: #include <stdio.h>
7: #include <string.h>
8: #include <ctype.h>
9:
10: #define NBUF 128
11:
12: /* External. */
13: extern char *getenv();
14: extern char *malloc();
15:
16: /* Forward. */
17: static char **copyargs();
18: static int getargs();
19: static char *scanarg();
20:
21: /*
22: * Add "nameHEAD" and "nameTAIL" to the supplied argc/argv.
23: * Return -1 on failure, 0 if argc/argv unchanged, 1 otherwise.
24: */
25: int
26: _addargs(name, argcp, argvp) char *name; int *argcp; char ***argvp;
27: {
28: register char **cpp, **oargv;
29: register int oargc, hargc, targc;
30: char *hp, *tp;
31:
32: if ((hargc = getargs(name, "HEAD", &hp)) == -1)
33: return -1;
34: if ((targc = getargs(name, "TAIL", &tp)) == -1)
35: return -1;
36: if (hargc == 0 && targc == 0)
37: return 0;
38: oargc = *argcp;
39: oargv = *argvp;
40: if ((cpp = (char **)malloc((hargc + oargc + targc + 1) * sizeof(char *))) == NULL)
41: return -1;
42: *argcp = hargc + oargc + targc;
43: *argvp = cpp;
44: *cpp++ = *oargv++; /* old argv[0] */
45: if (hargc != 0)
46: cpp = copyargs(cpp, hp); /* HEAD args */
47: while (*oargv != NULL)
48: *cpp++ = *oargv++; /* remainder of old argv[] */
49: if (targc != 0)
50: cpp = copyargs(cpp, tp); /* TAIL args */
51: *cpp = NULL; /* NULL-terminate */
52: return 1;
53: }
54:
55: /*
56: * NUL-terminate each whitespace-separated arg in p
57: * and store a pointer to each arg in cpp.
58: * Return the updated cpp.
59: */
60: static
61: char **
62: copyargs(cpp, p) register char **cpp; register char *p;
63: {
64: register char c;
65:
66: while ((c = *p) != '\0') {
67: if (isspace(c))
68: *p++ = '\0';
69: else if (c == '\'' || c == '"') {
70: *cpp++ = p + 1;
71: p = scanarg(p);
72: if (*(p-1) == c)
73: *(p-1) = '\0';
74: } else {
75: *cpp++ = p++;
76: p = scanarg(p);
77: }
78: }
79: return cpp;
80: }
81:
82: /*
83: * Look for environmental variable "<name><ext>".
84: * If found, malloc a copy and store its address through cpp.
85: * Return -1 if malloc fails,
86: * else return count of whitespace-separated args in result.
87: */
88: static
89: int
90: getargs(name, ext, cpp) char *name, *ext; char **cpp;
91: {
92: register char *cp, *p;
93: register int count;
94: char buf[NBUF];
95:
96: if ((cp = getenv(strcat(strcpy(buf, name), ext))) == NULL)
97: return 0;
98: if ((p = malloc(strlen(cp) + 1)) == NULL)
99: return -1;
100: *cpp = strcpy(p, cp);
101: count = 0;
102: while (*p != '\0') {
103: if (!isspace(*p)) {
104: ++count;
105: p = scanarg(p);
106: } else
107: ++p;
108: }
109: return count;
110: }
111:
112: /*
113: * Scan arg p to next whitespace or NUL.
114: * Ignore whitespace within args quoted by ' ' or " ".
115: * Return pointer to following character.
116: */
117: static
118: char *
119: scanarg(p) register char *p;
120: {
121: register char c;
122:
123: if ((c = *p) == '\'' || c == '"') {
124: ++p;
125: while (*p != '\0' && *p++ != c)
126: ;
127: } else
128: while (!isspace(*p) && *p != '\0')
129: ++p;
130: return p;
131: }
132:
133: /* end of _addargs.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.