X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/b9b5dfbb48617d5ae852b3bc11f7be3552d7ae38..ee7baf59f18b5bc5be9abed0b2be90f407ee497d:/src/typemap.c diff --git a/src/typemap.c b/src/typemap.c index cab18c8..1104868 100644 --- a/src/typemap.c +++ b/src/typemap.c @@ -15,8 +15,10 @@ * 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" @@ -27,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)