1 76193d7c 2003-09-30 devnull #include "mk.h"
3 76193d7c 2003-09-30 devnull char *termchars = "\"'= \t"; /*used in parse.c to isolate assignment attribute*/
4 76193d7c 2003-09-30 devnull char *shflags = 0;
5 76193d7c 2003-09-30 devnull int IWS = ' '; /* inter-word separator in env */
8 76193d7c 2003-09-30 devnull * This file contains functions that depend on the shell's syntax. Most
9 76193d7c 2003-09-30 devnull * of the routines extract strings observing the shell's escape conventions.
14 76193d7c 2003-09-30 devnull * skip a token in quotes.
16 76193d7c 2003-09-30 devnull static char *
17 76193d7c 2003-09-30 devnull squote(char *cp, int c)
22 76193d7c 2003-09-30 devnull while(*cp){
23 76193d7c 2003-09-30 devnull n = chartorune(&r, cp);
24 76193d7c 2003-09-30 devnull if(r == c)
25 76193d7c 2003-09-30 devnull return cp;
26 76193d7c 2003-09-30 devnull if(r == '\\')
27 76193d7c 2003-09-30 devnull n += chartorune(&r, cp+n);
30 76193d7c 2003-09-30 devnull SYNERR(-1); /* should never occur */
31 76193d7c 2003-09-30 devnull fprint(2, "missing closing '\n");
32 76193d7c 2003-09-30 devnull return 0;
35 76193d7c 2003-09-30 devnull * search a string for unescaped characters in a pattern set
38 76193d7c 2003-09-30 devnull charin(char *cp, char *pat)
41 76193d7c 2003-09-30 devnull int n, vargen;
43 76193d7c 2003-09-30 devnull vargen = 0;
44 76193d7c 2003-09-30 devnull while(*cp){
45 76193d7c 2003-09-30 devnull n = chartorune(&r, cp);
46 76193d7c 2003-09-30 devnull switch(r){
47 76193d7c 2003-09-30 devnull case '\\': /* skip escaped char */
49 76193d7c 2003-09-30 devnull n = chartorune(&r, cp);
51 76193d7c 2003-09-30 devnull case '\'': /* skip quoted string */
52 76193d7c 2003-09-30 devnull case '"':
53 76193d7c 2003-09-30 devnull cp = squote(cp+1, r); /* n must = 1 */
55 76193d7c 2003-09-30 devnull return 0;
57 76193d7c 2003-09-30 devnull case '$':
58 76193d7c 2003-09-30 devnull if(*(cp+1) == '{')
59 76193d7c 2003-09-30 devnull vargen = 1;
61 76193d7c 2003-09-30 devnull case '}':
62 76193d7c 2003-09-30 devnull if(vargen)
63 76193d7c 2003-09-30 devnull vargen = 0;
64 76193d7c 2003-09-30 devnull else if(utfrune(pat, r))
65 76193d7c 2003-09-30 devnull return cp;
68 76193d7c 2003-09-30 devnull if(vargen == 0 && utfrune(pat, r))
69 76193d7c 2003-09-30 devnull return cp;
74 76193d7c 2003-09-30 devnull if(vargen){
75 76193d7c 2003-09-30 devnull SYNERR(-1);
76 76193d7c 2003-09-30 devnull fprint(2, "missing closing } in pattern generator\n");
78 76193d7c 2003-09-30 devnull return 0;
82 76193d7c 2003-09-30 devnull * extract an escaped token. Possible escape chars are single-quote,
83 76193d7c 2003-09-30 devnull * double-quote,and backslash.
86 76193d7c 2003-09-30 devnull expandquote(char *s, Rune esc, Bufblock *b)
90 76193d7c 2003-09-30 devnull if (esc == '\\') {
91 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
92 76193d7c 2003-09-30 devnull rinsert(b, r);
93 76193d7c 2003-09-30 devnull return s;
96 76193d7c 2003-09-30 devnull while(*s){
97 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
98 76193d7c 2003-09-30 devnull if(r == esc)
99 76193d7c 2003-09-30 devnull return s;
100 76193d7c 2003-09-30 devnull if (r == '\\') {
101 76193d7c 2003-09-30 devnull rinsert(b, r);
102 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
104 76193d7c 2003-09-30 devnull rinsert(b, r);
106 76193d7c 2003-09-30 devnull return 0;
110 76193d7c 2003-09-30 devnull * Input an escaped token. Possible escape chars are single-quote,
111 76193d7c 2003-09-30 devnull * double-quote and backslash.
114 76193d7c 2003-09-30 devnull escapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc)
116 76193d7c 2003-09-30 devnull int c, line;
118 76193d7c 2003-09-30 devnull if(esc == '\\') {
119 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
120 76193d7c 2003-09-30 devnull if(c == '\r')
121 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
122 76193d7c 2003-09-30 devnull if (c == '\n')
123 76193d7c 2003-09-30 devnull mkinline++;
124 76193d7c 2003-09-30 devnull rinsert(buf, c);
125 76193d7c 2003-09-30 devnull return 1;
128 76193d7c 2003-09-30 devnull line = mkinline;
129 76193d7c 2003-09-30 devnull while((c = nextrune(bp, 0)) >= 0){
130 76193d7c 2003-09-30 devnull if(c == esc){
131 76193d7c 2003-09-30 devnull if(preserve)
132 76193d7c 2003-09-30 devnull rinsert(buf, c);
133 76193d7c 2003-09-30 devnull return 1;
135 76193d7c 2003-09-30 devnull if(c == '\\') {
136 76193d7c 2003-09-30 devnull rinsert(buf, c);
137 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
138 76193d7c 2003-09-30 devnull if(c == '\r')
139 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
140 76193d7c 2003-09-30 devnull if (c < 0)
142 76193d7c 2003-09-30 devnull if (c == '\n')
143 76193d7c 2003-09-30 devnull mkinline++;
145 76193d7c 2003-09-30 devnull rinsert(buf, c);
147 76193d7c 2003-09-30 devnull SYNERR(line); fprint(2, "missing closing %c\n", esc);
148 76193d7c 2003-09-30 devnull return 0;
152 76193d7c 2003-09-30 devnull * copy a quoted string; s points to char after opening quote
154 76193d7c 2003-09-30 devnull static char *
155 76193d7c 2003-09-30 devnull copysingle(char *s, Rune q, Bufblock *buf)
159 76193d7c 2003-09-30 devnull while(*s){
160 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
161 76193d7c 2003-09-30 devnull rinsert(buf, r);
162 76193d7c 2003-09-30 devnull if(r == q)
165 76193d7c 2003-09-30 devnull return s;
168 76193d7c 2003-09-30 devnull * check for quoted strings. backquotes are handled here; single quotes above.
169 76193d7c 2003-09-30 devnull * s points to char after opening quote, q.
172 76193d7c 2003-09-30 devnull copyq(char *s, Rune q, Bufblock *buf)
174 76193d7c 2003-09-30 devnull if(q == '\'' || q == '"') /* copy quoted string */
175 76193d7c 2003-09-30 devnull return copysingle(s, q, buf);
177 76193d7c 2003-09-30 devnull if(q != '`') /* not quoted */
178 76193d7c 2003-09-30 devnull return s;
180 76193d7c 2003-09-30 devnull while(*s){ /* copy backquoted string */
181 76193d7c 2003-09-30 devnull s += chartorune(&q, s);
182 76193d7c 2003-09-30 devnull rinsert(buf, q);
183 76193d7c 2003-09-30 devnull if(q == '`')
185 76193d7c 2003-09-30 devnull if(q == '\'' || q == '"')
186 76193d7c 2003-09-30 devnull s = copysingle(s, q, buf); /* copy quoted string */
188 76193d7c 2003-09-30 devnull return s;