Automaton for the preprocessor: class | 0 1 2 3 4 st\ev | \0 \n ! space other START | print print print 0 | END START CMD NORMAL NORMAL NORMAL | print print print print 1 | END START NORMAL NORMAL NORMAL CMD | add 2 | END START IGNORE CMD1 CMD2 IGNORE | 3 | END START IGNORE IGNORE IGNORE CMD1 | add 4 | X X X CMD1 CMD2 CMD2 | idcmd add 5 | X X X ARG CMD2 ARG | add 6 | X X ARG1 ARG ARG1 ARG1 | proc proc add add add 7 | END START ARG1 ARG1 ARG1 states: 0-7 plus END and X -> 4 bits actions: 4. -> 8 bits total, fits in a char. print 0x10 copies the character to stdout add 0x20 adds the character to the processing string idcmd 0x40 ids the processing string for an !include cmd proc 0x80 gets the filename and procs the include