1 76193d7c 2003-09-30 devnull #include "mk.h"
3 76193d7c 2003-09-30 devnull static Word *nextword(char**);
6 76193d7c 2003-09-30 devnull newword(char *s)
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);
17 76193d7c 2003-09-30 devnull stow(char *s)
19 76193d7c 2003-09-30 devnull Word *head, *w, *new;
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)
27 76193d7c 2003-09-30 devnull w->next = new;
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;
34 76193d7c 2003-09-30 devnull if (!head)
35 76193d7c 2003-09-30 devnull head = newword("");
36 76193d7c 2003-09-30 devnull return(head);
40 76193d7c 2003-09-30 devnull wtos(Word *w, int sep)
42 76193d7c 2003-09-30 devnull Bufblock *buf;
43 76193d7c 2003-09-30 devnull char *cp;
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);
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);
59 76193d7c 2003-09-30 devnull wdup(Word *w)
61 76193d7c 2003-09-30 devnull Word *v, *new, *base;
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);
67 76193d7c 2003-09-30 devnull v->next = new;
69 76193d7c 2003-09-30 devnull base = new;
71 76193d7c 2003-09-30 devnull w = w->next;
73 76193d7c 2003-09-30 devnull return base;
77 76193d7c 2003-09-30 devnull delword(Word *w)
81 76193d7c 2003-09-30 devnull while(v = w){
82 76193d7c 2003-09-30 devnull w = w->next;
84 76193d7c 2003-09-30 devnull free(v->s);
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.
93 76193d7c 2003-09-30 devnull static Word*
94 76193d7c 2003-09-30 devnull nextword(char **s)
96 76193d7c 2003-09-30 devnull Bufblock *b;
97 76193d7c 2003-09-30 devnull Word *head, *tail, *w;
99 76193d7c 2003-09-30 devnull char *cp;
100 6c4c5c5b 2007-03-26 devnull int empty;
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 */
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)
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);
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;
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;
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;
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;
157 76193d7c 2003-09-30 devnull default:
158 6c4c5c5b 2007-03-26 devnull empty = 0;
159 76193d7c 2003-09-30 devnull rinsert(b, r);
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);
178 76193d7c 2003-09-30 devnull freebuf(b);
179 76193d7c 2003-09-30 devnull return head;
183 76193d7c 2003-09-30 devnull dumpw(char *s, Word *w)
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');