switch( tokstr[0] )
{
  case 'a':
    switch( tokstr[1] )
    {
      case 's':
        if( tokstr[2] == 'm' &&
            tokstr[3] == '\0' )
        {                                         /* asm        */
          if( pState->pCPC->keywords & HAS_KEYWORD_ASM )
            return ASM_TOK;
        }

        goto unknown;

      case 'u':
        if( tokstr[2] == 't' &&
            tokstr[3] == 'o' &&
            tokstr[4] == '\0' )
        {                                         /* auto       */
          if( pState->pCPC->keywords & HAS_KEYWORD_AUTO )
            return AUTO_TOK;
        }

        goto unknown;

      default:
        goto unknown;
    }

  case 'b':
    if( tokstr[1] == 'r' &&
        tokstr[2] == 'e' &&
        tokstr[3] == 'a' &&
        tokstr[4] == 'k' &&
        tokstr[5] == '\0' )
    {                                             /* break      */
      return BREAK_TOK;
    }

    goto unknown;

  case 'c':
    switch( tokstr[1] )
    {
      case 'a':
        if( tokstr[2] == 's' &&
            tokstr[3] == 'e' &&
            tokstr[4] == '\0' )
        {                                         /* case       */
          return CASE_TOK;
        }

        goto unknown;

      case 'h':
        if( tokstr[2] == 'a' &&
            tokstr[3] == 'r' &&
            tokstr[4] == '\0' )
        {                                         /* char       */
          return CHAR_TOK;
        }

        goto unknown;

      case 'o':
        switch( tokstr[2] )
        {
          case 'n':
            switch( tokstr[3] )
            {
              case 's':
                if( tokstr[4] == 't' &&
                    tokstr[5] == '\0' )
                {                                 /* const      */
                  if( pState->pCPC->keywords & HAS_KEYWORD_CONST )
                    return CONST_TOK;
                }

                goto unknown;

              case 't':
                if( tokstr[4] == 'i' &&
                    tokstr[5] == 'n' &&
                    tokstr[6] == 'u' &&
                    tokstr[7] == 'e' &&
                    tokstr[8] == '\0' )
                {                                 /* continue   */
                  return CONTINUE_TOK;
                }

                goto unknown;

              default:
                goto unknown;
            }

          default:
            goto unknown;
        }

      default:
        goto unknown;
    }

  case 'd':
    switch( tokstr[1] )
    {
      case 'e':
        if( tokstr[2] == 'f' &&
            tokstr[3] == 'a' &&
            tokstr[4] == 'u' &&
            tokstr[5] == 'l' &&
            tokstr[6] == 't' &&
            tokstr[7] == '\0' )
        {                                         /* default    */
          return DEFAULT_TOK;
        }

        goto unknown;

      case 'o':
        switch( tokstr[2] )
        {
          case '\0':
            {                                     /* do         */
              return DO_TOK;
            }

            goto unknown;

          case 'u':
            if( tokstr[3] == 'b' &&
                tokstr[4] == 'l' &&
                tokstr[5] == 'e' &&
                tokstr[6] == '\0' )
            {                                     /* double     */
              if( pState->pCPC->keywords & HAS_KEYWORD_DOUBLE )
                return DOUBLE_TOK;
            }

            goto unknown;

          default:
            goto unknown;
        }

      default:
        goto unknown;
    }

  case 'e':
    switch( tokstr[1] )
    {
      case 'l':
        if( tokstr[2] == 's' &&
            tokstr[3] == 'e' &&
            tokstr[4] == '\0' )
        {                                         /* else       */
          return ELSE_TOK;
        }

        goto unknown;

      case 'n':
        if( tokstr[2] == 'u' &&
            tokstr[3] == 'm' &&
            tokstr[4] == '\0' )
        {                                         /* enum       */
          if( pState->pCPC->keywords & HAS_KEYWORD_ENUM )
            return ENUM_TOK;
        }

        goto unknown;

      case 'x':
        if( tokstr[2] == 't' &&
            tokstr[3] == 'e' &&
            tokstr[4] == 'r' &&
            tokstr[5] == 'n' &&
            tokstr[6] == '\0' )
        {                                         /* extern     */
          if( pState->pCPC->keywords & HAS_KEYWORD_EXTERN )
            return EXTERN_TOK;
        }

        goto unknown;

      default:
        goto unknown;
    }

  case 'f':
    switch( tokstr[1] )
    {
      case 'l':
        if( tokstr[2] == 'o' &&
            tokstr[3] == 'a' &&
            tokstr[4] == 't' &&
            tokstr[5] == '\0' )
        {                                         /* float      */
          if( pState->pCPC->keywords & HAS_KEYWORD_FLOAT )
            return FLOAT_TOK;
        }

        goto unknown;

      case 'o':
        if( tokstr[2] == 'r' &&
            tokstr[3] == '\0' )
        {                                         /* for        */
          return FOR_TOK;
        }

        goto unknown;

      default:
        goto unknown;
    }

  case 'g':
    if( tokstr[1] == 'o' &&
        tokstr[2] == 't' &&
        tokstr[3] == 'o' &&
        tokstr[4] == '\0' )
    {                                             /* goto       */
      return GOTO_TOK;
    }

    goto unknown;

  case 'i':
    switch( tokstr[1] )
    {
      case 'f':
        if( tokstr[2] == '\0' )
        {                                         /* if         */
          return IF_TOK;
        }

        goto unknown;

      case 'n':
        switch( tokstr[2] )
        {
          case 'l':
            if( tokstr[3] == 'i' &&
                tokstr[4] == 'n' &&
                tokstr[5] == 'e' &&
                tokstr[6] == '\0' )
            {                                     /* inline     */
              if( pState->pCPC->keywords & HAS_KEYWORD_INLINE )
                return INLINE_TOK;
            }

            goto unknown;

          case 't':
            if( tokstr[3] == '\0' )
            {                                     /* int        */
              return INT_TOK;
            }

            goto unknown;

          default:
            goto unknown;
        }

      default:
        goto unknown;
    }

  case 'l':
    if( tokstr[1] == 'o' &&
        tokstr[2] == 'n' &&
        tokstr[3] == 'g' &&
        tokstr[4] == '\0' )
    {                                             /* long       */
      if( pState->pCPC->keywords & HAS_KEYWORD_LONG )
        return LONG_TOK;
    }

    goto unknown;

  case 'r':
    switch( tokstr[1] )
    {
      case 'e':
        switch( tokstr[2] )
        {
          case 'g':
            if( tokstr[3] == 'i' &&
                tokstr[4] == 's' &&
                tokstr[5] == 't' &&
                tokstr[6] == 'e' &&
                tokstr[7] == 'r' &&
                tokstr[8] == '\0' )
            {                                     /* register   */
              if( pState->pCPC->keywords & HAS_KEYWORD_REGISTER )
                return REGISTER_TOK;
            }

            goto unknown;

          case 's':
            if( tokstr[3] == 't' &&
                tokstr[4] == 'r' &&
                tokstr[5] == 'i' &&
                tokstr[6] == 'c' &&
                tokstr[7] == 't' &&
                tokstr[8] == '\0' )
            {                                     /* restrict   */
              if( pState->pCPC->keywords & HAS_KEYWORD_RESTRICT )
                return RESTRICT_TOK;
            }

            goto unknown;

          case 't':
            if( tokstr[3] == 'u' &&
                tokstr[4] == 'r' &&
                tokstr[5] == 'n' &&
                tokstr[6] == '\0' )
            {                                     /* return     */
              return RETURN_TOK;
            }

            goto unknown;

          default:
            goto unknown;
        }

      default:
        goto unknown;
    }

  case 's':
    switch( tokstr[1] )
    {
      case 'h':
        if( tokstr[2] == 'o' &&
            tokstr[3] == 'r' &&
            tokstr[4] == 't' &&
            tokstr[5] == '\0' )
        {                                         /* short      */
          if( pState->pCPC->keywords & HAS_KEYWORD_SHORT )
            return SHORT_TOK;
        }

        goto unknown;

      case 'i':
        switch( tokstr[2] )
        {
          case 'g':
            if( tokstr[3] == 'n' &&
                tokstr[4] == 'e' &&
                tokstr[5] == 'd' &&
                tokstr[6] == '\0' )
            {                                     /* signed     */
              if( pState->pCPC->keywords & HAS_KEYWORD_SIGNED )
                return SIGNED_TOK;
            }

            goto unknown;

          case 'z':
            if( tokstr[3] == 'e' &&
                tokstr[4] == 'o' &&
                tokstr[5] == 'f' &&
                tokstr[6] == '\0' )
            {                                     /* sizeof     */
              return SIZEOF_TOK;
            }

            goto unknown;

          default:
            goto unknown;
        }

      case 't':
        switch( tokstr[2] )
        {
          case 'a':
            if( tokstr[3] == 't' &&
                tokstr[4] == 'i' &&
                tokstr[5] == 'c' &&
                tokstr[6] == '\0' )
            {                                     /* static     */
              if( pState->pCPC->keywords & HAS_KEYWORD_STATIC )
                return STATIC_TOK;
            }

            goto unknown;

          case 'r':
            if( tokstr[3] == 'u' &&
                tokstr[4] == 'c' &&
                tokstr[5] == 't' &&
                tokstr[6] == '\0' )
            {                                     /* struct     */
              return STRUCT_TOK;
            }

            goto unknown;

          default:
            goto unknown;
        }

      case 'w':
        if( tokstr[2] == 'i' &&
            tokstr[3] == 't' &&
            tokstr[4] == 'c' &&
            tokstr[5] == 'h' &&
            tokstr[6] == '\0' )
        {                                         /* switch     */
          return SWITCH_TOK;
        }

        goto unknown;

      default:
        goto unknown;
    }

  case 't':
    if( tokstr[1] == 'y' &&
        tokstr[2] == 'p' &&
        tokstr[3] == 'e' &&
        tokstr[4] == 'd' &&
        tokstr[5] == 'e' &&
        tokstr[6] == 'f' &&
        tokstr[7] == '\0' )
    {                                             /* typedef    */
      return TYPEDEF_TOK;
    }

    goto unknown;

  case 'u':
    switch( tokstr[1] )
    {
      case 'n':
        switch( tokstr[2] )
        {
          case 'i':
            if( tokstr[3] == 'o' &&
                tokstr[4] == 'n' &&
                tokstr[5] == '\0' )
            {                                     /* union      */
              return UNION_TOK;
            }

            goto unknown;

          case 's':
            if( tokstr[3] == 'i' &&
                tokstr[4] == 'g' &&
                tokstr[5] == 'n' &&
                tokstr[6] == 'e' &&
                tokstr[7] == 'd' &&
                tokstr[8] == '\0' )
            {                                     /* unsigned   */
              if( pState->pCPC->keywords & HAS_KEYWORD_UNSIGNED )
                return UNSIGNED_TOK;
            }

            goto unknown;

          default:
            goto unknown;
        }

      default:
        goto unknown;
    }

  case 'v':
    switch( tokstr[1] )
    {
      case 'o':
        switch( tokstr[2] )
        {
          case 'i':
            if( tokstr[3] == 'd' &&
                tokstr[4] == '\0' )
            {                                     /* void       */
              if( pState->pCPC->keywords & HAS_KEYWORD_VOID )
                return VOID_TOK;
            }

            goto unknown;

          case 'l':
            if( tokstr[3] == 'a' &&
                tokstr[4] == 't' &&
                tokstr[5] == 'i' &&
                tokstr[6] == 'l' &&
                tokstr[7] == 'e' &&
                tokstr[8] == '\0' )
            {                                     /* volatile   */
              if( pState->pCPC->keywords & HAS_KEYWORD_VOLATILE )
                return VOLATILE_TOK;
            }

            goto unknown;

          default:
            goto unknown;
        }

      default:
        goto unknown;
    }

  case 'w':
    if( tokstr[1] == 'h' &&
        tokstr[2] == 'i' &&
        tokstr[3] == 'l' &&
        tokstr[4] == 'e' &&
        tokstr[5] == '\0' )
    {                                             /* while      */
      return WHILE_TOK;
    }

    goto unknown;

  default:
    goto unknown;
}
