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 76193d7c 2003-09-30 devnull
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 76193d7c 2003-09-30 devnull
101 76193d7c 2003-09-30 devnull cp = *s;
102 76193d7c 2003-09-30 devnull b = newbuf();
103 76193d7c 2003-09-30 devnull head = tail = 0;
104 76193d7c 2003-09-30 devnull while(*cp == ' ' || *cp == '\t') /* leading white space */
105 76193d7c 2003-09-30 devnull cp++;
106 76193d7c 2003-09-30 devnull while(*cp){
107 76193d7c 2003-09-30 devnull cp += chartorune(&r, cp);
108 76193d7c 2003-09-30 devnull switch(r)
109 76193d7c 2003-09-30 devnull {
110 76193d7c 2003-09-30 devnull case ' ':
111 76193d7c 2003-09-30 devnull case '\t':
112 76193d7c 2003-09-30 devnull case '\n':
113 76193d7c 2003-09-30 devnull goto out;
114 76193d7c 2003-09-30 devnull case '\\':
115 76193d7c 2003-09-30 devnull case '\'':
116 76193d7c 2003-09-30 devnull case '"':
117 9aa1c92f 2005-01-04 devnull cp = shellt->expandquote(cp, r, b);
118 76193d7c 2003-09-30 devnull if(cp == 0){
119 76193d7c 2003-09-30 devnull fprint(2, "missing closing quote: %s\n", *s);
120 76193d7c 2003-09-30 devnull Exit();
121 76193d7c 2003-09-30 devnull }
122 76193d7c 2003-09-30 devnull break;
123 76193d7c 2003-09-30 devnull case '$':
124 76193d7c 2003-09-30 devnull w = varsub(&cp);
125 76193d7c 2003-09-30 devnull if(w == 0)
126 76193d7c 2003-09-30 devnull break;
127 76193d7c 2003-09-30 devnull if(b->current != b->start){
128 76193d7c 2003-09-30 devnull bufcpy(b, w->s, strlen(w->s));
129 76193d7c 2003-09-30 devnull insert(b, 0);
130 76193d7c 2003-09-30 devnull free(w->s);
131 76193d7c 2003-09-30 devnull w->s = strdup(b->start);
132 76193d7c 2003-09-30 devnull b->current = b->start;
133 76193d7c 2003-09-30 devnull }
134 76193d7c 2003-09-30 devnull if(head){
135 76193d7c 2003-09-30 devnull bufcpy(b, tail->s, strlen(tail->s));
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(tail->s);
139 76193d7c 2003-09-30 devnull tail->s = strdup(b->start);
140 76193d7c 2003-09-30 devnull tail->next = w->next;
141 76193d7c 2003-09-30 devnull free(w->s);
142 76193d7c 2003-09-30 devnull free(w);
143 76193d7c 2003-09-30 devnull b->current = b->start;
144 76193d7c 2003-09-30 devnull } else
145 76193d7c 2003-09-30 devnull tail = head = w;
146 76193d7c 2003-09-30 devnull while(tail->next)
147 76193d7c 2003-09-30 devnull tail = tail->next;
148 76193d7c 2003-09-30 devnull break;
149 76193d7c 2003-09-30 devnull default:
150 76193d7c 2003-09-30 devnull rinsert(b, r);
151 76193d7c 2003-09-30 devnull break;
152 76193d7c 2003-09-30 devnull }
153 76193d7c 2003-09-30 devnull }
154 76193d7c 2003-09-30 devnull out:
155 76193d7c 2003-09-30 devnull *s = cp;
156 76193d7c 2003-09-30 devnull if(b->current != b->start){
157 76193d7c 2003-09-30 devnull if(head){
158 76193d7c 2003-09-30 devnull cp = b->current;
159 76193d7c 2003-09-30 devnull bufcpy(b, tail->s, strlen(tail->s));
160 76193d7c 2003-09-30 devnull bufcpy(b, b->start, cp-b->start);
161 76193d7c 2003-09-30 devnull insert(b, 0);
162 76193d7c 2003-09-30 devnull free(tail->s);
163 76193d7c 2003-09-30 devnull tail->s = strdup(cp);
164 76193d7c 2003-09-30 devnull } else {
165 76193d7c 2003-09-30 devnull insert(b, 0);
166 76193d7c 2003-09-30 devnull head = newword(b->start);
167 76193d7c 2003-09-30 devnull }
168 76193d7c 2003-09-30 devnull }
169 76193d7c 2003-09-30 devnull freebuf(b);
170 76193d7c 2003-09-30 devnull return head;
171 76193d7c 2003-09-30 devnull }
172 76193d7c 2003-09-30 devnull
173 76193d7c 2003-09-30 devnull void
174 76193d7c 2003-09-30 devnull dumpw(char *s, Word *w)
175 76193d7c 2003-09-30 devnull {
176 76193d7c 2003-09-30 devnull Bprint(&bout, "%s", s);
177 76193d7c 2003-09-30 devnull for(; w; w = w->next)
178 76193d7c 2003-09-30 devnull Bprint(&bout, " '%s'", w->s);
179 76193d7c 2003-09-30 devnull Bputc(&bout, '\n');
180 76193d7c 2003-09-30 devnull }