1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1985-2010 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Common Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.opensource.org/licenses/cpl1.0.txt *
11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
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 load support
28 */
29
30 #include <ast.h>
31 #include <vecargs.h>
32
33 /*
34 * load a string vector from lines in buf
35 * buf may be modified on return
36 *
37 * each line in buf is treated as a new vector element
38 * lines with # as first char are comments
39 * \ as the last char joins consecutive lines
40 *
41 * the vector ends with a 0 sentinel
42 *
43 * the string array pointer is returned
44 */
45
46 char**
vecload(char * buf)47 vecload(char* buf)
48 {
49 register char* s;
50 register int n;
51 register char** p;
52 char** vec;
53
54 vec = 0;
55 n = (*buf == '#') ? -1 : 0;
56 for (s = buf;; s++)
57 {
58 if (*s == '\n')
59 {
60 if (s > buf && *(s - 1) == '\\') *(s - 1) = *s = ' ';
61 else
62 {
63 *s = 0;
64 if (*(s + 1) != '#')
65 {
66 n++;
67 if (!*(s + 1)) break;
68 }
69 }
70 }
71 else if (!*s)
72 {
73 n++;
74 break;
75 }
76 }
77 if (n < 0) n = 0;
78 if (p = newof(0, char*, n + 3, 0))
79 {
80 *p++ = s = buf;
81 vec = ++p;
82 if (n > 0) for (;;)
83 {
84 if (*s != '#')
85 {
86 *p++ = s;
87 if (--n <= 0) break;
88 }
89 while (*s) s++;
90 s++;
91 }
92 *p = 0;
93 *(vec - 1) = (char*)p;
94 }
95 return(vec);
96 }
97