1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2011 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Eclipse Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.eclipse.org/org/documents/epl-v10.html *
11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * David Korn <dgk@research.att.com> *
19 * Phong Vo <kpv@research.att.com> *
20 * *
21 ***********************************************************************/
22 #pragma prototyped
23 /*
24 * Glenn Fowler
25 * AT&T Bell Laboratories
26 *
27 * string vector argv insertion
28 */
29
30 #include <ast.h>
31 #include <vecargs.h>
32 #include <ctype.h>
33
34 /*
35 * insert the string vector vec between
36 * (*argvp)[0] and (*argvp)[1], sliding (*argvp)[1] ... over
37 * null and blank args are deleted
38 *
39 * vecfree always called
40 *
41 * -1 returned if insertion failed
42 */
43
44 int
vecargs(register char ** vec,int * argcp,char *** argvp)45 vecargs(register char** vec, int* argcp, char*** argvp)
46 {
47 register char** argv;
48 register char** oargv;
49 char** ovec;
50 char* s;
51 int num;
52
53 if (!vec) return(-1);
54 if ((num = (char**)(*(vec - 1)) - vec) > 0)
55 {
56 if (!(argv = newof(0, char*, num + *argcp + 1, 0)))
57 {
58 vecfree(vec, 0);
59 return(-1);
60 }
61 oargv = *argvp;
62 *argvp = argv;
63 *argv++ = *oargv++;
64 ovec = vec;
65 while (s = *argv = *vec++)
66 {
67 while (isspace(*s)) s++;
68 if (*s) argv++;
69 }
70 vecfree(ovec, 1);
71 while (*argv = *oargv++) argv++;
72 *argcp = argv - *argvp;
73 }
74 else vecfree(vec, 0);
75 return(0);
76 }
77