/* ANSI-C code produced by gperf version 3.0.2 */
/* Command-line: gperf -L ANSI-C -a -C -E -g -H is_reserved_hash -k '1,3,$' -N is_reserved_word -p -t scripts/genksyms/keywords.gperf  */

#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
/* The character set is not based on ISO-646.  */
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
#endif

#line 1 "scripts/genksyms/keywords.gperf"

#line 3 "scripts/genksyms/keywords.gperf"
struct resword { const char *name; int token; };
/* maximum key range = 62, duplicates = 0 */

#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
static unsigned int
is_reserved_hash (register const char *str, register unsigned int len)
{
  static const unsigned char asso_values[] =
    {
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65,  5,
      65, 65, 65, 65, 65, 65, 35, 65, 65, 65,
       0, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65,  0, 65,  0, 65,  5,
      20, 15, 10, 30, 65, 15, 65, 65, 20,  0,
      10, 35, 20, 65, 10,  5,  0, 10,  5, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
      65, 65, 65, 65, 65, 65
    };
  return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]];
}

#ifdef __GNUC__
__inline
#endif
const struct resword *
is_reserved_word (register const char *str, register unsigned int len)
{
  enum
    {
      TOTAL_KEYWORDS = 43,
      MIN_WORD_LENGTH = 3,
      MAX_WORD_LENGTH = 24,
      MIN_HASH_VALUE = 3,
      MAX_HASH_VALUE = 64
    };

  static const struct resword wordlist[] =
    {
      {""}, {""}, {""},
#line 26 "scripts/genksyms/keywords.gperf"
      {"asm", ASM_KEYW},
      {""},
#line 8 "scripts/genksyms/keywords.gperf"
      {"__asm", ASM_KEYW},
      {""},
#line 9 "scripts/genksyms/keywords.gperf"
      {"__asm__", ASM_KEYW},
      {""}, {""},
#line 52 "scripts/genksyms/keywords.gperf"
      {"__typeof__", TYPEOF_KEYW},
      {""},
#line 12 "scripts/genksyms/keywords.gperf"
      {"__const", CONST_KEYW},
#line 11 "scripts/genksyms/keywords.gperf"
      {"__attribute__", ATTRIBUTE_KEYW},
#line 13 "scripts/genksyms/keywords.gperf"
      {"__const__", CONST_KEYW},
#line 18 "scripts/genksyms/keywords.gperf"
      {"__signed__", SIGNED_KEYW},
#line 44 "scripts/genksyms/keywords.gperf"
      {"static", STATIC_KEYW},
#line 20 "scripts/genksyms/keywords.gperf"
      {"__volatile__", VOLATILE_KEYW},
#line 39 "scripts/genksyms/keywords.gperf"
      {"int", INT_KEYW},
#line 32 "scripts/genksyms/keywords.gperf"
      {"char", CHAR_KEYW},
#line 33 "scripts/genksyms/keywords.gperf"
      {"const", CONST_KEYW},
#line 45 "scripts/genksyms/keywords.gperf"
      {"struct", STRUCT_KEYW},
#line 24 "scripts/genksyms/keywords.gperf"
      {"__restrict__", RESTRICT_KEYW},
#line 25 "scripts/genksyms/keywords.gperf"
      {"restrict", RESTRICT_KEYW},
#line 23 "scripts/genksyms/keywords.gperf"
      {"_restrict", RESTRICT_KEYW},
#line 16 "scripts/genksyms/keywords.gperf"
      {"__inline__", INLINE_KEYW},
#line 10 "scripts/genksyms/keywords.gperf"
      {"__attribute", ATTRIBUTE_KEYW},
      {""},
#line 14 "scripts/genksyms/keywords.gperf"
      {"__extension__", EXTENSION_KEYW},
#line 35 "scripts/genksyms/keywords.gperf"
      {"enum", ENUM_KEYW},
#line 19 "scripts/genksyms/keywords.gperf"
      {"__volatile", VOLATILE_KEYW},
#line 36 "scripts/genksyms/keywords.gperf"
      {"extern", EXTERN_KEYW},
      {""},
#line 17 "scripts/genksyms/keywords.gperf"
      {"__signed", SIGNED_KEYW},
#line 7 "scripts/genksyms/keywords.gperf"
      {"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
      {""},
#line 51 "scripts/genksyms/keywords.gperf"
      {"typeof", TYPEOF_KEYW},
#line 46 "scripts/genksyms/keywords.gperf"
      {"typedef", TYPEDEF_KEYW},
#line 15 "scripts/genksyms/keywords.gperf"
      {"__inline", INLINE_KEYW},
#line 31 "scripts/genksyms/keywords.gperf"
      {"auto", AUTO_KEYW},
#line 47 "scripts/genksyms/keywords.gperf"
      {"union", UNION_KEYW},
      {""}, {""},
#line 48 "scripts/genksyms/keywords.gperf"
      {"unsigned", UNSIGNED_KEYW},
#line 49 "scripts/genksyms/keywords.gperf"
      {"void", VOID_KEYW},
#line 42 "scripts/genksyms/keywords.gperf"
      {"short", SHORT_KEYW},
      {""}, {""},
#line 50 "scripts/genksyms/keywords.gperf"
      {"volatile", VOLATILE_KEYW},
      {""},
#line 37 "scripts/genksyms/keywords.gperf"
      {"float", FLOAT_KEYW},
#line 34 "scripts/genksyms/keywords.gperf"
      {"double", DOUBLE_KEYW},
      {""},
#line 5 "scripts/genksyms/keywords.gperf"
      {"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
      {""}, {""},
#line 38 "scripts/genksyms/keywords.gperf"
      {"inline", INLINE_KEYW},
#line 6 "scripts/genksyms/keywords.gperf"
      {"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
#line 41 "scripts/genksyms/keywords.gperf"
      {"register", REGISTER_KEYW},
      {""},
#line 22 "scripts/genksyms/keywords.gperf"
      {"_Bool", BOOL_KEYW},
#line 43 "scripts/genksyms/keywords.gperf"
      {"signed", SIGNED_KEYW},
      {""}, {""},
#line 40 "scripts/genksyms/keywords.gperf"
      {"long", LONG_KEYW}
    };

  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
    {
      register int key = is_reserved_hash (str, len);

      if (key <= MAX_HASH_VALUE && key >= 0)
        {
          register const char *s = wordlist[key].name;

          if (*str == *s && !strcmp (str + 1, s + 1))
            return &wordlist[key];
        }
    }
  return 0;
}
