source: buchla-68k/ram/cminit.c@ 4810254

Last change on this file since 4810254 was fa38804, checked in by Thomas Lopatic <thomas@…>, 7 years ago

Removed form-feed comments.

  • Property mode set to 100644
File size: 6.1 KB
Line 
1/*
2 =============================================================================
3 cminit.c -- C-Meta parser functions
4 Version 5 -- 1987-07-10 -- D.N. Lynx Crowe
5
6 Some parser functions in C, modelled after HyperMeta(tm).
7 Designed for, but not dedicated to, LR(k), top-down, recursive parsing.
8 =============================================================================
9*/
10
11#include "ram.h"
12
13#define CM_DBLK if (!QQanch) while (*QQip EQ ' ') ++QQip
14
15int16_t QQsw; /* parser result switch */
16int16_t QQanch; /* parser anchored match switch */
17
18int8_t *QQin; /* parser initial input pointer */
19int8_t *QQip; /* parser current input pointer */
20int8_t *QQop; /* parser string output pointer */
21
22int32_t QQnum; /* parser numeric result */
23int16_t QQlnum; /* parser list element number result */
24int8_t QQdig; /* parser digit result */
25int8_t QQchr; /* parser character result */
26
27int8_t QQstr[CM_MXSTR]; /* parser string result */
28
29/*
30 =============================================================================
31 CMinit(ip) -- initialize the parser to work on the string at 'ip'.
32 =============================================================================
33*/
34
35void CMinit(int8_t *ip)
36{
37 register int16_t i;
38 register int8_t *t;
39
40 QQip = ip;
41 QQin = ip;
42 QQsw = TRUE;
43 QQanch = FALSE;
44 QQdig = '?';
45 QQchr = '?';
46 QQnum = 0;
47 QQop = QQstr;
48 t = QQstr;
49
50 for (i = 0; i < CM_MXSTR; i++)
51 *t++ = '\0';
52}
53
54/*
55 =============================================================================
56 CMchr(c) -- attempt to match character 'c' in the input.
57 =============================================================================
58*/
59
60int16_t CMchr(int8_t c)
61{
62 CM_DBLK;
63
64 if (c NE *QQip)
65 return(QQsw = FALSE);
66
67 QQchr = *QQip++;
68 return(QQsw = TRUE);
69}
70
71/*
72 =============================================================================
73 CMuchr(c) -- attempt to match character 'c' in the input, ignoring case.
74 =============================================================================
75*/
76
77int16_t CMuchr(int8_t c)
78{
79 register int8_t t;
80
81 CM_DBLK;
82
83 t = *QQip;
84
85 if (isascii(c))
86 if (isupper(c))
87 c = _tolower(c);
88
89 if (isascii(t))
90 if (isupper(t))
91 t = _tolower(t);
92
93 if (c NE t)
94 return(QQsw = FALSE);
95
96 QQchr = *QQip++;
97 return(QQsw = TRUE);
98}
99
100/*
101 =============================================================================
102 CMstr(s) -- attempt to match string at 's' in the input.
103 =============================================================================
104*/
105
106int16_t CMstr(int8_t *s)
107{
108 register int8_t *t;
109 int8_t *q;
110
111 CM_DBLK;
112
113 t = QQip;
114 q = s;
115
116 while (*s) {
117
118 if (*t++ NE *s++)
119 return(QQsw = FALSE);
120 }
121
122 QQop = QQstr;
123
124 while (*QQop++ = *q++) ;
125
126 QQip = t;
127 return(QQsw = TRUE);
128}
129
130/*
131 =============================================================================
132 CMustr(s) -- attempt to match string 's' in the input, ignoring case.
133 =============================================================================
134*/
135
136int16_t CMustr(int8_t *s)
137{
138 register int8_t *t, t1, t2;
139 int8_t *q;
140
141 CM_DBLK;
142
143 t = QQip;
144 q = s;
145
146 while (*s) {
147
148 t1 = *t++;
149 t2 = *s++;
150
151 if (isascii(t1))
152 if (isupper(t1))
153 t1 = _tolower(t1);
154
155 if (isascii(t2))
156 if (isupper(t2))
157 t2 = _tolower(t2);
158
159 if (t1 NE t2)
160 return(QQsw = FALSE);
161 }
162
163 QQop = QQstr;
164
165 while (*QQop++ = *q++) ;
166
167 QQip = t;
168 return(QQsw = TRUE);
169}
170
171/*
172 =============================================================================
173 CMlong() -- attempt to parse a digit string in the input as a long.
174 =============================================================================
175*/
176
177int16_t CMlong(void)
178{
179 register int8_t *p;
180 register int32_t n;
181 register int8_t c;
182
183 CM_DBLK;
184
185 p = QQip;
186 n = 0L;
187 c = *p++;
188
189 if (!isascii(c))
190 return(QQsw = FALSE);
191
192 if (!isdigit(c))
193 return(QQsw = FALSE);
194
195 n = c - '0';
196
197 while (c = *p) {
198
199 if (!isascii(c))
200 break;
201
202 if (!isdigit(c))
203 break;
204
205 n = (n * 10) + (c - '0');
206 ++p;
207 }
208
209 QQip = p;
210 QQnum = n;
211 return(QQsw = TRUE);
212}
213
214/*
215 =============================================================================
216 CMdig() -- attempt to match a digit in the input string.
217 =============================================================================
218*/
219
220int16_t CMdig(void)
221{
222 register int8_t c;
223
224 CM_DBLK;
225
226 c = *QQip;
227
228 if (!isascii(c))
229 return(QQsw = FALSE);
230
231 if (!isdigit(c))
232 return(QQsw = FALSE);
233
234 QQdig = c;
235 ++QQip;
236 return(QQsw = TRUE);
237}
238
239/*
240 =============================================================================
241 CMlist(l) -- attempt to match a string from the list 'l' in the input.
242 =============================================================================
243*/
244
245int16_t CMlist(int8_t *l[])
246{
247 register int16_t n;
248 register int8_t *p, *q;
249
250 CM_DBLK;
251
252 n = 0;
253
254 while (p = *l++) {
255
256 q = p;
257
258 if (CMstr(p)) {
259
260 QQop = QQstr;
261
262 while (*QQop++ = *q++) ;
263
264 QQlnum = n;
265 return(QQsw = TRUE);
266 }
267
268 ++n;
269 }
270
271 return(QQsw = FALSE);
272}
273
274/*
275 =============================================================================
276 CMulist(l) -- attempt to match a string from the list 'l' in the input
277 ignoring case in both the list and the input string.
278 =============================================================================
279*/
280
281int16_t CMulist(int8_t *l[])
282{
283 register int16_t n;
284 register int8_t *p, *q;
285
286 CM_DBLK;
287
288 n = 0;
289
290 while (p = *l++) {
291
292 q = p;
293
294 if (CMustr(p)) {
295
296 QQop = QQstr;
297
298 while (*QQop++ = *q++) ;
299
300 QQlnum = n;
301 return(QQsw = TRUE);
302 }
303
304 ++n;
305 }
306
307 return(QQsw = FALSE);
308}
309
310/*
311 =============================================================================
312 CMstat(msg) -- output 'msg and dump parser status. Returns QQsw.
313 =============================================================================
314*/
315
316int16_t CMstat(int8_t *msg)
317{
318 register int8_t *tp;
319
320 tp = QQin;
321 printf("%s\r\n", msg);
322 printf(" QQsw: %s, QQanch: %s, QQchr: 0x%02x <%c>, QQdig: %c\r\n",
323 (QQsw ? "OK" : "NOGO"), (QQanch ? "anchored" : "deblanked"),
324 QQchr, (isascii(QQchr) ? (isprint(QQchr) ? QQchr : ' ') : ' '),
325 QQdig);
326 printf(" QQnum: %ld, QQlnum: %d\r\n", QQnum, QQlnum);
327 printf(" QQstr: %s\r\n", QQstr);
328 printf(" {%s}\r\n", QQin);
329 printf(" ");
330
331 while (tp++ NE QQip)
332 printf(" ");
333
334 printf("^\r\n");
335 return(QQsw);
336}
337
Note: See TracBrowser for help on using the repository browser.