|
|
1.1 root 1: #include "mk.h"
2:
3: /*
4: quoted stuff gets EBIT
5: */
6:
7: static
8: squote(fd, srcp, destp)
9: char **srcp, **destp;
10: {
11: register char *src = *srcp, *dest = *destp;
12:
13: while(*src != '\''){
14: if(*src == 0){
15: char *s;
16:
17: if(s = Frdline(fd)){
18: inline++;
19: *dest++ = '\n'|EBIT;
20: strcpy(src, s);
21: continue;
22: } else {
23: SYNERR(-1); Fprint(2, "missing closing '\n");
24: break;
25: }
26: }
27: *dest++ = *src++|EBIT;
28: }
29: *dest = 0;
30: if(*src)
31: src++;
32: *srcp = src;
33: *destp = dest;
34: }
35:
36: static
37: dquote(fd, src, dest)
38: char **src, **dest;
39: {
40: char *p = *src, *s = *dest;
41: char *t, carry;
42: Symtab *sym;
43:
44: while(*p != '"'){
45: switch(*p)
46: {
47: case 0:
48: if(t = Frdline(fd)){
49: inline++;
50: *s++ = '\n'|EBIT;
51: strcpy(p, t);
52: continue;
53: } else {
54: SYNERR(-1); Fprint(2, "missing closing \"\n");
55: break;
56: }
57: break;
58: case '\\':
59: switch(*++p)
60: {
61: default:
62: *s++ = '\\'|EBIT;
63: case '\\': case '"':
64: case '\'': case '$':
65: *s++ = *p|EBIT;
66: }
67: p++;
68: break;
69: case '$':
70: varsub(&p, &s, EBIT);
71: break;
72: default:
73: *s++ = *p++|EBIT;
74: }
75: }
76: *s = 0;
77: if(*p)
78: p++;
79: *src = p;
80: *dest = s;
81: }
82:
83: quote1(fd, src, dest)
84: char *src, *dest;
85: {
86: char *t;
87:
88: while(*src){
89: switch(*src)
90: {
91: case '\'':
92: src++;
93: squote(fd, &src, &dest);
94: break;
95: case '\\':
96: if(src[1]){
97: *dest++ = *++src | EBIT;
98: src++;
99: } else if(t = Frdline(fd)){
100: inline++;
101: strcpy(src, t);
102: }
103: break;
104: default:
105: *dest++ = *src++;
106: }
107: }
108: *dest = 0;
109: }
110:
111: quote2(fd, src, dest)
112: char *src, *dest;
113: {
114: char *t;
115:
116: while(*src){
117: switch(*src)
118: {
119: case '"':
120: src++;
121: dquote(fd, &src, &dest);
122: break;
123: case '\\':
124: if(src[1]){
125: *dest++ = *++src;
126: src++;
127: } else if(t = Frdline(fd)){
128: inline++;
129: strcpy(src, t);
130: }
131: break;
132: case '$':
133: varsub(&src, &dest, 0);
134: break;
135: default:
136: *dest++ = *src++;
137: }
138: }
139: *dest = 0;
140: }
141:
142: static char *
143: subsub(val, ext, dest, bit)
144: char *val, *ext, *dest;
145: {
146: register char *s;
147: char *a, *b, *c, *d;
148: int na, nb, nc, nd, n;
149: int destsub = 0;
150:
151: /* prepare literals */
152: a = s = ext;
153: for(; *s && (*s != '=') && !PERCENT(*s); s++)
154: ;
155: na = s-a;
156: if(PERCENT(*s)) s++;
157: b = s;
158: for(; *s && (*s != '='); s++)
159: ;
160: nb = s-b;
161: if(*s == '=') s++;
162: c = s;
163: for(; *s && !PERCENT(*s); s++)
164: ;
165: nc = s-c;
166: if(PERCENT(*s)) s++, destsub = 1;
167: d = s;
168: for(; *s; s++)
169: ;
170: nd = s-d;
171: /* break into words, do sub */
172: while(*val){
173: for(s = val; *s && !SEP(*s); s++)
174: ;
175: /* substitute in val..s */
176: if((memcmp(val, a, na) == 0) && (memcmp(s-nb, b, nb) == 0)){
177: #define DEST(s,n) if(n) memcpy(dest,s,n), dest += n
178: DEST(c, nc);
179: n = (s-nb) - (val+na);
180: if(destsub)
181: DEST(val+na, n);
182: DEST(d, nd);
183: } else
184: while(val < s)
185: *dest++ = (*val++&~EBIT)|bit;
186: /* clean up */
187: while(*s && SEP(*s))
188: *dest++ = (*s++&~EBIT)|bit;
189: val = s;
190: }
191: return(dest);
192: }
193:
194: varsub(psrc, pdest, bit)
195: char **psrc, **pdest;
196: {
197: char *t, carry;
198: Symtab *sym;
199: char *src = *psrc, *dest = *pdest;
200: char *v = 0, vc;
201:
202: if(*++src == '{'){
203: for(t = ++src; *src != '}'; src++)
204: if(*src == 0){
205: SYNERR(-1);
206: Fprint(2, "missing '}'\n");
207: Exit();
208: }
209: v = shname(t);
210: if(src == v)
211: v = 0;
212: else {
213: if(*v != ':'){
214: SYNERR(-1);
215: Fprint(2, "bad variable name\n");
216: Exit();
217: }
218: vc = *v;
219: *v = 0;
220: }
221: *src++ = carry = 0;
222: } else {
223: src = shname(t = src);
224: carry = *src;
225: *src = 0;
226: }
227: if(sym = symlook(t, S_VAR, (char *)0)){
228: if(v){
229: char buf[BIGBLOCK]; strcpy(buf, v+1); lex(-1, buf);
230: dest = subsub(sym->value, buf, dest, bit);
231: *v = vc;
232: } else
233: for(t = sym->value; *t; )
234: *dest++ = *t++|bit;
235: }
236: if(carry)
237: *src = carry;
238: *psrc = src;
239: *pdest = dest;
240: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.