static enum { PPDIR_DEFINE, PPDIR_UNDEF, PPDIR_IF, PPDIR_IFDEF, PPDIR_IFNDEF, PPDIR_ELSE, PPDIR_ELIF, PPDIR_ENDIF, PPDIR_INCLUDE, PPDIR_INCLUDE_NEXT, PPDIR_PRAGMA, PPDIR_ERROR, PPDIR_LINE, PPDIR_ASSERT, PPDIR_UNASSERT, PPDIR_IDENT, PPDIR_UNKNOWN } scan_pp_directive(const char *ppdir) { switch( ppdir[0] ) { case 'a': if( ppdir[1] == 's' && ppdir[2] == 's' && ppdir[3] == 'e' && ppdir[4] == 'r' && ppdir[5] == 't' && ppdir[6] == '\0' ) { /* assert */ return PPDIR_ASSERT; } goto unknown; case 'd': if( ppdir[1] == 'e' && ppdir[2] == 'f' && ppdir[3] == 'i' && ppdir[4] == 'n' && ppdir[5] == 'e' && ppdir[6] == '\0' ) { /* define */ return PPDIR_DEFINE; } goto unknown; case 'e': switch( ppdir[1] ) { case 'l': switch( ppdir[2] ) { case 'i': if( ppdir[3] == 'f' && ppdir[4] == '\0' ) { /* elif */ return PPDIR_ELIF; } goto unknown; case 's': if( ppdir[3] == 'e' && ppdir[4] == '\0' ) { /* else */ return PPDIR_ELSE; } goto unknown; default: goto unknown; } case 'n': if( ppdir[2] == 'd' && ppdir[3] == 'i' && ppdir[4] == 'f' && ppdir[5] == '\0' ) { /* endif */ return PPDIR_ENDIF; } goto unknown; case 'r': if( ppdir[2] == 'r' && ppdir[3] == 'o' && ppdir[4] == 'r' && ppdir[5] == '\0' ) { /* error */ return PPDIR_ERROR; } goto unknown; default: goto unknown; } case 'i': switch( ppdir[1] ) { case 'd': if( ppdir[2] == 'e' && ppdir[3] == 'n' && ppdir[4] == 't' && ppdir[5] == '\0' ) { /* ident */ return PPDIR_IDENT; } goto unknown; case 'f': switch( ppdir[2] ) { case '\0': { /* if */ return PPDIR_IF; } goto unknown; case 'd': if( ppdir[3] == 'e' && ppdir[4] == 'f' && ppdir[5] == '\0' ) { /* ifdef */ return PPDIR_IFDEF; } goto unknown; case 'n': if( ppdir[3] == 'd' && ppdir[4] == 'e' && ppdir[5] == 'f' && ppdir[6] == '\0' ) { /* ifndef */ return PPDIR_IFNDEF; } goto unknown; default: goto unknown; } case 'n': switch( ppdir[2] ) { case 'c': switch( ppdir[3] ) { case 'l': switch( ppdir[4] ) { case 'u': switch( ppdir[5] ) { case 'd': switch( ppdir[6] ) { case 'e': switch( ppdir[7] ) { case '\0': { /* include */ return PPDIR_INCLUDE; } goto unknown; case '_': if( ppdir[8] == 'n' && ppdir[9] == 'e' && ppdir[10] == 'x' && ppdir[11] == 't' && ppdir[12] == '\0' ) { /* include_next */ return PPDIR_INCLUDE_NEXT; } goto unknown; default: goto unknown; } default: goto unknown; } default: goto unknown; } default: goto unknown; } default: goto unknown; } default: goto unknown; } default: goto unknown; } case 'l': if( ppdir[1] == 'i' && ppdir[2] == 'n' && ppdir[3] == 'e' && ppdir[4] == '\0' ) { /* line */ return PPDIR_LINE; } goto unknown; case 'p': if( ppdir[1] == 'r' && ppdir[2] == 'a' && ppdir[3] == 'g' && ppdir[4] == 'm' && ppdir[5] == 'a' && ppdir[6] == '\0' ) { /* pragma */ return PPDIR_PRAGMA; } goto unknown; case 'u': switch( ppdir[1] ) { case 'n': switch( ppdir[2] ) { case 'a': if( ppdir[3] == 's' && ppdir[4] == 's' && ppdir[5] == 'e' && ppdir[6] == 'r' && ppdir[7] == 't' && ppdir[8] == '\0' ) { /* unassert */ return PPDIR_UNASSERT; } goto unknown; case 'd': if( ppdir[3] == 'e' && ppdir[4] == 'f' && ppdir[5] == '\0' ) { /* undef */ return PPDIR_UNDEF; } goto unknown; default: goto unknown; } default: goto unknown; } default: goto unknown; } unknown: return PPDIR_UNKNOWN; }