|
|
1.1 root 1: %{
2: #ifndef lint
3: static char *rcsid = "$Header: /f/osi/others/quipu/uips/sd/RCS/conf_read.y,v 7.0 90/06/12 13:14:23 mrose Exp $";
4: #endif
5:
6: /*
7: * $Header: /f/osi/others/quipu/uips/sd/RCS/conf_read.y,v 7.0 90/06/12 13:14:23 mrose Exp $
8: */
9:
10: /*
11: * $Log: conf_read.y,v $
12: * Revision 7.0 90/06/12 13:14:23 mrose
13: * *** empty log message ***
14: *
15: * Revision 1.6 90/04/26 10:36:54 emsrdsm
16: * *** empty log message ***
17: *
18: * Revision 1.5 90/04/25 15:08:06 emsrdsm
19: * i) lint'ed
20: *
21: * Revision 1.4 90/04/20 17:58:22 emsrdsm
22: * i) no more freeing
23: *
24: * Revision 1.3 90/04/18 18:28:39 emsrdsm
25: * fixed i) does not move to leaves
26: * ii) added default mechanism described using "typeDefaults" file.
27: * iii) added 'sorting' to attribute display
28: *
29: * Revision 1.2 90/03/15 16:34:20 emsrdsm
30: * *** empty log message ***
31: *
32: * Revision 1.1 90/03/09 17:58:22 emsrdsm
33: * Initial revision
34: *
35: */
36:
37: #include <stdio.h>
38: #include <ctype.h>
39: #include <string.h>
40:
41: #include "filt.h"
42: #include "symtab.h"
43:
44: extern make_type();
45: extern filt_struct *make_item_filter();
46: extern filt_struct *link_filters();
47: extern filt_struct *make_parent_filter();
48: extern put_symbol_value();
49:
50: extern FILE *file;
51: extern int curr_filt;
52: extern char **file_names;
53: extern table_entry symtab;
54: %}
55: %start type_spec
56:
57: %union {
58: filt_struct *filt;
59: char strval[255];
60: int symbol;
61: }
62:
63: %token NUMBER NAME DEFAULT STRING OID AND OR NOT APPROX EQUAL ITEM
64:
65: %type <filt> filter filter_list assertion filter_item
66: %type <symbol> filt_type match
67: %token <symbol> NOT AND OR APPROX EQUAL SUBSTRING
68: %token <symbol> '"' ':' '(' ')'
69: %token <strval> STRING OID
70: %type <strval> name default
71:
72: %%
73: type_spec : name filter {make_type($1, $2);}
74: ;
75:
76: name : NAME ':' STRING {(void) strcpy($$, $3);}
77: ;
78:
79: default : DEFAULT ':' STRING {(void) strcpy($$, $3);}
80: | {(void) strcpy($$, "\0");}
81: ;
82:
83: assertion : '(' filt_type filter filter filter_list ')' {$$ = make_parent_filter($2, $3, $4, $5);}
84: | '(' NOT filter ')' {$$ = make_parent_filter($2, $3, (filt_struct *) 0,(filt_struct *) 0);}
85: | filter_item {$$ = $1;}
86: ;
87:
88: filter_list : filter filter_list {$$ = link_filters($1, $2);}
89: | filter {$$ = $1;}
90: | {$$ = (filt_struct *) 0;}
91: ;
92:
93: filter : filter_item {$$ = $1;}
94: | assertion {$$ = $1;}
95: ;
96:
97: filter_item : '(' OID match STRING ')' {$$ = make_item_filter($2, $3, $4);}
98: ;
99:
100: match : APPROX {$$ = $1;}
101: | EQUAL {$$ = $1;}
102: | SUBSTRING {$$ = $1;}
103: ;
104:
105: filt_type : AND {$$ = $1;}
106: | OR {$$ = $1;}
107: ;
108: %%
109:
110: yylex()
111: {
112: int c, count = 0;
113: char lexeme[255];
114:
115: while(iswspace(c = getc(file)))
116: if (c == EOF) return(0);
117:
118: lexeme[count++] = c;
119:
120: switch(c) {
121: case '#':
122: while (getc(file) != '\n');
123: return(yylex());
124: case '"':
125: count = 0;
126: while ((c = getc(file)) != '"')
127: lexeme[count++] = c;
128: lexeme[count] = '\0';
129: (void) strcpy(yylval.strval, lexeme);
130: return STRING;
131: case '$':
132: while (!iswspace((c = getc(file))) && !issymbol(c))
133: lexeme[count++] = c;
134: lexeme[count] = '\0';
135: put_symbol_value(symtab, lexeme+1, (char *) 0);
136: (void) strcpy(yylval.strval, lexeme);
137: return STRING;
138: case '(':
139: return (int) c;
140: case ')':
141: return (int) c;
142: case ':':
143: return (int) c;
144: case '&':
145: yylval.symbol = AND;
146: return AND;
147: case '|':
148: yylval.symbol = OR;
149: return OR;
150: case '!':
151: yylval.symbol = NOT;
152: return NOT;
153: case '*':
154: lexeme[count] = '\0';
155: (void) strcpy(yylval.strval, lexeme);
156: return STRING;
157: case '~':
158: if((lexeme[count] = getc(file)) == '=') {
159: yylval.symbol = APPROX;
160: return APPROX;
161: }
162: break;
163: case '%':
164: if((lexeme[count] = getc(file)) == '=') {
165: yylval.symbol = SUBSTRING;
166: return SUBSTRING;
167: }
168: break;
169: case '=':
170: yylval.symbol = EQUAL;
171: return EQUAL;
172: }
173:
174: while(!iswspace(c = getc(file)) && c != '\0' && !issymbol(c))
175: if (c != EOF)
176: lexeme[count++] = c;
177: else
178: return(0);
179:
180: (void) fseek(file,(long) -1, 1);
181:
182: lexeme[count] = '\0';
183: switch(*lexeme) {
184: case 'd':
185: case 'D':
186: if(!strcmp(lexeme, "default") || !strcmp(lexeme, "DEFAULT"))
187: return DEFAULT;
188: else {
189: (void) strcpy(yylval.strval, lexeme);
190: return STRING;
191: }
192: case 'n':
193: case 'N':
194: if(!strcmp(lexeme, "name") || !strcmp(lexeme, "NAME"))
195: return NAME;
196: else {
197: (void) strcpy(yylval.strval, lexeme);
198: return STRING;
199: }
200: case '0':
201: case '1':
202: case '2':
203: case '3':
204: case '4':
205: case '5':
206: case '6':
207: case '7':
208: case '8':
209: case '9':
210: count = 0;
211: while (isdigit(lexeme[count]) || lexeme[count] == '.') count++;
212: if (lexeme[count] == '\0') {
213: (void) strcpy(yylval.strval, lexeme);
214: return OID;
215: } else {
216: (void) strcpy(yylval.strval, lexeme);
217: return STRING;
218: }
219: default:
220: (void) strcpy(yylval.strval, lexeme);
221: return STRING;
222: }
223: }
224:
225: yyerror(err)
226: char *err;
227: {
228: /* Sorry */
229: (void) fprintf(stderr, "Parse error in 'filterTypes' dir: ");
230: (void) fprintf(stderr, err);
231: (void) fprintf(stderr, "\n");
232: }
233:
234: int
235: issymbol(c)
236: char c;
237: {
238: switch(c) {
239: case '#':
240: return 1;
241: case '"':
242: return 1;
243: case '(':
244: return 1;
245: case ')':
246: return 1;
247: case ':':
248: return 1;
249: case '&':
250: return 1;
251: case '|':
252: return 1;
253: case '!':
254: return 1;
255: case '*':
256: return 1;
257: case '~':
258: return 1;
259: case '=':
260: return 1;
261: case '$':
262: return 1;
263: case '%':
264: return 1;
265: }
266: return 0;
267: }
268:
269: int
270: iswspace(c)
271: char c;
272: {
273: switch(c) {
274: case ' ':
275: return 1;
276: case '\n':
277: return 1;
278: case '\t':
279: return 1;
280: }
281: return 0;
282: }
283:
284:
285:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.