Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull /*
4 76193d7c 2003-09-30 devnull * This file contains functions that depend on rc's syntax. Most
5 76193d7c 2003-09-30 devnull * of the routines extract strings observing rc's escape conventions
6 76193d7c 2003-09-30 devnull */
7 76193d7c 2003-09-30 devnull
8 76193d7c 2003-09-30 devnull
9 76193d7c 2003-09-30 devnull /*
10 76193d7c 2003-09-30 devnull * skip a token in single quotes.
11 76193d7c 2003-09-30 devnull */
12 76193d7c 2003-09-30 devnull static char *
13 76193d7c 2003-09-30 devnull squote(char *cp)
14 76193d7c 2003-09-30 devnull {
15 76193d7c 2003-09-30 devnull Rune r;
16 76193d7c 2003-09-30 devnull int n;
17 76193d7c 2003-09-30 devnull
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 == '\'') {
21 76193d7c 2003-09-30 devnull n += chartorune(&r, cp+n);
22 76193d7c 2003-09-30 devnull if(r != '\'')
23 76193d7c 2003-09-30 devnull return(cp);
24 76193d7c 2003-09-30 devnull }
25 76193d7c 2003-09-30 devnull cp += n;
26 76193d7c 2003-09-30 devnull }
27 76193d7c 2003-09-30 devnull SYNERR(-1); /* should never occur */
28 76193d7c 2003-09-30 devnull fprint(2, "missing closing '\n");
29 76193d7c 2003-09-30 devnull return 0;
30 76193d7c 2003-09-30 devnull }
31 76193d7c 2003-09-30 devnull
32 76193d7c 2003-09-30 devnull /*
33 76193d7c 2003-09-30 devnull * search a string for characters in a pattern set
34 76193d7c 2003-09-30 devnull * characters in quotes and variable generators are escaped
35 76193d7c 2003-09-30 devnull */
36 76193d7c 2003-09-30 devnull char *
37 9aa1c92f 2005-01-04 devnull rccharin(char *cp, char *pat)
38 76193d7c 2003-09-30 devnull {
39 76193d7c 2003-09-30 devnull Rune r;
40 76193d7c 2003-09-30 devnull int n, vargen;
41 76193d7c 2003-09-30 devnull
42 76193d7c 2003-09-30 devnull vargen = 0;
43 76193d7c 2003-09-30 devnull while(*cp){
44 76193d7c 2003-09-30 devnull n = chartorune(&r, cp);
45 76193d7c 2003-09-30 devnull switch(r){
46 76193d7c 2003-09-30 devnull case '\'': /* skip quoted string */
47 76193d7c 2003-09-30 devnull cp = squote(cp+1); /* n must = 1 */
48 76193d7c 2003-09-30 devnull if(!cp)
49 76193d7c 2003-09-30 devnull return 0;
50 76193d7c 2003-09-30 devnull break;
51 76193d7c 2003-09-30 devnull case '$':
52 76193d7c 2003-09-30 devnull if(*(cp+1) == '{')
53 76193d7c 2003-09-30 devnull vargen = 1;
54 76193d7c 2003-09-30 devnull break;
55 76193d7c 2003-09-30 devnull case '}':
56 76193d7c 2003-09-30 devnull if(vargen)
57 76193d7c 2003-09-30 devnull vargen = 0;
58 76193d7c 2003-09-30 devnull else if(utfrune(pat, r))
59 76193d7c 2003-09-30 devnull return cp;
60 76193d7c 2003-09-30 devnull break;
61 76193d7c 2003-09-30 devnull default:
62 76193d7c 2003-09-30 devnull if(vargen == 0 && utfrune(pat, r))
63 76193d7c 2003-09-30 devnull return cp;
64 76193d7c 2003-09-30 devnull break;
65 76193d7c 2003-09-30 devnull }
66 76193d7c 2003-09-30 devnull cp += n;
67 76193d7c 2003-09-30 devnull }
68 76193d7c 2003-09-30 devnull if(vargen){
69 76193d7c 2003-09-30 devnull SYNERR(-1);
70 76193d7c 2003-09-30 devnull fprint(2, "missing closing } in pattern generator\n");
71 76193d7c 2003-09-30 devnull }
72 76193d7c 2003-09-30 devnull return 0;
73 76193d7c 2003-09-30 devnull }
74 76193d7c 2003-09-30 devnull
75 76193d7c 2003-09-30 devnull /*
76 76193d7c 2003-09-30 devnull * extract an escaped token. Possible escape chars are single-quote,
77 76193d7c 2003-09-30 devnull * double-quote,and backslash. Only the first is valid for rc. the
78 76193d7c 2003-09-30 devnull * others are just inserted into the receiving buffer.
79 76193d7c 2003-09-30 devnull */
80 76193d7c 2003-09-30 devnull char*
81 9aa1c92f 2005-01-04 devnull rcexpandquote(char *s, Rune r, Bufblock *b)
82 76193d7c 2003-09-30 devnull {
83 76193d7c 2003-09-30 devnull if (r != '\'') {
84 76193d7c 2003-09-30 devnull rinsert(b, r);
85 76193d7c 2003-09-30 devnull return s;
86 76193d7c 2003-09-30 devnull }
87 76193d7c 2003-09-30 devnull
88 76193d7c 2003-09-30 devnull while(*s){
89 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
90 76193d7c 2003-09-30 devnull if(r == '\'') {
91 76193d7c 2003-09-30 devnull if(*s == '\'')
92 76193d7c 2003-09-30 devnull s++;
93 76193d7c 2003-09-30 devnull else
94 76193d7c 2003-09-30 devnull return s;
95 76193d7c 2003-09-30 devnull }
96 76193d7c 2003-09-30 devnull rinsert(b, r);
97 76193d7c 2003-09-30 devnull }
98 76193d7c 2003-09-30 devnull return 0;
99 76193d7c 2003-09-30 devnull }
100 76193d7c 2003-09-30 devnull
101 76193d7c 2003-09-30 devnull /*
102 76193d7c 2003-09-30 devnull * Input an escaped token. Possible escape chars are single-quote,
103 76193d7c 2003-09-30 devnull * double-quote and backslash. Only the first is a valid escape for
104 76193d7c 2003-09-30 devnull * rc; the others are just inserted into the receiving buffer.
105 76193d7c 2003-09-30 devnull */
106 76193d7c 2003-09-30 devnull int
107 9aa1c92f 2005-01-04 devnull rcescapetoken(Biobuf *bp, Bufblock *buf, int preserve, int esc)
108 76193d7c 2003-09-30 devnull {
109 76193d7c 2003-09-30 devnull int c, line;
110 76193d7c 2003-09-30 devnull
111 76193d7c 2003-09-30 devnull if(esc != '\'')
112 76193d7c 2003-09-30 devnull return 1;
113 76193d7c 2003-09-30 devnull
114 76193d7c 2003-09-30 devnull line = mkinline;
115 76193d7c 2003-09-30 devnull while((c = nextrune(bp, 0)) > 0){
116 76193d7c 2003-09-30 devnull if(c == '\''){
117 76193d7c 2003-09-30 devnull if(preserve)
118 76193d7c 2003-09-30 devnull rinsert(buf, c);
119 76193d7c 2003-09-30 devnull c = Bgetrune(bp);
120 76193d7c 2003-09-30 devnull if (c < 0)
121 76193d7c 2003-09-30 devnull break;
122 76193d7c 2003-09-30 devnull if(c != '\''){
123 76193d7c 2003-09-30 devnull Bungetrune(bp);
124 76193d7c 2003-09-30 devnull return 1;
125 76193d7c 2003-09-30 devnull }
126 76193d7c 2003-09-30 devnull }
127 76193d7c 2003-09-30 devnull rinsert(buf, c);
128 76193d7c 2003-09-30 devnull }
129 76193d7c 2003-09-30 devnull SYNERR(line); fprint(2, "missing closing %c\n", esc);
130 76193d7c 2003-09-30 devnull return 0;
131 76193d7c 2003-09-30 devnull }
132 76193d7c 2003-09-30 devnull
133 76193d7c 2003-09-30 devnull /*
134 76193d7c 2003-09-30 devnull * copy a single-quoted string; s points to char after opening quote
135 76193d7c 2003-09-30 devnull */
136 76193d7c 2003-09-30 devnull static char *
137 76193d7c 2003-09-30 devnull copysingle(char *s, Bufblock *buf)
138 76193d7c 2003-09-30 devnull {
139 76193d7c 2003-09-30 devnull Rune r;
140 76193d7c 2003-09-30 devnull
141 76193d7c 2003-09-30 devnull while(*s){
142 76193d7c 2003-09-30 devnull s += chartorune(&r, s);
143 76193d7c 2003-09-30 devnull rinsert(buf, r);
144 76193d7c 2003-09-30 devnull if(r == '\'')
145 76193d7c 2003-09-30 devnull break;
146 76193d7c 2003-09-30 devnull }
147 76193d7c 2003-09-30 devnull return s;
148 76193d7c 2003-09-30 devnull }
149 76193d7c 2003-09-30 devnull /*
150 76193d7c 2003-09-30 devnull * check for quoted strings. backquotes are handled here; single quotes above.
151 76193d7c 2003-09-30 devnull * s points to char after opening quote, q.
152 76193d7c 2003-09-30 devnull */
153 76193d7c 2003-09-30 devnull char *
154 9aa1c92f 2005-01-04 devnull rccopyq(char *s, Rune q, Bufblock *buf)
155 76193d7c 2003-09-30 devnull {
156 76193d7c 2003-09-30 devnull if(q == '\'') /* copy quoted string */
157 76193d7c 2003-09-30 devnull return copysingle(s, buf);
158 76193d7c 2003-09-30 devnull
159 76193d7c 2003-09-30 devnull if(q != '`') /* not quoted */
160 76193d7c 2003-09-30 devnull return s;
161 76193d7c 2003-09-30 devnull
162 76193d7c 2003-09-30 devnull while(*s){ /* copy backquoted string */
163 76193d7c 2003-09-30 devnull s += chartorune(&q, s);
164 76193d7c 2003-09-30 devnull rinsert(buf, q);
165 76193d7c 2003-09-30 devnull if(q == '}')
166 76193d7c 2003-09-30 devnull break;
167 76193d7c 2003-09-30 devnull if(q == '\'')
168 76193d7c 2003-09-30 devnull s = copysingle(s, buf); /* copy quoted string */
169 76193d7c 2003-09-30 devnull }
170 76193d7c 2003-09-30 devnull return s;
171 76193d7c 2003-09-30 devnull }
172 9aa1c92f 2005-01-04 devnull
173 9aa1c92f 2005-01-04 devnull static int
174 9aa1c92f 2005-01-04 devnull rcmatchname(char *name)
175 9aa1c92f 2005-01-04 devnull {
176 9aa1c92f 2005-01-04 devnull char *p;
177 9aa1c92f 2005-01-04 devnull
178 314f5742 2007-03-26 devnull if((p = strrchr(name, '/')) != nil)
179 9aa1c92f 2005-01-04 devnull name = p+1;
180 9aa1c92f 2005-01-04 devnull if(name[0] == 'r' && name[1] == 'c')
181 9aa1c92f 2005-01-04 devnull return 1;
182 9aa1c92f 2005-01-04 devnull return 0;
183 9aa1c92f 2005-01-04 devnull }
184 9aa1c92f 2005-01-04 devnull
185 9aa1c92f 2005-01-04 devnull Shell rcshell = {
186 9aa1c92f 2005-01-04 devnull "rc",
187 9aa1c92f 2005-01-04 devnull "'= \t",
188 9aa1c92f 2005-01-04 devnull '\1',
189 9aa1c92f 2005-01-04 devnull rccharin,
190 9aa1c92f 2005-01-04 devnull rcexpandquote,
191 9aa1c92f 2005-01-04 devnull rcescapetoken,
192 9aa1c92f 2005-01-04 devnull rccopyq,
193 cbeb0b26 2006-04-01 devnull rcmatchname
194 9aa1c92f 2005-01-04 devnull };