]> git.draconx.ca Git - cdecl99.git/blobdiff - src/keywords.gperf
libcdecl: Move specifier type determination into scanner.
[cdecl99.git] / src / keywords.gperf
index 3f8af8410b6b272b0826d3e1b6f53ec2d9fc64ff..d0caf8b7dd0350f21426ba6013e126cf3125b39e 100644 (file)
@@ -20,6 +20,7 @@
 #include <string.h>
 #include <inttypes.h>
 #include "cdecl-internal.h"
+#include "cdecl.h"
 #include "parse.h"
 
 static const struct keyword *in_word_set();
@@ -34,63 +35,63 @@ 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;