X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/cbf38d096b4ea7ef309efedadf6abcf6f09de7d3..31ac11cc668bb8ecc1317fd2e8bd79b7925bceeb:/src/typemap.c diff --git a/src/typemap.c b/src/typemap.c index b8965a1..a280be2 100644 --- a/src/typemap.c +++ b/src/typemap.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "cdecl.h" #include "typemap.h" @@ -28,30 +29,32 @@ * 2 times. Treat it as a special case, assigning an unused bit to represent * the second long. */ -#define CDECL_TYPE_LLONG 31 +#define CDECL_TYPE_LLONG (CDECL_SPEC_TYPE + 31) + +static inline unsigned long spec_bit(unsigned type) +{ + return 1ul << (type & (CDECL_SPEC_TYPE - 1)); +} static unsigned long add_typespec(unsigned long map, struct cdecl_declspec *s) { - if (s->type >= CDECL_TYPE_LLONG) { - fprintf(stderr, "invalid type specifier\n"); - return -1; - } + assert(s->type >= CDECL_SPEC_TYPE && s->type < CDECL_TYPE_LLONG); if (s->type == CDECL_TYPE_LONG) { - if (map & (1ul<type)) { + if (map & spec_bit(s->type)) { fprintf(stderr, "duplicate type specifier\n"); return -1; } - return map | (1ul<type); + return map | spec_bit(s->type); } unsigned long cdecl__build_typemap(struct cdecl_declspec *s) @@ -78,13 +81,3 @@ unsigned long cdecl__build_typemap(struct cdecl_declspec *s) return -1; } } - -const char *cdecl__explain_typemap(unsigned long map) -{ - switch (map) { -# include "typenames.h" - default: - fprintf(stderr, "invalid type specifiers\n"); - return NULL; - } -}