X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/cbf38d096b4ea7ef309efedadf6abcf6f09de7d3..0c61f9637a469ac7a28b5a329551b03e6ad14d62:/src/typemap.c diff --git a/src/typemap.c b/src/typemap.c index b8965a1..918a037 100644 --- a/src/typemap.c +++ b/src/typemap.c @@ -1,6 +1,6 @@ /* * Helpers for dealing with type specifiers. - * Copyright © 2011 Nick Bowler + * Copyright © 2011, 2021 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 @@ -15,11 +15,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + #include #include #include +#include + #include "cdecl.h" -#include "typemap.h" +#include "cdecl-internal.h" /* * We can represent type specifiers as a bitmap, which gives us a finite @@ -28,30 +31,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 +83,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; - } -}