FreeCalypso > hg > fc-tourmaline
comparison src/gpf/misc/tok.c @ 0:4e78acac3d88
src/{condat,cs,gpf,nucleus}: import from Selenite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:23:26 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4e78acac3d88 |
---|---|
1 /* | |
2 +------------------------------------------------------------------------------ | |
3 | File: tok.c | |
4 +------------------------------------------------------------------------------ | |
5 | Copyright 2002 Texas Instruments Berlin, AG | |
6 | All rights reserved. | |
7 | | |
8 | This file is confidential and a trade secret of Texas | |
9 | Instruments Berlin, AG | |
10 | The receipt of or possession of this file does not convey | |
11 | any rights to reproduce or disclose its contents or to | |
12 | manufacture, use, or sell anything it may describe, in | |
13 | whole, or in part, without the specific written consent of | |
14 | Texas Instruments Berlin, AG. | |
15 +----------------------------------------------------------------------------- | |
16 | Purpose : This Modul performs Configuration string functions | |
17 +----------------------------------------------------------------------------- | |
18 */ | |
19 | |
20 #ifndef __TOK_C__ | |
21 #define __TOK_C__ | |
22 | |
23 #include "typedefs.h" | |
24 #include <string.h> | |
25 #include <ctype.h> | |
26 | |
27 #include "tok.h" | |
28 | |
29 #ifdef _VXWORKS_ | |
30 #undef ERROR -1 /* Token types */ | |
31 #undef EOS 1 | |
32 #endif | |
33 #define ERROR -1 /* Token types */ | |
34 #define EOS 1 | |
35 #define COMMA 2 | |
36 #define EQUAL 3 | |
37 #define IDENT 4 | |
38 #define STRING 5 | |
39 #define LBRACK 6 | |
40 #define RBRACK 7 | |
41 | |
42 static SHORT tok_gettok (char **); | |
43 static SHORT tok_value (char **); | |
44 static int tok_issep (char); | |
45 | |
46 /* | |
47 Format: | |
48 List ::= Token | |
49 ::= Token , Token, ... | |
50 | |
51 Token ::= Ident | |
52 ::= Ident = Values | |
53 | |
54 Values ::= Value | |
55 ::= (Value) | |
56 ::= (Value , Value , ... ) | |
57 ::= () | |
58 | |
59 Value ::= Ident | |
60 ::= "String" | |
61 | |
62 */ | |
63 | |
64 #ifndef RUN_INT_RAM | |
65 static TOK_DCB tok_dcb; | |
66 static char tok_buf[80]; | |
67 #endif | |
68 | |
69 #ifndef RUN_INT_RAM | |
70 /* | |
71 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | |
72 | PROJEKT : TETRA-PS (6143) MODUL : TOK.C | | |
73 | STATUS : code ROUTINE : tok_key | | |
74 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | |
75 | |
76 PURPOSE : Return code value of a keyword from table. | |
77 | |
78 */ | |
79 | |
80 SHORT tok_key (KW_DATA * keytab, char * keyword) | |
81 { | |
82 /* | |
83 * Empty string terminates | |
84 */ | |
85 while (keytab->keyword[0]) | |
86 { | |
87 if (strcmp (keytab->keyword, keyword ) == 0) | |
88 return (keytab->code); | |
89 keytab++; | |
90 } | |
91 | |
92 return (TOK_NOT_FOUND); | |
93 } | |
94 #endif | |
95 | |
96 | |
97 #ifndef RUN_INT_RAM | |
98 /* | |
99 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | |
100 | PROJEKT : TETRA-PS (6143) MODUL : TOK.C | | |
101 | STATUS : code ROUTINE : tok_init | | |
102 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | |
103 | |
104 PURPOSE : Initialize token scanner. | |
105 | |
106 */ | |
107 | |
108 void tok_init (char * s) | |
109 { | |
110 tok_dcb.tokbuf = tok_buf; | |
111 strncpy (tok_dcb.tokbuf, s, 79); | |
112 tok_dcb.tokbuf[79] = '\0'; | |
113 tok_dcb.nexttok = tok_dcb.tokbuf; | |
114 tok_dcb.lastchar = 0; | |
115 } | |
116 #endif | |
117 | |
118 #ifndef RUN_INT_RAM | |
119 /* | |
120 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | |
121 | PROJEKT : TETRA-PS (6143) MODUL : TOK.C | | |
122 | STATUS : code ROUTINE : tok_next | | |
123 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | |
124 | |
125 PURPOSE : Get next token (and its values) from token string. | |
126 Return number of value strings. | |
127 | |
128 */ | |
129 | |
130 SHORT tok_next (char ** keyw, char * value []) | |
131 { | |
132 char * val; | |
133 | |
134 if (tok_dcb.nexttok == NULL) | |
135 return (TOK_EOCS); | |
136 | |
137 if (tok_gettok (keyw) != IDENT) | |
138 { | |
139 tok_dcb.nexttok = NULL; | |
140 return (TOK_EOCS); | |
141 } | |
142 | |
143 /* | |
144 * Check next token | |
145 */ | |
146 switch (tok_gettok (&val)) | |
147 { | |
148 /* | |
149 * No value present | |
150 */ | |
151 case COMMA: | |
152 return (0); | |
153 /* | |
154 * Value(s) follows | |
155 */ | |
156 case EQUAL: | |
157 return (tok_value (value)); | |
158 /* | |
159 * No value present and EOS | |
160 */ | |
161 case EOS: | |
162 tok_dcb.nexttok = NULL; | |
163 return (0); | |
164 /* | |
165 * Syntax error | |
166 */ | |
167 default: | |
168 tok_dcb.nexttok = NULL; | |
169 return (TOK_EOCS); | |
170 } | |
171 } | |
172 #endif | |
173 | |
174 #ifndef RUN_INT_RAM | |
175 /* | |
176 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | |
177 | PROJEKT : TETRA-PS (6143) MODUL : TOK.C | | |
178 | STATUS : code ROUTINE : tok_value | | |
179 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | |
180 | |
181 PURPOSE : Get list of values for token. | |
182 Return number of values found. | |
183 | |
184 Formats: Value | |
185 (Value) | |
186 (Value, Value,...) | |
187 () | |
188 */ | |
189 | |
190 static SHORT tok_value (char * value []) | |
191 { | |
192 SHORT count; | |
193 SHORT tok; | |
194 SHORT inbrack; | |
195 char * val; | |
196 char * val2; | |
197 | |
198 inbrack = 0; | |
199 /* | |
200 * Get next token | |
201 */ | |
202 tok = tok_gettok (&val); | |
203 | |
204 switch (tok) | |
205 { | |
206 case LBRACK: | |
207 inbrack++; | |
208 break; | |
209 | |
210 case IDENT : | |
211 case STRING : | |
212 tok = tok_gettok (&val2); | |
213 if ((tok != COMMA) && (tok != EOS)) | |
214 { | |
215 tok_dcb.nexttok = NULL; | |
216 return (0); | |
217 } | |
218 | |
219 value[0] = val; | |
220 return (1); | |
221 | |
222 case EOS : | |
223 default : | |
224 tok_dcb.nexttok = NULL; | |
225 return (0); | |
226 } | |
227 | |
228 /* | |
229 * Get first token of list | |
230 */ | |
231 | |
232 tok = tok_gettok (&val); | |
233 count = 0; | |
234 for(;;) | |
235 { | |
236 if ((tok == IDENT) || (tok == STRING)) | |
237 value[count++] = val; | |
238 else | |
239 { | |
240 tok_dcb.nexttok = NULL; | |
241 return (0); | |
242 } | |
243 | |
244 tok = tok_gettok (&val); | |
245 switch (tok) | |
246 { | |
247 case COMMA: | |
248 break; | |
249 | |
250 case RBRACK : | |
251 if (inbrack) | |
252 { | |
253 if (((tok = tok_gettok (&val)) == COMMA) || | |
254 (tok == EOS)) | |
255 return (count); | |
256 } | |
257 /* | |
258 * Fall through | |
259 */ | |
260 /*lint -fallthrough */ | |
261 default: | |
262 tok_dcb.nexttok = NULL; | |
263 return (0); | |
264 } | |
265 tok = tok_gettok (&val); | |
266 } | |
267 /*lint -e527 suppress Warning -- Unreachable */ | |
268 return (0); | |
269 /*lint +e527 */ | |
270 | |
271 } | |
272 #endif | |
273 | |
274 #ifndef RUN_INT_RAM | |
275 /* | |
276 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | |
277 | PROJEKT : TETRA-PS (6143) MODUL : TOK.C | | |
278 | STATUS : code ROUTINE : tok_gettok | | |
279 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | |
280 | |
281 PURPOSE : Return next token in input string. | |
282 | |
283 */ | |
284 | |
285 static SHORT tok_gettok (char ** token) | |
286 { | |
287 SHORT tok; | |
288 char hadnull; | |
289 char * cp; | |
290 | |
291 cp = tok_dcb.nexttok; | |
292 hadnull = tok_dcb.lastchar != 0; | |
293 | |
294 if (tok_dcb.lastchar) | |
295 { | |
296 * tok_dcb.nexttok = tok_dcb.lastchar; | |
297 tok_dcb.lastchar = 0; | |
298 } | |
299 /* | |
300 * Skip leading white space | |
301 */ | |
302 while (isspace (* tok_dcb.nexttok)) | |
303 tok_dcb.nexttok++; | |
304 | |
305 * token = tok_dcb.nexttok++; | |
306 | |
307 switch (** token) | |
308 { | |
309 case '\0': /* End of string */ | |
310 case '\n': | |
311 tok = EOS; | |
312 break; | |
313 | |
314 case ',': | |
315 ** token = '\0'; | |
316 tok = COMMA; | |
317 break; | |
318 | |
319 case '=': | |
320 ** token = '\0'; | |
321 tok = EQUAL; | |
322 break; | |
323 | |
324 case '(': | |
325 case '<': | |
326 case '[': | |
327 ** token = '\0'; | |
328 tok = LBRACK; | |
329 break; | |
330 | |
331 case ')': | |
332 case '>': | |
333 case ']': | |
334 ** token = '\0'; | |
335 tok = RBRACK; | |
336 break; | |
337 | |
338 case '"': | |
339 /* | |
340 * Get first char of string | |
341 */ | |
342 * token = tok_dcb.nexttok; | |
343 while ((* tok_dcb.nexttok != '\0') && (* tok_dcb.nexttok != '"')) | |
344 tok_dcb.nexttok++; | |
345 | |
346 if (* tok_dcb.nexttok != '\0') | |
347 * tok_dcb.nexttok++ = '\0'; | |
348 | |
349 tok = STRING; | |
350 break; | |
351 | |
352 default: | |
353 /* | |
354 * Read an identifier | |
355 */ | |
356 if (!tok_issep (** token)) | |
357 { | |
358 while (!tok_issep (* tok_dcb.nexttok)) | |
359 tok_dcb.nexttok++; | |
360 | |
361 tok_dcb.lastchar = * tok_dcb.nexttok; | |
362 * tok_dcb.nexttok = '\0'; | |
363 | |
364 tok = IDENT; | |
365 } | |
366 else | |
367 tok = ERROR; | |
368 break; | |
369 } | |
370 /* | |
371 * '\0 was replaced with char | |
372 * Replace original '\0' | |
373 */ | |
374 | |
375 if (hadnull) | |
376 * cp = '\0'; | |
377 | |
378 return (tok); | |
379 } | |
380 #endif | |
381 | |
382 #ifndef RUN_INT_RAM | |
383 /* | |
384 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ | |
385 | PROJEKT : TETRA-PS (6143) MODUL : TOK.C | | |
386 | STATUS : code ROUTINE : tok_issep | | |
387 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ | |
388 | |
389 PURPOSE : Return 1 if special character. | |
390 | |
391 */ | |
392 | |
393 static int tok_issep (char c) | |
394 { | |
395 switch (c) | |
396 { | |
397 case '\0' : | |
398 case '\n' : | |
399 case ',' : | |
400 case '=' : | |
401 case '(' : | |
402 case '<' : | |
403 case '[' : | |
404 case ')' : | |
405 case '>' : | |
406 case ']' : | |
407 case '"' : return (1); | |
408 | |
409 default : return (isspace (c)); | |
410 } | |
411 } | |
412 #endif | |
413 #endif |