#include <string.h>
#include <inttypes.h>
#include "cdecl-internal.h"
+#include "cdecl.h"
#include "parse.h"
static const struct keyword *in_word_set();
%struct-type
struct keyword {
- uint_least8_t token;
+ uint_least16_t val;
};
%%
-_Bool, PACK_TOKEN(T_BOOL )
-_Complex, PACK_TOKEN(T_COMPLEX )
-_Imaginary, PACK_TOKEN(T_IMAGINARY)
-auto, PACK_TOKEN(T_AUTO )
-char, PACK_TOKEN(T_CHAR )
-const, PACK_TOKEN(T_CONST )
-double, PACK_TOKEN(T_DOUBLE )
-enum, PACK_TOKEN(T_ENUM )
-extern, PACK_TOKEN(T_EXTERN )
-float, PACK_TOKEN(T_FLOAT )
-inline, PACK_TOKEN(T_INLINE )
-int, PACK_TOKEN(T_INT )
-long, PACK_TOKEN(T_LONG )
-register, PACK_TOKEN(T_REGISTER )
-restrict, PACK_TOKEN(T_RESTRICT )
-short, PACK_TOKEN(T_SHORT )
-signed, PACK_TOKEN(T_SIGNED )
-static, PACK_TOKEN(T_STATIC )
-struct, PACK_TOKEN(T_STRUCT )
-typedef, PACK_TOKEN(T_TYPEDEF )
-union, PACK_TOKEN(T_UNION )
-unsigned, PACK_TOKEN(T_UNSIGNED )
-void, PACK_TOKEN(T_VOID )
-volatile, PACK_TOKEN(T_VOLATILE )
+_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 ) | 0x80
-as, PACK_TOKEN(T_AS ) | 0x80
-declare, PACK_TOKEN(T_DECLARE ) | 0x80
-function, PACK_TOKEN(T_FUNCTION ) | 0x80
-of, PACK_TOKEN(T_OF ) | 0x80
-pointer, PACK_TOKEN(T_POINTER ) | 0x80
-returning, PACK_TOKEN(T_RETURNING) | 0x80
-to, PACK_TOKEN(T_TO ) | 0x80
-type, PACK_TOKEN(T_TYPE ) | 0x80
-variable-length, PACK_TOKEN(T_VLA ) | 0x80
+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
%%
-int cdecl__to_keyword(const char *s, int len, int english_mode)
+unsigned cdecl__to_keyword(const char *s, int len, int english_mode)
{
const struct keyword *k;
if ((k = in_word_set(s, len))) {
- unsigned x = (k->token & 0x7fu);
+ uint_least16_t x = k->val;
- if (english_mode || !(k->token & ~0x7fu)) {
- return UNPACK_TOKEN(x);
+ if (english_mode || !(x & 0x8000)) {
+ return x & 0x7fff;
}
}
- return T_IDENT;
+ return (PACK_TOKEN(T_IDENT)<<8);
}
static const char *wordlist_func(const struct keyword *k)
{
- unsigned x = k->token & 0x7f;
+ unsigned x = (k->val >> 8) & 0x7f;
if (!x)
return NULL;