%{ /* * Copyright © 2023-2024 Nick Bowler * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "cdecl-internal.h" #include "cdecl.h" #include "parse.h" static const struct keyword *in_word_set(); %} %readonly-tables %language=ANSI-C %7bit /* Note: the following options enable gperf-wordwrap.awk to do its thing */ %define word-array-name wordlist_wrapped %null-strings %struct-type struct keyword { uint_least16_t val; }; %% _Bool, (PACK_TOKEN(T_BOOL )<<8) | PACK_SPEC(CDECL_TYPE_BOOL) _Complex, (PACK_TOKEN(T_COMPLEX )<<8) | PACK_SPEC(CDECL_TYPE_COMPLEX) _Imaginary, (PACK_TOKEN(T_IMAGINARY)<<8) | PACK_SPEC(CDECL_TYPE_IMAGINARY) auto, (PACK_TOKEN(T_AUTO )<<8) | PACK_SPEC(CDECL_STOR_AUTO) char, (PACK_TOKEN(T_CHAR )<<8) | PACK_SPEC(CDECL_TYPE_CHAR) const, (PACK_TOKEN(T_CONST )<<8) | PACK_SPEC(CDECL_QUAL_CONST) double, (PACK_TOKEN(T_DOUBLE )<<8) | PACK_SPEC(CDECL_TYPE_DOUBLE) enum, (PACK_TOKEN(T_ENUM )<<8) | PACK_SPEC(CDECL_TYPE_ENUM) extern, (PACK_TOKEN(T_EXTERN )<<8) | PACK_SPEC(CDECL_STOR_EXTERN) float, (PACK_TOKEN(T_FLOAT )<<8) | PACK_SPEC(CDECL_TYPE_FLOAT) inline, (PACK_TOKEN(T_INLINE )<<8) | PACK_SPEC(CDECL_FUNC_INLINE) int, (PACK_TOKEN(T_INT )<<8) | PACK_SPEC(CDECL_TYPE_INT) long, (PACK_TOKEN(T_LONG )<<8) | PACK_SPEC(CDECL_TYPE_LONG) register, (PACK_TOKEN(T_REGISTER )<<8) | PACK_SPEC(CDECL_STOR_REGISTER) restrict, (PACK_TOKEN(T_RESTRICT )<<8) | PACK_SPEC(CDECL_QUAL_RESTRICT) short, (PACK_TOKEN(T_SHORT )<<8) | PACK_SPEC(CDECL_TYPE_SHORT) signed, (PACK_TOKEN(T_SIGNED )<<8) | PACK_SPEC(CDECL_TYPE_SIGNED) static, (PACK_TOKEN(T_STATIC )<<8) | PACK_SPEC(CDECL_STOR_STATIC) struct, (PACK_TOKEN(T_STRUCT )<<8) | PACK_SPEC(CDECL_TYPE_STRUCT) typedef, (PACK_TOKEN(T_TYPEDEF )<<8) | PACK_SPEC(CDECL_STOR_TYPEDEF) union, (PACK_TOKEN(T_UNION )<<8) | PACK_SPEC(CDECL_TYPE_UNION) unsigned, (PACK_TOKEN(T_UNSIGNED )<<8) | PACK_SPEC(CDECL_TYPE_UNSIGNED) void, (PACK_TOKEN(T_VOID )<<8) | PACK_SPEC(CDECL_TYPE_VOID) volatile, (PACK_TOKEN(T_VOLATILE )<<8) | PACK_SPEC(CDECL_QUAL_VOLATILE) # english keywords array, (PACK_TOKEN(T_ARRAY )<<8) | 0x8000 as, (PACK_TOKEN(T_AS )<<8) | 0x8000 declare, (PACK_TOKEN(T_DECLARE )<<8) | 0x8000 function, (PACK_TOKEN(T_FUNCTION )<<8) | 0x8000 of, (PACK_TOKEN(T_OF )<<8) | 0x8000 pointer, (PACK_TOKEN(T_POINTER )<<8) | 0x8000 returning, (PACK_TOKEN(T_RETURNING)<<8) | 0x8000 to, (PACK_TOKEN(T_TO )<<8) | 0x8000 type, (PACK_TOKEN(T_TYPE )<<8) | 0x8000 variable-length, (PACK_TOKEN(T_VLA )<<8) | 0x8000 %% unsigned cdecl__to_keyword(const char *s, int len, int english_mode) { const struct keyword *k; if ((k = in_word_set(s, len))) { uint_least16_t x = k->val; if (english_mode || !(x & 0x8000)) { return x & 0x7fff; } } return (PACK_TOKEN(T_IDENT)<<8); } static const char *wordlist_func(const struct keyword *k) { unsigned x = (k->val >> 8) & 0x7f; if (!x) return NULL; return cdecl__token_name(UNPACK_TOKEN(x)); }