Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull static Word *nextword(char**);
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull Word*
6 76193d7c 2003-09-30 devnull newword(char *s)
7 76193d7c 2003-09-30 devnull {
8 76193d7c 2003-09-30 devnull Word *w;
9 76193d7c 2003-09-30 devnull
10 76193d7c 2003-09-30 devnull w = (Word *)Malloc(sizeof(Word));
11 76193d7c 2003-09-30 devnull w->s = strdup(s);
12 76193d7c 2003-09-30 devnull w->next = 0;
13 76193d7c 2003-09-30 devnull return(w);
14 76193d7c 2003-09-30 devnull }
15 76193d7c 2003-09-30 devnull
16 76193d7c 2003-09-30 devnull Word *
17 76193d7c 2003-09-30 devnull stow(char *s)
18 76193d7c 2003-09-30 devnull {
19 76193d7c 2003-09-30 devnull Word *head, *w, *new;
20 76193d7c 2003-09-30 devnull
21 76193d7c 2003-09-30 devnull w = head = 0;
22 76193d7c 2003-09-30 devnull while(*s){
23 76193d7c 2003-09-30 devnull new = nextword(&s);
24 76193d7c 2003-09-30 devnull if(new == 0)
25 76193d7c 2003-09-30 devnull break;
26 76193d7c 2003-09-30 devnull if (w)
27 76193d7c 2003-09-30 devnull w->next = new;
28 76193d7c 2003-09-30 devnull else
29 76193d7c 2003-09-30 devnull head = w = new;
30 76193d7c 2003-09-30 devnull while(w->next)
31 76193d7c 2003-09-30 devnull w = w->next;
32 fa325e9b 2020-01-10 cross
33 76193d7c 2003-09-30 devnull }
34 76193d7c 2003-09-30 devnull if (!head)
35 76193d7c 2003-09-30 devnull head = newword("");
36 76193d7c 2003-09-30 devnull return(head);
37 76193d7c 2003-09-30 devnull }
38 76193d7c 2003-09-30 devnull
39 76193d7c 2003-09-30 devnull char *
40 76193d7c 2003-09-30 devnull wtos(Word *w, int sep)
41 76193d7c 2003-09-30 devnull {
42 76193d7c 2003-09-30 devnull Bufblock *buf;
43 76193d7c 2003-09-30 devnull char *cp;
44 76193d7c 2003-09-30 devnull
45 76193d7c 2003-09-30 devnull buf = newbuf();
46 76193d7c 2003-09-30 devnull for(; w; w = w->next){
47 76193d7c 2003-09-30 devnull for(cp = w->s; *cp; cp++)
48 76193d7c 2003-09-30 devnull insert(buf, *cp);
49 76193d7c 2003-09-30 devnull if(w->next)
50 76193d7c 2003-09-30 devnull insert(buf, sep);
51 76193d7c 2003-09-30 devnull }
52 76193d7c 2003-09-30 devnull insert(buf, 0);
53 76193d7c 2003-09-30 devnull cp = strdup(buf->start);
54 76193d7c 2003-09-30 devnull freebuf(buf);
55 76193d7c 2003-09-30 devnull return(cp);
56 76193d7c 2003-09-30 devnull }
57 76193d7c 2003-09-30 devnull
58 76193d7c 2003-09-30 devnull Word*
59 76193d7c 2003-09-30 devnull wdup(Word *w)
60 76193d7c 2003-09-30 devnull {
61 76193d7c 2003-09-30 devnull Word *v, *new, *base;
62 76193d7c 2003-09-30 devnull
63 76193d7c 2003-09-30 devnull v = base = 0;
64 76193d7c 2003-09-30 devnull while(w){
65 76193d7c 2003-09-30 devnull new = newword(w->s);
66 76193d7c 2003-09-30 devnull if(v)
67 76193d7c 2003-09-30 devnull v->next = new;
68 76193d7c 2003-09-30 devnull else
69 76193d7c 2003-09-30 devnull base = new;
70 76193d7c 2003-09-30 devnull v = new;
71 76193d7c 2003-09-30 devnull w = w->next;
72 76193d7c 2003-09-30 devnull }
73 76193d7c 2003-09-30 devnull return base;
74 76193d7c 2003-09-30 devnull }
75 76193d7c 2003-09-30 devnull
76 76193d7c 2003-09-30 devnull void
77 76193d7c 2003-09-30 devnull delword(Word *w)
78 76193d7c 2003-09-30 devnull {
79 76193d7c 2003-09-30 devnull Word *v;
80 76193d7c 2003-09-30 devnull
81 76193d7c 2003-09-30 devnull while(v = w){
82 76193d7c 2003-09-30 devnull w = w->next;
83 76193d7c 2003-09-30 devnull if(v->s)
84 76193d7c 2003-09-30 devnull free(v->s);
85 76193d7c 2003-09-30 devnull free(v);
86 76193d7c 2003-09-30 devnull }
87 76193d7c 2003-09-30 devnull }
88 76193d7c 2003-09-30 devnull
89 76193d7c 2003-09-30 devnull /*
90 76193d7c 2003-09-30 devnull * break out a word from a string handling quotes, executions,
91 76193d7c 2003-09-30 devnull * and variable expansions.
92 76193d7c 2003-09-30 devnull */
93 76193d7c 2003-09-30 devnull static Word*
94 76193d7c 2003-09-30 devnull nextword(char **s)
95 76193d7c 2003-09-30 devnull {
96 76193d7c 2003-09-30 devnull Bufblock *b;
97 76193d7c 2003-09-30 devnull Word *head, *tail, *w;
98 76193d7c 2003-09-30 devnull Rune r;
99 76193d7c 2003-09-30 devnull char *cp;
100 6c4c5c5b 2007-03-26 devnull int empty;
101 76193d7c 2003-09-30 devnull
102 76193d7c 2003-09-30 devnull cp = *s;
103 76193d7c 2003-09-30 devnull b = newbuf();
104 6c4c5c5b 2007-03-26 devnull restart:
105 76193d7c 2003-09-30 devnull head = tail = 0;
106 76193d7c 2003-09-30 devnull while(*cp == ' ' || *cp == '\t') /* leading white space */
107 76193d7c 2003-09-30 devnull cp++;
108 6c4c5c5b 2007-03-26 devnull empty = 1;
109 76193d7c 2003-09-30 devnull while(*cp){
110 76193d7c 2003-09-30 devnull cp += chartorune(&r, cp);
111 76193d7c 2003-09-30 devnull switch(r)
112 76193d7c 2003-09-30 devnull {
113 76193d7c 2003-09-30 devnull case ' ':
114 76193d7c 2003-09-30 devnull case '\t':
115 76193d7c 2003-09-30 devnull case '\n':
116 76193d7c 2003-09-30 devnull goto out;
117 76193d7c 2003-09-30 devnull case '\\':
118 76193d7c 2003-09-30 devnull case '\'':
119 76193d7c 2003-09-30 devnull case '"':
120 6c4c5c5b 2007-03-26 devnull empty = 0;
121 9aa1c92f 2005-01-04 devnull cp = shellt->expandquote(cp, r, b);
122 76193d7c 2003-09-30 devnull if(cp == 0){
123 76193d7c 2003-09-30 devnull fprint(2, "missing closing quote: %s\n", *s);
124 76193d7c 2003-09-30 devnull Exit();
125 76193d7c 2003-09-30 devnull }
126 76193d7c 2003-09-30 devnull break;
127 76193d7c 2003-09-30 devnull case '$':
128 76193d7c 2003-09-30 devnull w = varsub(&cp);
129 6c4c5c5b 2007-03-26 devnull if(w == 0){
130 6c4c5c5b 2007-03-26 devnull if(empty)
131 6c4c5c5b 2007-03-26 devnull goto restart;
132 76193d7c 2003-09-30 devnull break;
133 6c4c5c5b 2007-03-26 devnull }
134 6c4c5c5b 2007-03-26 devnull empty = 0;
135 76193d7c 2003-09-30 devnull if(b->current != b->start){
136 76193d7c 2003-09-30 devnull bufcpy(b, w->s, strlen(w->s));
137 76193d7c 2003-09-30 devnull insert(b, 0);
138 76193d7c 2003-09-30 devnull free(w->s);
139 76193d7c 2003-09-30 devnull w->s = strdup(b->start);
140 76193d7c 2003-09-30 devnull b->current = b->start;
141 76193d7c 2003-09-30 devnull }
142 76193d7c 2003-09-30 devnull if(head){
143 76193d7c 2003-09-30 devnull bufcpy(b, tail->s, strlen(tail->s));
144 76193d7c 2003-09-30 devnull bufcpy(b, w->s, strlen(w->s));
145 76193d7c 2003-09-30 devnull insert(b, 0);
146 76193d7c 2003-09-30 devnull free(tail->s);
147 76193d7c 2003-09-30 devnull tail->s = strdup(b->start);
148 76193d7c 2003-09-30 devnull tail->next = w->next;
149 76193d7c 2003-09-30 devnull free(w->s);
150 76193d7c 2003-09-30 devnull free(w);
151 76193d7c 2003-09-30 devnull b->current = b->start;
152 76193d7c 2003-09-30 devnull } else
153 76193d7c 2003-09-30 devnull tail = head = w;
154 76193d7c 2003-09-30 devnull while(tail->next)
155 76193d7c 2003-09-30 devnull tail = tail->next;
156 76193d7c 2003-09-30 devnull break;
157 76193d7c 2003-09-30 devnull default:
158 6c4c5c5b 2007-03-26 devnull empty = 0;
159 76193d7c 2003-09-30 devnull rinsert(b, r);
160 76193d7c 2003-09-30 devnull break;
161 76193d7c 2003-09-30 devnull }
162 76193d7c 2003-09-30 devnull }
163 76193d7c 2003-09-30 devnull out:
164 76193d7c 2003-09-30 devnull *s = cp;
165 76193d7c 2003-09-30 devnull if(b->current != b->start){
166 76193d7c 2003-09-30 devnull if(head){
167 76193d7c 2003-09-30 devnull cp = b->current;
168 76193d7c 2003-09-30 devnull bufcpy(b, tail->s, strlen(tail->s));
169 76193d7c 2003-09-30 devnull bufcpy(b, b->start, cp-b->start);
170 76193d7c 2003-09-30 devnull insert(b, 0);
171 76193d7c 2003-09-30 devnull free(tail->s);
172 76193d7c 2003-09-30 devnull tail->s = strdup(cp);
173 76193d7c 2003-09-30 devnull } else {
174 76193d7c 2003-09-30 devnull insert(b, 0);
175 76193d7c 2003-09-30 devnull head = newword(b->start);
176 76193d7c 2003-09-30 devnull }
177 76193d7c 2003-09-30 devnull }
178 76193d7c 2003-09-30 devnull freebuf(b);
179 76193d7c 2003-09-30 devnull return head;
180 76193d7c 2003-09-30 devnull }
181 76193d7c 2003-09-30 devnull
182 76193d7c 2003-09-30 devnull void
183 76193d7c 2003-09-30 devnull dumpw(char *s, Word *w)
184 76193d7c 2003-09-30 devnull {
185 76193d7c 2003-09-30 devnull Bprint(&bout, "%s", s);
186 76193d7c 2003-09-30 devnull for(; w; w = w->next)
187 76193d7c 2003-09-30 devnull Bprint(&bout, " '%s'", w->s);
188 76193d7c 2003-09-30 devnull Bputc(&bout, '\n');
189 76193d7c 2003-09-30 devnull }