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 = "-I"; /* rc flag to force non-interactive mode */
5 76193d7c 2003-09-30 devnull int IWS = '\1'; /* inter-word separator in env - not used in plan 9 */
8 76193d7c 2003-09-30 devnull * This file contains functions that depend on rc's syntax. Most
9 76193d7c 2003-09-30 devnull * of the routines extract strings observing rc's escape conventions
14 76193d7c 2003-09-30 devnull * skip a token in single quotes.
16 76193d7c 2003-09-30 devnull static char *
17 76193d7c 2003-09-30 devnull squote(char *cp)
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 == '\'') {
25 76193d7c 2003-09-30 devnull n += chartorune(&r, cp+n);
26 76193d7c 2003-09-30 devnull if(r != '\'')
27 76193d7c 2003-09-30 devnull return(cp);
31 76193d7c 2003-09-30 devnull SYNERR(-1); /* should never occur */
32 76193d7c 2003-09-30 devnull fprint(2, "missing closing '\n");
33 76193d7c 2003-09-30 devnull return 0;
37 76193d7c 2003-09-30 devnull * search a string for characters in a pattern set
38 76193d7c 2003-09-30 devnull * characters in quotes and variable generators are escaped
41 76193d7c 2003-09-30 devnull charin(char *cp, char *pat)
44 76193d7c 2003-09-30 devnull int n, vargen;
46 76193d7c 2003-09-30 devnull vargen = 0;
47 76193d7c 2003-09-30 devnull while(*cp){
48 76193d7c 2003-09-30 devnull n = chartorune(&r, cp);
49 76193d7c 2003-09-30 devnull switch(r){
50 76193d7c 2003-09-30 devnull case '\'': /* skip quoted string */
51 76193d7c 2003-09-30 devnull cp = squote(cp+1); /* n must = 1 */
53 76193d7c 2003-09-30 devnull return 0;
55 76193d7c 2003-09-30 devnull case '$':
56 76193d7c 2003-09-30 devnull if(*(cp+1) == '{')
57 76193d7c 2003-09-30 devnull vargen = 1;
59 76193d7c 2003-09-30 devnull case '}':
60 76193d7c 2003-09-30 devnull if(vargen)
61 76193d7c 2003-09-30 devnull vargen = 0;
62 76193d7c 2003-09-30 devnull else if(utfrune(pat, r))
63 76193d7c 2003-09-30 devnull return cp;
66 76193d7c 2003-09-30 devnull if(vargen == 0 && utfrune(pat, r))
67 76193d7c 2003-09-30 devnull return cp;
72 76193d7c 2003-09-30 devnull if(vargen){
73 76193d7c 2003-09-30 devnull SYNERR(-1);
74 76193d7c 2003-09-30 devnull fprint(2, "missing closing } in pattern generator\n");
76 76193d7c 2003-09-30 devnull return 0;
80 76193d7c 2003-09-30 devnull * extract an escaped token. Possible escape chars are single-quote,
81 76193d7c 2003-09-30 devnull * double-quote,and backslash. Only the first is valid for rc. the
82 76193d7c 2003-09-30 devnull * others are just inserted into the receiving buffer.
85 76193d7c 2003-09-30 devnull expandquote(char *s, Rune r, Bufblock *b)
87 76193d7c 2003-09-30 devnull if (r != '\'') {
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 == '\'') {
95 76193d7c 2003-09-30 devnull if(*s == '\'')
98 76193d7c 2003-09-30 devnull return 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. Only the first is a valid escape for
108 76193d7c 2003-09-30 devnull * rc; the others are just inserted into the receiving buffer.
111 76193d7c 2003-09-30 devnull escapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc)
113 76193d7c 2003-09-30 devnull int c, line;
115 76193d7c 2003-09-30 devnull if(esc != '\'')
116 76193d7c 2003-09-30 devnull return 1;
118 76193d7c 2003-09-30 devnull line = mkinline;
119 76193d7c 2003-09-30 devnull while((c = nextrune(bp, 0)) > 0){
120 76193d7c 2003-09-30 devnull if(c == '\''){
121 76193d7c 2003-09-30 devnull if(preserve)
122 76193d7c 2003-09-30 devnull rinsert(buf, c);
123 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
124 76193d7c 2003-09-30 devnull if (c < 0)
126 76193d7c 2003-09-30 devnull if(c != '\''){
127 76193d7c 2003-09-30 devnull Bungetrune(bp);
128 76193d7c 2003-09-30 devnull return 1;
131 76193d7c 2003-09-30 devnull rinsert(buf, c);
133 76193d7c 2003-09-30 devnull SYNERR(line); fprint(2, "missing closing %c\n", esc);
134 76193d7c 2003-09-30 devnull return 0;
138 76193d7c 2003-09-30 devnull * copy a single-quoted string; s points to char after opening quote
140 76193d7c 2003-09-30 devnull static char *
141 76193d7c 2003-09-30 devnull copysingle(char *s, Bufblock *buf)
145 76193d7c 2003-09-30 devnull while(*s){
146 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
147 76193d7c 2003-09-30 devnull rinsert(buf, r);
148 76193d7c 2003-09-30 devnull if(r == '\'')
151 76193d7c 2003-09-30 devnull return s;
154 76193d7c 2003-09-30 devnull * check for quoted strings. backquotes are handled here; single quotes above.
155 76193d7c 2003-09-30 devnull * s points to char after opening quote, q.
158 76193d7c 2003-09-30 devnull copyq(char *s, Rune q, Bufblock *buf)
160 76193d7c 2003-09-30 devnull if(q == '\'') /* copy quoted string */
161 76193d7c 2003-09-30 devnull return copysingle(s, buf);
163 76193d7c 2003-09-30 devnull if(q != '`') /* not quoted */
164 76193d7c 2003-09-30 devnull return s;
166 76193d7c 2003-09-30 devnull while(*s){ /* copy backquoted string */
167 76193d7c 2003-09-30 devnull s += chartorune(&q, s);
168 76193d7c 2003-09-30 devnull rinsert(buf, q);
169 76193d7c 2003-09-30 devnull if(q == '}')
171 76193d7c 2003-09-30 devnull if(q == '\'')
172 76193d7c 2003-09-30 devnull s = copysingle(s, buf); /* copy quoted string */
174 76193d7c 2003-09-30 devnull return s;