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;
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 */
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)
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 76193d7c 2003-09-30 devnull cp = 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);
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)
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;
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;
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;
149 76193d7c 2003-09-30 devnull default:
150 76193d7c 2003-09-30 devnull rinsert(b, r);
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);
169 76193d7c 2003-09-30 devnull freebuf(b);
170 76193d7c 2003-09-30 devnull return head;
174 76193d7c 2003-09-30 devnull dumpw(char *s, Word *w)
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');