/* yuriko5.c - Don Yang (uguu.org) 02/12/06 */ #include 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" }, quote, buffer_char, **dfa, *input, buffer[1024], *p, *f = __FILE__; int state, nest, continue_line, line_number, action, a, InvertOutput; size_t size, i; FILE *infile; int IsNotDigit(void) { return (int)*p < (int)'0' || (int)*p > (int)'9'; } void SkipEdge(void) { for(; IsNotDigit(); p++); } void ResetState(void) { state = nest = continue_line = line_number = 0; buffer_char = '\0'; } void SingleStepDFA(void) { action = 0; for(p = dfa[state]; IsNotDigit(); p++) { if( *p != ' ' ) { if( *p == ',' ) { if( *input != quote ) SkipEdge(); } else if( *p == '=' ) { if( nest != 1 ) SkipEdge(); } else if( *p == '+' ) { nest++; } else if( *p == '-' ) { nest--; } else if( *p == '!' ) { action++; } else if( *p == '?' ) { action |= 2; if( buffer_char != '\0' ) action |= 4; else buffer_char = *input; } else { if( *input != *p ) { SkipEdge(); } else { if( *p == '\'' || *p == '\"' ) quote = *p; } } } } state = (int)*p - (int)'0'; } int TestDFA(void) { ResetState(); input = buffer; for(i = action = 0; i < size && !(action & 1) && line_number < 5; i++) { if( *input == '\n' ) ++line_number; SingleStepDFA(); input++; } return !(action & 1); } void ProcessInput(void) { size = fread(buffer, 1, 1024, infile); dfa = dfa_c; if( TestDFA() ) { dfa = dfa_ml; if( TestDFA() ) { dfa = dfa_py; if( TestDFA() ) { dfa = dfa_scm; if( TestDFA() ) dfa = dfa_c; } } } ResetState(); while( size > 0 ) { input = buffer; for(i = 0; i < size; i++, input++) { if( InvertOutput == 0 ) { if( continue_line == 0 ) { printf("%7d ", ++line_number); continue_line = 1; } if( *input == '\n' ) continue_line = 0; } SingleStepDFA(); if( (action & 4) != 0 ) { putchar((action & 1) ? buffer_char : ' '); } if( (action & 2) != 0 ) continue; if( (action & 1) != InvertOutput ) { if( buffer_char ) { putchar(buffer_char); buffer_char = '\0'; } putchar(*input); } else { if( buffer_char ) { putchar(' '); buffer_char = '\0'; } putchar((int)*input >= 9 && (int)*input <= 13 ? *input : ' '); } } size = fread(buffer, 1, 1024, infile); } } int main(int argc, char **argv) { InvertOutput = ((int)*f & 1) ^ 1; if( argc == 1 ) { infile = stdin; ProcessInput(); } else { for(a = 1; a < argc; a++) { if( argc > 2 && InvertOutput == 0 ) puts(argv[a]); if( (infile = fopen(argv[a], "rb")) == NULL ) { puts("can not open file"); } else { ProcessInput(); fclose(infile); } } } return 0; }