/* cs-opt1-1.c - Don Yang (uguu.org) 05/05/04 */ #include static void Output(int k, int mask, int c, FILE *outfile) { if( (k & mask) != 0 ) (void)fputc(c, outfile); } static void Filter(FILE *infile, FILE *outfile) { /* 0 1234 56 70 1 */ char *input = "\n /\\'\"*\r\t"; char *dfa = "OOO(O?G 99999999KKK(K;C AAAAAAAA 0\320((((((( P 09999\tI" "99AAAA\31AIA\320PI\20I9AI\320PM\0M=EM"; char *state; int i, j, k, newline; newline = 0; for(state = dfa + 72; (i = fgetc(infile)) != EOF; state = dfa + k) { for(j = 0; input[j] != '\0' && (int)input[j] != i; j++); k = (int)*(state + (j & 7)); newline |= (k & 0x80); Output(k, 4, (int)(newline != 0 ? '\n' : ' '), outfile); Output(k, 2, (int)'/', outfile); Output(k, 1, i, outfile); newline *= ((k &= 0x78) != 72) ? 1 : 0; } (void)fputc('\n', outfile); } int main(int argc, char **argv) { FILE *infile, *outfile; infile = stdin; outfile = stdout; if( argc > 1 ) { if( (infile = fopen(argv[1], "rb")) == NULL ) return printf("Can not open %s\n", argv[1]); if( argc > 2 ) { if( (outfile = fopen(argv[2], "wb+")) == NULL ) { (void)fclose(infile); return printf("Can not write to %s\n", argv[2]); } } } Filter(infile, outfile); (void)fclose(infile); (void)fclose(outfile); return 0; }