home *** CD-ROM | disk | FTP | other *** search
-
- #include <stdio.h>
- #include <stdlib.h>
-
- typedef void (*fptr)(); typedef void (*actn)(); struct
- fsmcell { actn action; unsigned char nextstate; };
-
- FILE *fileout,*filein;
-
- int main(int argc,char *argv[]);
- void fsm(int c);
- void prefsm(int c);
- int premap(int c);
- int map(int c);
- void null(int c, fptr vec);
- void outc(int c, fptr vec);
- void W(int c, fptr vec);
- void Wc(int c, fptr vec);
- void SL(int c, fptr vec);
- void SLc(int c, fptr vec);
- void err(int c, fptr vec);
- void pchar(int c);
- void NL(int c, fptr vec);
- void NLc(int c, fptr vec);
- void BSLc(int c, fptr vec);
- void WSL(int c, fptr vec);
- void WSLc(int c, fptr vec);
- void NLSL(int c, fptr vec);
- void NLSLc(int c, fptr vec);
- static struct fsmcell prestab[6][4] = { outc,1, null,0, outc,3, outc,1, null,4,
- null,2, outc,1, outc,1, Wc,1, null,2, NLc,3, Wc,1, null,5, outc,0, outc,3,
- outc,3, BSLc,1, null,1, BSLc,1, BSLc,1, BSLc,3, null,3, BSLc,3, BSLc,3 };
- static struct fsmcell stab[16][8] = { null,2, outc,0, null,1, null,9, outc,5,
- outc,7, outc,0, outc,0, null,10, Wc,0, null,1, null,9, Wc,5, Wc,7, Wc,0, Wc,0
- , err,0, null,3, SL,1, SL,9, err,0, err,0, err,0, SLc,0 , null,3, null,4,
- null,3, null,3, null,3, null,3, null,3, null,3, null,0, null,4, null,3,
- null,3, null,3, null,3, null,3, null,3, outc,5, outc,5, outc,5, err,0, outc,0,
- outc,5, outc,6, outc,5, outc,5, outc,5, outc,5, err,5, outc,5, outc,5, outc,5,
- outc,5, outc,7, outc,7, outc,7, err,0, err,0, outc,0, outc,8, outc,7, outc,7,
- outc,7, outc,7, err,7, outc,7, outc,7, outc,7, outc,7, null,13, NLc,0, null,9,
- null,9, NLc,5, NLc,7, NLc,0, NLc,0, err,0, null,11, WSL,1, WSL,9, err,0,
- err,0, err,0, WSLc,0, null,11, null,12, null,11, null,11, null,11, null,11,
- null,11, null,11, null,1, null,12, null,11, null,11, null,11, null,11,
- null,11, null,11, err,0, null,14, NLSL,1, NLSL,9, err,0, err,0, err,0,
- NLSLc,0, null,14, null,15, null,14, null,14, null,14, null,14, null,14,
- null,14, null,9, null,15, null,14, null,14, null,14, null,14, null,14, null,14
- }; int main(int argc,char *argv[]) { int c; if (argc!=3) {
- fprintf(stderr,"Syntax : oc [infile] [outfile]\n"); exit(1); } filein=fopen(argv[1],"rb"); fileout=fopen(argv[2],"wt");
- if(filein==NULL || fileout==NULL) { fprintf(stderr,"File error\n"); exit(1); }
- while(c = fgetc(filein), c != EOF) prefsm(c); fclose(filein); fclose(fileout); } void
- prefsm(c) int c; { static unsigned char state = 0; struct fsmcell *cp; int
- input; input = premap(c); cp = &prestab[state][input]; (*cp->action)(c,fsm);
- state = cp->nextstate; } int premap(int c) { switch(c) { case '\\':
- return(0); case '\n': return(1); case '#': return(2); default: return(3); } }
- void fsm(int c) { static unsigned char state = 0; struct fsmcell *cp; int
- input; input = map(c); cp = &stab[state][input]; (*cp->action)(c,pchar); state
- = cp->nextstate; } int map(c) int c; { switch(c) { case '/': return(0); case
- '*': return(1); case ' ': case '\t': return(2); case '\n': return(3); case
- '\"': return(4); case '\'': return(5); case '\\': return(6); default:
- return(7); } } void null(int c, fptr vec) { return; } void outc(int c,
- fptr vec) { (*vec)(c); } void W(int c, fptr vec) { (*vec)(' '); } void
- Wc(int c, fptr vec) { (*vec)(' '); (*vec)(c); } void SL(int c,
- fptr vec) { (*vec)('/'); } void SLc(int c, fptr vec) { (*vec)('/');
- (*vec)(c); } void err(int c, fptr vec) { printf("\nError\n"); exit(1);
- } void pchar(int c) { fputc(c,fileout); } void NL(int c, fptr vec) {
- (*vec)('\n'); } void NLc(int c, fptr vec) { (*vec)('\n'); (*vec)(c); }
- void BSLc(int c, fptr vec) { (*vec)('\\'); (*vec)(c); } void WSL(
- int c, fptr vec) { (*vec)(' '); (*vec)('/'); } void WSLc(int c, fptr
- vec) { (*vec)(' '); (*vec)('/'); (*vec)(c); } void NLSL(int c, fptr
- vec) { (*vec)('\n'); (*vec)('/'); } void NLSLc(c,vec) int c; fptr vec; {
- (*vec)('\n'); (*vec)('/'); (*vec)(c); }
-