/* yuriko7.c - Don Yang (uguu.org) 02/12/06 */ #include #define e else if char *dfa_c[] = { "\"1 \'1 /?3 0", "\\2 ,0 1", "1", "*!4 /!6 0", "*!5 !4", "*!5 /!0 !4", "\n0 !6" }, *dfa_ml[] = { "\"1 \'1 (?3 0", "\\2 ,0 1", "1", "*!+4 (?3 0", "(!5 *!6 !4", "*!+4 (!5 !4", "*!6 )=-!0 )-!4 !4" }, *dfa_py[] = { "\"1 \'1 #!7 0", "\\2 ,3 1", "1", ",4 \"1 \'1 #!7 0", ",5 4", ",6 4", ",0 4", "\n0 !7" }, *dfa_scm[] = { "\"1 ;!3 0", "\\2 ,0 1", "1", "\n0 !3" }, **dfa, *input, buffer[1024], *p, *f = __FILE__; int state, nest, continue_line, line_number, action, a, InvertOutput, buffer_char, quote, size, i; FILE *infile; void SkipEdge() { for(; *p < 48 || *p > 57; p++); } void ReadFile() { size = fread(buffer, 1, 1024, infile); } void PutChar(int c) { putchar(c); } void PutS(char *s) { puts(s); } void ResetState() { state = nest = continue_line = line_number = buffer_char = 0; } void SingleStepDFA() { action = 0; for(p = dfa[state]; *p < 48 || *p > 57; p++) if( *p - 32 ) { if( *p == 44 ) { if( *input != quote ) SkipEdge(); } e( *p == 61 ) { if( nest - 1 ) SkipEdge(); } e( *p == 43 ) { nest++; } e( *p == 45 ) { nest--; } e( *p == 33 ) { action++; } e( *p == 63 ) { action |= 2; if( buffer_char ) action |= 4; e(1) buffer_char = *input; } e(1) { if( *input - *p ) SkipEdge(); e( *p == 39 || *p == 34 ) quote = *p; } } state = *p - 48; } int TestDFA() { ResetState(); input = buffer; for(i = action = 0; i < size && !(action & 1) && line_number < 5; i++) { if( *input == 10 ) ++line_number; SingleStepDFA(); input++; } return !(action & 1); } void ProcessInput() { ReadFile(); dfa = dfa_c; if( TestDFA() ) { dfa = dfa_ml; if( TestDFA() ) { dfa = dfa_py; if( TestDFA() ) { dfa = dfa_scm; if( TestDFA() ) dfa = dfa_c; } } } for(ResetState(); size; ReadFile()) { input = buffer; for(i = 0; i < size; i++, input++) { if( InvertOutput ) { if( !continue_line ) continue_line = printf("%7d ", ++line_number); if( *input == 10 ) continue_line = 0; } SingleStepDFA(); if( action & 4 ) PutChar((action & 1) ? buffer_char : 32); if( !(action & 2) ) { if( (action & 1) - InvertOutput ) { if( buffer_char ) { PutChar(32); buffer_char = 0; } PutChar(*input > 8 && *input < 14 ? *input : 32); } e(1) { if( buffer_char ) { PutChar(buffer_char); buffer_char = 0; } PutChar(*input); } } } } } int main(int argc, char **argv) { InvertOutput = *f & 1; if( argc > 1 ) { for(a = 1; a < argc; a++) { if( argc > 2 && InvertOutput ) PutS(argv[a]); if( infile = fopen(argv[a], "rb") ) { ProcessInput(); fclose(infile); } e(1) PutS("can not open file"); } } e(1) { infile = stdin; ProcessInput(); } return 0; }