|
|
1.1 root 1: %token MACHINE
2: %token LP RP NUMBER
3: %{
4: #include "stdio.h"
5: FILE *infd;
6: #define YYDEBUG
7: %}
8: %%
9: file:
10: | machine-list ;
11: machine-list: machine
12: | machine-list machine
13: ;
14: machine: MACHINE perm-list
15: ;
16: perm-list:
17: | perm
18: | perm-list perm
19: ;
20: perm: LP client host RP
21: ;
22: client: uid
23: { doclient($1, -1); }
24: | LP uid gid RP
25: { doclient($2, $3); }
26: ;
27: host: uid
28: { dohost($1, -1); }
29: | LP uid gid RP
30: { dohost($2, $3); }
31: ;
32: uid: NUMBER ;
33: gid: NUMBER ;
34: %%
35: int lineno = 1;
36: yyerror(s)
37: char *s;
38: { char buf[128];
39: sprintf(buf, "%s line %d", s, lineno);
40: perror(buf);
41: }
42:
43: pparse(fd)
44: FILE *fd;
45: {
46: infd = fd;
47: yyparse();
48: }
49:
50: yylex()
51: { int c;
52: again:
53: c = getc(infd);
54: if(c == '\n')
55: lineno++;
56: loop:
57: if(c == EOF)
58: return(0);
59: if(c == '#') {
60: do {
61: c = getc(infd);
62: } while(c != '\n' && c != EOF);
63: if(c == '\n')
64: lineno++;
65: goto loop;
66: }
67: if(c == ' ' || c == ',' || c == '\n' || c == '\t')
68: goto again;
69: if(c == '(')
70: return(LP);
71: if(c == ')')
72: return(RP);
73: if(c == '+' || c == '-' || c >= '0' && c <= '9') {
74: donumber(c);
75: return(NUMBER);
76: }
77: if(c >= 'a' && c <= 'z' || c == '/') {
78: domachine(c);
79: lineno++;
80: return(MACHINE);
81: }
82: debug("bad char in people (%c) 0%o ignored\n", c, c);
83: goto again;
84: }
85:
86: donumber(c)
87: int c;
88: { int n, i, sign;
89: n = 0;
90: sign = 1;
91: if(c == '-')
92: sign = -1;
93: else if(c != '+')
94: n = c - '0';
95: for(c = getc(infd); c >= '0' && c <= '9'; c = getc(infd))
96: n = 10 * n + c - '0';
97: ungetc(c, infd);
98: yylval = sign * n;
99: }
100:
101: static char nmbuf[128];
102: domachine(c)
103: { char *p = nmbuf;
104: *p++ = c;
105: for(c = getc(infd); (c >= 'a' && c <= 'z' || c == '/') && p < nmbuf + 127; c=getc(infd))
106: *p++ = c;
107: *p = 0;
108: newhost(nmbuf);
109: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.