GNU Octave  6.2.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
oct-gperf.h
Go to the documentation of this file.
1 /* C++ code produced by gperf version 3.1 */
2 /* Command-line: gperf -t -C -D -G -L C++ -Z octave_kw_hash ../libinterp/parse-tree/octave.gperf */
3 /* Computed positions: -k'1,5' */
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-gperf@gnu.org>."
30 #endif
31 
32 #line 1 "../libinterp/parse-tree/octave.gperf"
33 
34 
35 ////////////////////////////////////////////////////////////////////////
36 //
37 // Copyright (C) 1995-2021 The Octave Project Developers
38 //
39 // See the file COPYRIGHT.md in the top-level directory of this
40 // distribution or <https://octave.org/copyright/>.
41 //
42 // This file is part of Octave.
43 //
44 // Octave is free software: you can redistribute it and/or modify it
45 // under the terms of the GNU General Public License as published by
46 // the Free Software Foundation, either version 3 of the License, or
47 // (at your option) any later version.
48 //
49 // Octave is distributed in the hope that it will be useful, but
50 // WITHOUT ANY WARRANTY; without even the implied warranty of
51 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
52 // GNU General Public License for more details.
53 //
54 // You should have received a copy of the GNU General Public License
55 // along with Octave; see the file COPYING. If not, see
56 // <https://www.gnu.org/licenses/>.
57 //
58 // NOTE: gperf 2.7.2 will silently generate bad code if there are blank
59 // lines following the "%{" marker above. This comment block seems to be
60 // handled correctly.
61 //
62 ////////////////////////////////////////////////////////////////////////
63 
64 enum octave_kw_id
65 {
66  break_kw,
67  case_kw,
68  catch_kw,
69  classdef_kw,
70  continue_kw,
71  do_kw,
72  else_kw,
73  elseif_kw,
74  end_kw,
75  end_try_catch_kw,
76  end_unwind_protect_kw,
77  endclassdef_kw,
78  endenumeration_kw,
79  endevents_kw,
80  endfor_kw,
81  endfunction_kw,
82  endif_kw,
83  endmethods_kw,
84  endparfor_kw,
85  endproperties_kw,
86  endswitch_kw,
87  endwhile_kw,
88  enumeration_kw,
89  events_kw,
90  for_kw,
91  function_kw,
92  get_kw,
93  global_kw,
94  if_kw,
95  magic_file_kw,
96  magic_line_kw,
97  methods_kw,
98  otherwise_kw,
99  parfor_kw,
100  persistent_kw,
101  properties_kw,
102  return_kw,
103  set_kw,
104  switch_kw,
105  try_kw,
106  until_kw,
107  unwind_protect_kw,
108  unwind_protect_cleanup_kw,
109  while_kw
110 };
111 
112 #line 82 "../libinterp/parse-tree/octave.gperf"
113 struct octave_kw { const char *name; int tok; octave_kw_id kw_id; };
114 
115 #define TOTAL_KEYWORDS 44
116 #define MIN_WORD_LENGTH 2
117 #define MAX_WORD_LENGTH 22
118 #define MIN_HASH_VALUE 2
119 #define MAX_HASH_VALUE 68
120 /* maximum key range = 67, duplicates = 0 */
121 
122 class octave_kw_hash
123 {
124 private:
125  static inline unsigned int hash (const char *str, size_t len);
126 public:
127  static const struct octave_kw *in_word_set (const char *str, size_t len);
128 };
129 
130 inline unsigned int
131 octave_kw_hash::hash (const char *str, size_t len)
132 {
133  static const unsigned char asso_values[] =
134  {
135  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
136  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
137  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
138  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
139  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
140  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
141  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
142  69, 69, 69, 69, 69, 69, 55, 69, 5, 69,
143  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
144  69, 69, 69, 69, 69, 5, 69, 50, 0, 5,
145  0, 0, 45, 5, 50, 15, 69, 0, 25, 0,
146  0, 20, 5, 69, 25, 30, 10, 35, 10, 15,
147  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
148  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
149  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
150  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
151  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
152  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
153  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
154  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
155  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
156  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
157  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
158  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
159  69, 69, 69, 69, 69, 69, 69, 69, 69, 69,
160  69, 69, 69, 69, 69, 69
161  };
162  unsigned int hval = len;
163 
164  switch (hval)
165  {
166  default:
167  hval += asso_values[static_cast<unsigned char>(str[4])];
168  /*FALLTHROUGH*/
169  case 4:
170  case 3:
171  case 2:
172  case 1:
173  hval += asso_values[static_cast<unsigned char>(str[0])];
174  break;
175  }
176  return hval;
177 }
178 
179 static const struct octave_kw wordlist[] =
180  {
181 #line 90 "../libinterp/parse-tree/octave.gperf"
182  {"do", DO, do_kw},
183 #line 93 "../libinterp/parse-tree/octave.gperf"
184  {"end", END, end_kw},
185 #line 91 "../libinterp/parse-tree/octave.gperf"
186  {"else", ELSE, else_kw},
187 #line 85 "../libinterp/parse-tree/octave.gperf"
188  {"break", BREAK, break_kw},
189 #line 111 "../libinterp/parse-tree/octave.gperf"
190  {"get", GET, get_kw},
191 #line 86 "../libinterp/parse-tree/octave.gperf"
192  {"case", CASE, case_kw},
193 #line 102 "../libinterp/parse-tree/octave.gperf"
194  {"endmethods", END, endmethods_kw},
195 #line 107 "../libinterp/parse-tree/octave.gperf"
196  {"enumeration", ENUMERATION, enumeration_kw},
197 #line 122 "../libinterp/parse-tree/octave.gperf"
198  {"try", TRY, try_kw},
199 #line 97 "../libinterp/parse-tree/octave.gperf"
200  {"endenumeration", END, endenumeration_kw},
201 #line 118 "../libinterp/parse-tree/octave.gperf"
202  {"properties", PROPERTIES, properties_kw},
203 #line 108 "../libinterp/parse-tree/octave.gperf"
204  {"events", EVENTS, events_kw},
205 #line 113 "../libinterp/parse-tree/octave.gperf"
206  {"if", IF, if_kw},
207 #line 128 "../libinterp/parse-tree/octave.gperf"
208  {"__LINE__", NUM, magic_line_kw},
209 #line 98 "../libinterp/parse-tree/octave.gperf"
210  {"endevents", END, endevents_kw},
211 #line 126 "../libinterp/parse-tree/octave.gperf"
212  {"while", WHILE, while_kw},
213 #line 92 "../libinterp/parse-tree/octave.gperf"
214  {"elseif", ELSEIF, elseif_kw},
215 #line 94 "../libinterp/parse-tree/octave.gperf"
216  {"end_try_catch", END, end_try_catch_kw},
217 #line 105 "../libinterp/parse-tree/octave.gperf"
218  {"endswitch", END, endswitch_kw},
219 #line 99 "../libinterp/parse-tree/octave.gperf"
220  {"endfor", END, endfor_kw},
221 #line 114 "../libinterp/parse-tree/octave.gperf"
222  {"methods", METHODS, methods_kw},
223 #line 89 "../libinterp/parse-tree/octave.gperf"
224  {"continue", CONTINUE, continue_kw},
225 #line 117 "../libinterp/parse-tree/octave.gperf"
226  {"persistent", PERSISTENT, persistent_kw},
227 #line 116 "../libinterp/parse-tree/octave.gperf"
228  {"parfor", PARFOR, parfor_kw},
229 #line 120 "../libinterp/parse-tree/octave.gperf"
230  {"set", SET, set_kw},
231 #line 96 "../libinterp/parse-tree/octave.gperf"
232  {"endclassdef", END, endclassdef_kw},
233 #line 104 "../libinterp/parse-tree/octave.gperf"
234  {"endproperties", END, endproperties_kw},
235 #line 121 "../libinterp/parse-tree/octave.gperf"
236  {"switch", SWITCH, switch_kw},
237 #line 88 "../libinterp/parse-tree/octave.gperf"
238  {"classdef", CLASSDEF, classdef_kw},
239 #line 100 "../libinterp/parse-tree/octave.gperf"
240  {"endfunction", END, endfunction_kw},
241 #line 109 "../libinterp/parse-tree/octave.gperf"
242  {"for", FOR, for_kw},
243 #line 124 "../libinterp/parse-tree/octave.gperf"
244  {"unwind_protect", UNWIND, unwind_protect_kw},
245 #line 101 "../libinterp/parse-tree/octave.gperf"
246  {"endif", END, endif_kw},
247 #line 95 "../libinterp/parse-tree/octave.gperf"
248  {"end_unwind_protect", END, end_unwind_protect_kw},
249 #line 115 "../libinterp/parse-tree/octave.gperf"
250  {"otherwise", OTHERWISE, otherwise_kw},
251 #line 119 "../libinterp/parse-tree/octave.gperf"
252  {"return", FUNC_RET, return_kw},
253 #line 125 "../libinterp/parse-tree/octave.gperf"
254  {"unwind_protect_cleanup", CLEANUP, unwind_protect_cleanup_kw},
255 #line 106 "../libinterp/parse-tree/octave.gperf"
256  {"endwhile", END, endwhile_kw},
257 #line 103 "../libinterp/parse-tree/octave.gperf"
258  {"endparfor", END, endparfor_kw},
259 #line 87 "../libinterp/parse-tree/octave.gperf"
260  {"catch", CATCH, catch_kw},
261 #line 112 "../libinterp/parse-tree/octave.gperf"
262  {"global", GLOBAL, global_kw},
263 #line 110 "../libinterp/parse-tree/octave.gperf"
264  {"function", FCN, function_kw},
265 #line 123 "../libinterp/parse-tree/octave.gperf"
266  {"until", UNTIL, until_kw},
267 #line 127 "../libinterp/parse-tree/octave.gperf"
268  {"__FILE__", DQ_STRING, magic_file_kw}
269  };
270 
271 static const signed char gperf_lookup[] =
272  {
273  -1, -1, 0, 1, 2, 3, -1, -1, 4, 5, 6, 7, -1, 8,
274  9, 10, 11, 12, 13, 14, 15, 16, -1, 17, 18, -1, 19, 20,
275  21, -1, 22, 23, -1, 24, -1, -1, 25, -1, 26, -1, -1, 27,
276  -1, 28, -1, -1, 29, -1, 30, 31, 32, -1, -1, 33, 34, -1,
277  35, 36, 37, 38, 39, 40, -1, 41, -1, 42, -1, -1, 43
278  };
279 
280 const struct octave_kw *
281 octave_kw_hash::in_word_set (const char *str, size_t len)
282 {
283  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
284  {
285  unsigned int key = hash (str, len);
286 
287  if (key <= MAX_HASH_VALUE)
288  {
289  int index = gperf_lookup[key];
290 
291  if (index >= 0)
292  {
293  const char *s = wordlist[index].name;
294 
295  if (*str == *s && !strcmp (str + 1, s + 1))
296  return &wordlist[index];
297  }
298  }
299  }
300  return 0;
301 }