From ee7baf59f18b5bc5be9abed0b2be90f407ee497d Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Sat, 22 Oct 2011 19:53:38 -0400 Subject: [PATCH] Make CDECL_SPEC_TYPE non-zero. This allows us to meaningfully OR together the various CDECL_SPEC_ constants. A bit of code assumes that CDECL_SPEC_TYPE is zero, so that needs to be fixed. --- src/cdecl.h | 10 +++++----- src/typemap.c | 23 +++++++++++++---------- src/typenames.sed | 2 +- src/validtypes.sed | 2 +- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/cdecl.h b/src/cdecl.h index a8e9946..1493d4d 100644 --- a/src/cdecl.h +++ b/src/cdecl.h @@ -23,10 +23,10 @@ /* Declaration specifier kinds. */ enum { - CDECL_SPEC_TYPE = 0, - CDECL_SPEC_STOR = 256, - CDECL_SPEC_QUAL = 512, - CDECL_SPEC_FUNC = 1024, + CDECL_SPEC_TYPE = 256, + CDECL_SPEC_STOR = 512, + CDECL_SPEC_QUAL = 1024, + CDECL_SPEC_FUNC = 2048, }; enum { @@ -104,7 +104,7 @@ size_t cdecl_declare(char *buf, size_t n, struct cdecl *decl); static inline int cdecl_spec_kind(struct cdecl_declspec *spec) { - return spec->type & ~0xffu; + return spec->type & ~(CDECL_SPEC_TYPE-1u); } /* Error handling. */ diff --git a/src/typemap.c b/src/typemap.c index b8965a1..1104868 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) diff --git a/src/typenames.sed b/src/typenames.sed index 3b92c72..d487a48 100644 --- a/src/typenames.sed +++ b/src/typenames.sed @@ -6,7 +6,7 @@ h s/_//g y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ s/LONG LONG/LLONG LONG/ -s/[[:upper:]][[:upper:]]*/(1ul<