1 76193d7c 2003-09-30 devnull #include "mk.h"
4 76193d7c 2003-09-30 devnull * This file contains functions that depend on the shell's syntax. Most
5 76193d7c 2003-09-30 devnull * of the routines extract strings observing the shell's escape conventions.
10 76193d7c 2003-09-30 devnull * skip a token in quotes.
12 76193d7c 2003-09-30 devnull static char *
13 76193d7c 2003-09-30 devnull squote(char *cp, int c)
18 76193d7c 2003-09-30 devnull while(*cp){
19 76193d7c 2003-09-30 devnull n = chartorune(&r, cp);
20 76193d7c 2003-09-30 devnull if(r == c)
21 76193d7c 2003-09-30 devnull return cp;
22 76193d7c 2003-09-30 devnull if(r == '\\')
23 76193d7c 2003-09-30 devnull n += chartorune(&r, cp+n);
26 76193d7c 2003-09-30 devnull SYNERR(-1); /* should never occur */
27 76193d7c 2003-09-30 devnull fprint(2, "missing closing '\n");
28 76193d7c 2003-09-30 devnull return 0;
31 76193d7c 2003-09-30 devnull * search a string for unescaped characters in a pattern set
33 9aa1c92f 2005-01-04 devnull static char *
34 9aa1c92f 2005-01-04 devnull shcharin(char *cp, char *pat)
37 76193d7c 2003-09-30 devnull int n, vargen;
39 76193d7c 2003-09-30 devnull vargen = 0;
40 76193d7c 2003-09-30 devnull while(*cp){
41 76193d7c 2003-09-30 devnull n = chartorune(&r, cp);
42 76193d7c 2003-09-30 devnull switch(r){
43 76193d7c 2003-09-30 devnull case '\\': /* skip escaped char */
45 76193d7c 2003-09-30 devnull n = chartorune(&r, cp);
47 76193d7c 2003-09-30 devnull case '\'': /* skip quoted string */
48 76193d7c 2003-09-30 devnull case '"':
49 76193d7c 2003-09-30 devnull cp = squote(cp+1, r); /* n must = 1 */
51 76193d7c 2003-09-30 devnull return 0;
53 76193d7c 2003-09-30 devnull case '$':
54 76193d7c 2003-09-30 devnull if(*(cp+1) == '{')
55 76193d7c 2003-09-30 devnull vargen = 1;
57 76193d7c 2003-09-30 devnull case '}':
58 76193d7c 2003-09-30 devnull if(vargen)
59 76193d7c 2003-09-30 devnull vargen = 0;
60 76193d7c 2003-09-30 devnull else if(utfrune(pat, r))
61 76193d7c 2003-09-30 devnull return cp;
64 76193d7c 2003-09-30 devnull if(vargen == 0 && utfrune(pat, r))
65 76193d7c 2003-09-30 devnull return cp;
70 76193d7c 2003-09-30 devnull if(vargen){
71 76193d7c 2003-09-30 devnull SYNERR(-1);
72 76193d7c 2003-09-30 devnull fprint(2, "missing closing } in pattern generator\n");
74 76193d7c 2003-09-30 devnull return 0;
78 76193d7c 2003-09-30 devnull * extract an escaped token. Possible escape chars are single-quote,
79 76193d7c 2003-09-30 devnull * double-quote,and backslash.
81 9aa1c92f 2005-01-04 devnull static char*
82 9aa1c92f 2005-01-04 devnull shexpandquote(char *s, Rune esc, Bufblock *b)
86 76193d7c 2003-09-30 devnull if (esc == '\\') {
87 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
88 76193d7c 2003-09-30 devnull rinsert(b, r);
89 76193d7c 2003-09-30 devnull return s;
92 76193d7c 2003-09-30 devnull while(*s){
93 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
94 76193d7c 2003-09-30 devnull if(r == esc)
95 76193d7c 2003-09-30 devnull return s;
96 76193d7c 2003-09-30 devnull if (r == '\\') {
97 76193d7c 2003-09-30 devnull rinsert(b, r);
98 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
100 76193d7c 2003-09-30 devnull rinsert(b, r);
102 76193d7c 2003-09-30 devnull return 0;
106 76193d7c 2003-09-30 devnull * Input an escaped token. Possible escape chars are single-quote,
107 76193d7c 2003-09-30 devnull * double-quote and backslash.
109 9aa1c92f 2005-01-04 devnull static int
110 9aa1c92f 2005-01-04 devnull shescapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc)
112 76193d7c 2003-09-30 devnull int c, line;
114 76193d7c 2003-09-30 devnull if(esc == '\\') {
115 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
116 76193d7c 2003-09-30 devnull if(c == '\r')
117 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
118 76193d7c 2003-09-30 devnull if (c == '\n')
119 76193d7c 2003-09-30 devnull mkinline++;
120 76193d7c 2003-09-30 devnull rinsert(buf, c);
121 76193d7c 2003-09-30 devnull return 1;
124 76193d7c 2003-09-30 devnull line = mkinline;
125 76193d7c 2003-09-30 devnull while((c = nextrune(bp, 0)) >= 0){
126 76193d7c 2003-09-30 devnull if(c == esc){
127 76193d7c 2003-09-30 devnull if(preserve)
128 76193d7c 2003-09-30 devnull rinsert(buf, c);
129 76193d7c 2003-09-30 devnull return 1;
131 76193d7c 2003-09-30 devnull if(c == '\\') {
132 76193d7c 2003-09-30 devnull rinsert(buf, c);
133 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
134 76193d7c 2003-09-30 devnull if(c == '\r')
135 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
136 76193d7c 2003-09-30 devnull if (c < 0)
138 76193d7c 2003-09-30 devnull if (c == '\n')
139 76193d7c 2003-09-30 devnull mkinline++;
141 76193d7c 2003-09-30 devnull rinsert(buf, c);
143 76193d7c 2003-09-30 devnull SYNERR(line); fprint(2, "missing closing %c\n", esc);
144 76193d7c 2003-09-30 devnull return 0;
148 76193d7c 2003-09-30 devnull * copy a quoted string; s points to char after opening quote
150 76193d7c 2003-09-30 devnull static char *
151 76193d7c 2003-09-30 devnull copysingle(char *s, Rune q, Bufblock *buf)
155 76193d7c 2003-09-30 devnull while(*s){
156 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
157 76193d7c 2003-09-30 devnull rinsert(buf, r);
158 76193d7c 2003-09-30 devnull if(r == q)
161 76193d7c 2003-09-30 devnull return s;
164 76193d7c 2003-09-30 devnull * check for quoted strings. backquotes are handled here; single quotes above.
165 76193d7c 2003-09-30 devnull * s points to char after opening quote, q.
167 9aa1c92f 2005-01-04 devnull static char *
168 9aa1c92f 2005-01-04 devnull shcopyq(char *s, Rune q, Bufblock *buf)
170 76193d7c 2003-09-30 devnull if(q == '\'' || q == '"') /* copy quoted string */
171 76193d7c 2003-09-30 devnull return copysingle(s, q, buf);
173 76193d7c 2003-09-30 devnull if(q != '`') /* not quoted */
174 76193d7c 2003-09-30 devnull return s;
176 76193d7c 2003-09-30 devnull while(*s){ /* copy backquoted string */
177 76193d7c 2003-09-30 devnull s += chartorune(&q, s);
178 76193d7c 2003-09-30 devnull rinsert(buf, q);
179 76193d7c 2003-09-30 devnull if(q == '`')
181 76193d7c 2003-09-30 devnull if(q == '\'' || q == '"')
182 76193d7c 2003-09-30 devnull s = copysingle(s, q, buf); /* copy quoted string */
184 76193d7c 2003-09-30 devnull return s;
187 9aa1c92f 2005-01-04 devnull static int
188 9aa1c92f 2005-01-04 devnull shmatchname(char *name)
190 9aa1c92f 2005-01-04 devnull USED(name);
192 9aa1c92f 2005-01-04 devnull return 1;
196 9aa1c92f 2005-01-04 devnull Shell shshell = {
198 9aa1c92f 2005-01-04 devnull "\"'= \t", /*used in parse.c to isolate assignment attribute*/
199 9aa1c92f 2005-01-04 devnull ' ', /* inter-word separator in env */
200 9aa1c92f 2005-01-04 devnull shcharin,
201 9aa1c92f 2005-01-04 devnull shexpandquote,
202 9aa1c92f 2005-01-04 devnull shescapetoken,
203 9aa1c92f 2005-01-04 devnull shcopyq,
204 cbeb0b26 2006-04-01 devnull shmatchname