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