|
|
1.1 root 1: %{
2: #include "pp.h"
3: #include <stdio.h>
4: #ifdef TEST
5: main(){
6: register type, c;
7: while((type=yylex())!=0) switch(type){
8: case OTHER: printf("%s", yytext); break;
9: case KEYWORD: printf("\\fB%s\\fR", yytext); break;
10: case FUNCTION: printf("Function: %s", yytext); break;
11: case COMMENT:
12: printf("\\fI%s", yytext);
13: for(;;){
14: putchar(c=input());
15: if(c==0)
16: break;
17: if(c=='*'){
18: GotStar:
19: putchar(c=input());
20: if(c=='/')
21: break;
22: if(c=='*')
23: goto GotStar;
24: }
25: if(c=='\n'){
26: while((c=input())=='\t')
27: putchar(c);
28: if(c==' ')
29: putchar('^');
30: else{
31: putchar(c);
32: if(c=='*')
33: goto GotStar;
34: }
35: }
36: }
37: printf("\\fR");
38: break;
39: }
40: }
41: #endif
42: char *keyword[]={
43: "asm", "auto", "break", "char", "case", "continue", "double",
44: "default", "do", "extern", "else", "enum", "for", "float",
45: "fortran", "goto", "if", "int","long", "return", "register",
46: "switch", "struct", "sizeof", "short", "static", "unsigned",
47: "union", "void", "while", "typedef",
48: NULL
49: };
50: #define NWORD 150
51: char *hashtab[NWORD];
52: int kwinit=0;
53: hash(s)
54: register char *s;
55: {
56: register i=0, j=0;
57: while(*s)
58: i += *s++ * ++j; /* got that? */
59: if(i<0)
60: return(i%NWORD+NWORD);
61: return(i%NWORD);
62: }
63: char *copy(s)
64: register char *s;
65: {
66: char *malloc();
67: register char *t=malloc(strlen(s)+1);
68: if(t==NULL)
69: error("Out of space", (char *)0);
70: strcpy(t, s);
71: return(t);
72: }
73: insert(s)
74: register char *s;
75: {
76: register char **h;
77: register i;
78: h = &hashtab[hash(s)];
79: for(i=0;i!=NWORD && *h!=NULL;i++){
80: if(strcmp(*h, s)==0)
81: return;
82: if(++h==&hashtab[NWORD])
83: h=hashtab;
84: }
85: if(*h!=NULL)
86: error("keyword hash table overflow", (char *)0);
87: *h = s;
88: }
89: lookup(s)
90: register char *s;
91: {
92: register char **h;
93: register i;
94: if(!kwinit){
95: for(h=keyword;*h!=NULL;h++)
96: insert(*h);
97: kwinit++;
98: }
99: h = &hashtab[hash(s)];
100: for(i=0;i!=NWORD && *h!=NULL;i++){
101: if(strcmp(s, *h)==0)
102: return(KEYWORD);
103: if(++h==&hashtab[NWORD])
104: h=hashtab;
105: }
106: return(OTHER);
107: }
108: ckeywords(file)
109: char *file;
110: {
111: char buf[128], *fgets(), *malloc();
112: FILE *f=fopen(file, "r");
113: register char *p;
114: if(f==NULL){
115: if(*file!='/'){
116: sprintf(buf, "/usr/lib/pp/%s", file);
117: f=fopen(buf, "r");
118: }
119: if(f==NULL)
120: error("can't find keyword file", file);
121: }
122: while(fgets(buf, sizeof buf, f)){
123: buf[strlen(buf)-1]=0;
124: p=malloc(strlen(buf)+1);
125: if(p==NULL)
126: error("can't malloc a string", (char *)0);
127: strcpy(p, buf);
128: insert(p);
129: }
130: fclose(f);
131: }
132: %}
133: WS ([ \t]*)
134: %%
135: ^#{WS}ifdef return(KEYWORD);
136: ^#{WS}ifndef return(KEYWORD);
137: ^#{WS}endif return(KEYWORD);
138: ^#{WS}else return(KEYWORD);
139: ^#{WS}if return(KEYWORD);
140: ^#{WS}define return(KEYWORD);
141: ^#{WS}undef return(KEYWORD);
142: ^#{WS}include return(KEYWORD);
143: ^#{WS}line return(KEYWORD);
144: [_a-zA-Z][_a-zA-Z0-9]* return(lookup(yytext));
145: "/*" return(COMMENT);
146: ^[^ \t#\n].*"(".*[){]{WS}$ return(FUNCTION);
147: \"(\\(.|\n)|[^"\n])*["\n] return(OTHER);
148: .|\n return(OTHER);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.