kconfig/zconf.hash.c
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue Dec 13 23:32:39 2011 +0100 (2011-12-13)
branch1.13
changeset 2847 c0bf2319af08
parent 943 1cca90ce0481
permissions -rw-r--r--
scripts: fix dumping execution backtrace

Dumping the backtrace has been broken since changeset #652e56d6d35a:
scripts: execute each steps in a subshell

We can spawn sub-sub-shells in some cases.

The way the fault handler works is to dump the backtrace, but to avoid
printing it once for every sub-shell (which could get quite confusing),
it simply exits when it detects that it is being run in a sub-shell,
leaving to the top-level shell the work to dump the backtrace.

Because each step is executed in its own sub-shell, the variable arrays
that contain the step name, the source file and line number, are lost
when exiting the per-step sub-shell.

Hence, the backtrace is currently limited to printing only the top-level
main procedure of the shell.

Fix this thus:
- when dumping the bckatraces for the steps & the functions, remember
it was dumped, and only dump it if it was not already dumped
- at the top-level shell, print the hints

Also, rename the top-level step label.

Reported-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
(transplanted from 4193d6e6a17430a177fa88c287879c2c35e319f3)
     1 /* ANSI-C code produced by gperf version 3.0.3 */
     2 /* Command-line: gperf  */
     3 /* Computed positions: -k'1,3' */
     4 
     5 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
     6       && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
     7       && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
     8       && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
     9       && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
    10       && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
    11       && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
    12       && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
    13       && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
    14       && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
    15       && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
    16       && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
    17       && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
    18       && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
    19       && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
    20       && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
    21       && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
    22       && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
    23       && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
    24       && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
    25       && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
    26       && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
    27       && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
    28 /* The character set is not based on ISO-646.  */
    29 #error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
    30 #endif
    31 
    32 struct kconf_id;
    33 
    34 static struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
    35 /* maximum key range = 50, duplicates = 0 */
    36 
    37 #ifdef __GNUC__
    38 __inline
    39 #else
    40 #ifdef __cplusplus
    41 inline
    42 #endif
    43 #endif
    44 static unsigned int
    45 kconf_id_hash (register const char *str, register unsigned int len)
    46 {
    47   static unsigned char asso_values[] =
    48     {
    49       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    50       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    51       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    52       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    53       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    54       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    55       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    56       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    57       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    58       52, 52, 52, 52, 52, 52, 52, 52, 40,  5,
    59        0,  0,  5, 52,  0, 20, 52, 52, 10, 20,
    60        5,  0, 35, 52,  0, 30,  0, 15,  0, 52,
    61       15, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    62       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    63       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    64       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    65       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    66       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    67       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    68       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    69       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    70       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    71       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    72       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    73       52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
    74       52, 52, 52, 52, 52, 52
    75     };
    76   register int hval = len;
    77 
    78   switch (hval)
    79     {
    80       default:
    81         hval += asso_values[(unsigned char)str[2]];
    82       /*FALLTHROUGH*/
    83       case 2:
    84       case 1:
    85         hval += asso_values[(unsigned char)str[0]];
    86         break;
    87     }
    88   return hval;
    89 }
    90 
    91 struct kconf_id_strings_t
    92   {
    93     char kconf_id_strings_str2[sizeof("on")];
    94     char kconf_id_strings_str3[sizeof("env")];
    95     char kconf_id_strings_str5[sizeof("endif")];
    96     char kconf_id_strings_str6[sizeof("option")];
    97     char kconf_id_strings_str7[sizeof("endmenu")];
    98     char kconf_id_strings_str8[sizeof("optional")];
    99     char kconf_id_strings_str9[sizeof("endchoice")];
   100     char kconf_id_strings_str10[sizeof("range")];
   101     char kconf_id_strings_str11[sizeof("choice")];
   102     char kconf_id_strings_str12[sizeof("default")];
   103     char kconf_id_strings_str13[sizeof("def_bool")];
   104     char kconf_id_strings_str14[sizeof("help")];
   105     char kconf_id_strings_str16[sizeof("config")];
   106     char kconf_id_strings_str17[sizeof("def_tristate")];
   107     char kconf_id_strings_str18[sizeof("hex")];
   108     char kconf_id_strings_str19[sizeof("defconfig_list")];
   109     char kconf_id_strings_str22[sizeof("if")];
   110     char kconf_id_strings_str23[sizeof("int")];
   111     char kconf_id_strings_str27[sizeof("modules")];
   112     char kconf_id_strings_str28[sizeof("tristate")];
   113     char kconf_id_strings_str29[sizeof("menu")];
   114     char kconf_id_strings_str32[sizeof("comment")];
   115     char kconf_id_strings_str35[sizeof("menuconfig")];
   116     char kconf_id_strings_str36[sizeof("string")];
   117     char kconf_id_strings_str37[sizeof("visible")];
   118     char kconf_id_strings_str41[sizeof("prompt")];
   119     char kconf_id_strings_str42[sizeof("depends")];
   120     char kconf_id_strings_str44[sizeof("bool")];
   121     char kconf_id_strings_str46[sizeof("select")];
   122     char kconf_id_strings_str47[sizeof("boolean")];
   123     char kconf_id_strings_str48[sizeof("mainmenu")];
   124     char kconf_id_strings_str51[sizeof("source")];
   125   };
   126 static struct kconf_id_strings_t kconf_id_strings_contents =
   127   {
   128     "on",
   129     "env",
   130     "endif",
   131     "option",
   132     "endmenu",
   133     "optional",
   134     "endchoice",
   135     "range",
   136     "choice",
   137     "default",
   138     "def_bool",
   139     "help",
   140     "config",
   141     "def_tristate",
   142     "hex",
   143     "defconfig_list",
   144     "if",
   145     "int",
   146     "modules",
   147     "tristate",
   148     "menu",
   149     "comment",
   150     "menuconfig",
   151     "string",
   152     "visible",
   153     "prompt",
   154     "depends",
   155     "bool",
   156     "select",
   157     "boolean",
   158     "mainmenu",
   159     "source"
   160   };
   161 #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
   162 #ifdef __GNUC__
   163 __inline
   164 #ifdef __GNUC_STDC_INLINE__
   165 __attribute__ ((__gnu_inline__))
   166 #endif
   167 #endif
   168 struct kconf_id *
   169 kconf_id_lookup (register const char *str, register unsigned int len)
   170 {
   171   enum
   172     {
   173       TOTAL_KEYWORDS = 32,
   174       MIN_WORD_LENGTH = 2,
   175       MAX_WORD_LENGTH = 14,
   176       MIN_HASH_VALUE = 2,
   177       MAX_HASH_VALUE = 51
   178     };
   179 
   180   static struct kconf_id wordlist[] =
   181     {
   182       {-1}, {-1},
   183       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_ON,		TF_PARAM},
   184       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_OPT_ENV,	TF_OPTION},
   185       {-1},
   186       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,		T_ENDIF,	TF_COMMAND},
   187       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,		T_OPTION,	TF_COMMAND},
   188       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_ENDMENU,	TF_COMMAND},
   189       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_OPTIONAL,	TF_COMMAND},
   190       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,	T_ENDCHOICE,	TF_COMMAND},
   191       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10,		T_RANGE,	TF_COMMAND},
   192       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,		T_CHOICE,	TF_COMMAND},
   193       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
   194       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
   195       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,		T_HELP,		TF_COMMAND},
   196       {-1},
   197       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,		T_CONFIG,	TF_COMMAND},
   198       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
   199       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,		T_TYPE,		TF_COMMAND, S_HEX},
   200       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str19,	T_OPT_DEFCONFIG_LIST,TF_OPTION},
   201       {-1}, {-1},
   202       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,		T_IF,		TF_COMMAND|TF_PARAM},
   203       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,		T_TYPE,		TF_COMMAND, S_INT},
   204       {-1}, {-1}, {-1},
   205       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_OPT_MODULES,	TF_OPTION},
   206       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_TYPE,		TF_COMMAND, S_TRISTATE},
   207       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29,		T_MENU,		TF_COMMAND},
   208       {-1}, {-1},
   209       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_COMMENT,	TF_COMMAND},
   210       {-1}, {-1},
   211       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,	T_MENUCONFIG,	TF_COMMAND},
   212       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,		T_TYPE,		TF_COMMAND, S_STRING},
   213       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_VISIBLE,	TF_COMMAND},
   214       {-1}, {-1}, {-1},
   215       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_PROMPT,	TF_COMMAND},
   216       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_DEPENDS,	TF_COMMAND},
   217       {-1},
   218       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str44,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
   219       {-1},
   220       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_SELECT,	TF_COMMAND},
   221       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
   222       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str48,	T_MAINMENU,	TF_COMMAND},
   223       {-1}, {-1},
   224       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str51,		T_SOURCE,	TF_COMMAND}
   225     };
   226 
   227   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
   228     {
   229       register int key = kconf_id_hash (str, len);
   230 
   231       if (key <= MAX_HASH_VALUE && key >= 0)
   232         {
   233           register int o = wordlist[key].name;
   234           if (o >= 0)
   235             {
   236               register const char *s = o + kconf_id_strings;
   237 
   238               if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
   239                 return &wordlist[key];
   240             }
   241         }
   242     }
   243   return 0;
   244 }
   245