1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | static struct resword { |
3 | const char *name; |
4 | int token; |
5 | } keywords[] = { |
6 | { "__GENKSYMS_EXPORT_SYMBOL" , EXPORT_SYMBOL_KEYW }, |
7 | { "__asm" , ASM_KEYW }, |
8 | { "__asm__" , ASM_KEYW }, |
9 | { "__attribute" , ATTRIBUTE_KEYW }, |
10 | { "__attribute__" , ATTRIBUTE_KEYW }, |
11 | { "__const" , CONST_KEYW }, |
12 | { "__const__" , CONST_KEYW }, |
13 | { "__extension__" , EXTENSION_KEYW }, |
14 | { "__inline" , INLINE_KEYW }, |
15 | { "__inline__" , INLINE_KEYW }, |
16 | { "__signed" , SIGNED_KEYW }, |
17 | { "__signed__" , SIGNED_KEYW }, |
18 | { "__typeof" , TYPEOF_KEYW }, |
19 | { "__typeof__" , TYPEOF_KEYW }, |
20 | { "__volatile" , VOLATILE_KEYW }, |
21 | { "__volatile__" , VOLATILE_KEYW }, |
22 | { "__builtin_va_list" , VA_LIST_KEYW }, |
23 | |
24 | { "__int128" , BUILTIN_INT_KEYW }, |
25 | { "__int128_t" , BUILTIN_INT_KEYW }, |
26 | { "__uint128_t" , BUILTIN_INT_KEYW }, |
27 | |
28 | // According to rth, c99 defines "_Bool", "__restrict", "__restrict__", "restrict". KAO |
29 | { "_Bool" , BOOL_KEYW }, |
30 | { "__restrict" , RESTRICT_KEYW }, |
31 | { "__restrict__" , RESTRICT_KEYW }, |
32 | { "restrict" , RESTRICT_KEYW }, |
33 | { "asm" , ASM_KEYW }, |
34 | |
35 | // c11 keywords that can be used at module scope |
36 | { "_Static_assert" , STATIC_ASSERT_KEYW }, |
37 | |
38 | // attribute commented out in modutils 2.4.2. People are using 'attribute' as a |
39 | // field name which breaks the genksyms parser. It is not a gcc keyword anyway. |
40 | // KAO. }, |
41 | // { "attribute", ATTRIBUTE_KEYW }, |
42 | |
43 | { "auto" , AUTO_KEYW }, |
44 | { "char" , CHAR_KEYW }, |
45 | { "const" , CONST_KEYW }, |
46 | { "double" , DOUBLE_KEYW }, |
47 | { "enum" , ENUM_KEYW }, |
48 | { "extern" , EXTERN_KEYW }, |
49 | { "float" , FLOAT_KEYW }, |
50 | { "inline" , INLINE_KEYW }, |
51 | { "int" , INT_KEYW }, |
52 | { "long" , LONG_KEYW }, |
53 | { "register" , REGISTER_KEYW }, |
54 | { "short" , SHORT_KEYW }, |
55 | { "signed" , SIGNED_KEYW }, |
56 | { "static" , STATIC_KEYW }, |
57 | { "struct" , STRUCT_KEYW }, |
58 | { "typedef" , TYPEDEF_KEYW }, |
59 | { "typeof" , TYPEOF_KEYW }, |
60 | { "union" , UNION_KEYW }, |
61 | { "unsigned" , UNSIGNED_KEYW }, |
62 | { "void" , VOID_KEYW }, |
63 | { "volatile" , VOLATILE_KEYW }, |
64 | }; |
65 | |
66 | #define NR_KEYWORDS (sizeof(keywords)/sizeof(struct resword)) |
67 | |
68 | static int is_reserved_word(register const char *str, register unsigned int len) |
69 | { |
70 | int i; |
71 | for (i = 0; i < NR_KEYWORDS; i++) { |
72 | struct resword *r = keywords + i; |
73 | int l = strlen(r->name); |
74 | if (len == l && !memcmp(str, r->name, len)) |
75 | return r->token; |
76 | } |
77 | return -1; |
78 | } |
79 | |