mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 1577424bdf
			
		
	
	
		1577424bdf
		
	
	
	
	
		
			
			git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2905 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			136 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* C code produced by gperf version 2.7.2 */
 | |
| /* Command-line: gperf -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' ./keywords  */
 | |
| struct kwtable {char *name; int id[2]; enum lex_state state;};
 | |
| 
 | |
| #define TOTAL_KEYWORDS 40
 | |
| #define MIN_WORD_LENGTH 2
 | |
| #define MAX_WORD_LENGTH 8
 | |
| #define MIN_HASH_VALUE 6
 | |
| #define MAX_HASH_VALUE 55
 | |
| /* maximum key range = 50, duplicates = 0 */
 | |
| 
 | |
| #ifdef __GNUC__
 | |
| __inline
 | |
| #else
 | |
| #ifdef __cplusplus
 | |
| inline
 | |
| #endif
 | |
| #endif
 | |
| static unsigned int
 | |
| hash (str, len)
 | |
|      register const char *str;
 | |
|      register unsigned int len;
 | |
| {
 | |
|   static unsigned char asso_values[] =
 | |
|     {
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 11, 56, 56, 36, 56,  1, 37,
 | |
|       31,  1, 56, 56, 56, 56, 29, 56,  1, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56,  1, 56, 32,  1,  2,
 | |
|        1,  1,  4, 23, 56, 17, 56, 20,  9,  2,
 | |
|        9, 26, 14, 56,  5,  1,  1, 16, 56, 21,
 | |
|       20,  9, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
 | |
|       56, 56, 56, 56, 56, 56
 | |
|     };
 | |
|   register int hval = len;
 | |
| 
 | |
|   switch (hval)
 | |
|     {
 | |
|       default:
 | |
|       case 3:
 | |
|         hval += asso_values[(unsigned char)str[2]];
 | |
|       case 2:
 | |
|       case 1:
 | |
|         hval += asso_values[(unsigned char)str[0]];
 | |
|         break;
 | |
|     }
 | |
|   return hval + asso_values[(unsigned char)str[len - 1]];
 | |
| }
 | |
| 
 | |
| #ifdef __GNUC__
 | |
| __inline
 | |
| #endif
 | |
| struct kwtable *
 | |
| rb_reserved_word (str, len)
 | |
|      register const char *str;
 | |
|      register unsigned int len;
 | |
| {
 | |
|   static struct kwtable wordlist[] =
 | |
|     {
 | |
|       {""}, {""}, {""}, {""}, {""}, {""},
 | |
|       {"end", {kEND, kEND}, EXPR_END},
 | |
|       {"else", {kELSE, kELSE}, EXPR_BEG},
 | |
|       {"case", {kCASE, kCASE}, EXPR_BEG},
 | |
|       {"ensure", {kENSURE, kENSURE}, EXPR_BEG},
 | |
|       {"module", {kMODULE, kMODULE}, EXPR_BEG},
 | |
|       {"elsif", {kELSIF, kELSIF}, EXPR_BEG},
 | |
|       {"def", {kDEF, kDEF}, EXPR_FNAME},
 | |
|       {"rescue", {kRESCUE, kRESCUE_MOD}, EXPR_MID},
 | |
|       {"not", {kNOT, kNOT}, EXPR_BEG},
 | |
|       {"then", {kTHEN, kTHEN}, EXPR_BEG},
 | |
|       {"yield", {kYIELD, kYIELD}, EXPR_ARG},
 | |
|       {"for", {kFOR, kFOR}, EXPR_BEG},
 | |
|       {"self", {kSELF, kSELF}, EXPR_END},
 | |
|       {"false", {kFALSE, kFALSE}, EXPR_END},
 | |
|       {"retry", {kRETRY, kRETRY}, EXPR_END},
 | |
|       {"return", {kRETURN, kRETURN}, EXPR_MID},
 | |
|       {"true", {kTRUE, kTRUE}, EXPR_END},
 | |
|       {"if", {kIF, kIF_MOD}, EXPR_BEG},
 | |
|       {"defined?", {kDEFINED, kDEFINED}, EXPR_ARG},
 | |
|       {"super", {kSUPER, kSUPER}, EXPR_ARG},
 | |
|       {"undef", {kUNDEF, kUNDEF}, EXPR_FNAME},
 | |
|       {"break", {kBREAK, kBREAK}, EXPR_MID},
 | |
|       {"in", {kIN, kIN}, EXPR_BEG},
 | |
|       {"do", {kDO, kDO}, EXPR_BEG},
 | |
|       {"nil", {kNIL, kNIL}, EXPR_END},
 | |
|       {"until", {kUNTIL, kUNTIL_MOD}, EXPR_BEG},
 | |
|       {"unless", {kUNLESS, kUNLESS_MOD}, EXPR_BEG},
 | |
|       {"or", {kOR, kOR}, EXPR_BEG},
 | |
|       {"next", {kNEXT, kNEXT}, EXPR_MID},
 | |
|       {"when", {kWHEN, kWHEN}, EXPR_BEG},
 | |
|       {"redo", {kREDO, kREDO}, EXPR_END},
 | |
|       {"and", {kAND, kAND}, EXPR_BEG},
 | |
|       {"begin", {kBEGIN, kBEGIN}, EXPR_BEG},
 | |
|       {"__LINE__", {k__LINE__, k__LINE__}, EXPR_END},
 | |
|       {"class", {kCLASS, kCLASS}, EXPR_CLASS},
 | |
|       {"__FILE__", {k__FILE__, k__FILE__}, EXPR_END},
 | |
|       {"END", {klEND, klEND}, EXPR_END},
 | |
|       {"BEGIN", {klBEGIN, klBEGIN}, EXPR_END},
 | |
|       {"while", {kWHILE, kWHILE_MOD}, EXPR_BEG},
 | |
|       {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
 | |
|       {""},
 | |
|       {"alias", {kALIAS, kALIAS}, EXPR_FNAME}
 | |
|     };
 | |
| 
 | |
|   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
 | |
|     {
 | |
|       register int key = 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;
 | |
| }
 |