|
|
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.