]> git.draconx.ca Git - cdecl99.git/commitdiff
Make CDECL_SPEC_TYPE non-zero.
authorNick Bowler <nbowler@draconx.ca>
Sat, 22 Oct 2011 23:53:38 +0000 (19:53 -0400)
committerNick Bowler <nbowler@draconx.ca>
Sun, 23 Oct 2011 00:20:59 +0000 (20:20 -0400)
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
src/typemap.c
src/typenames.sed
src/validtypes.sed

index a8e994687ccc6dd02c84dcc783dac465364f1fbd..1493d4db53c17f940a3c99b554a87de2eb82879d 100644 (file)
 
 /* 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. */
index b8965a1b05d816d680a2375c3099e1bbe305e30f..11048684dce7be71ba2f76b0317c82da3f1d0942 100644 (file)
@@ -18,6 +18,7 @@
 #include <config.h>
 #include <stdio.h>
 #include <stdbool.h>
+#include <assert.h>
 #include "cdecl.h"
 #include "typemap.h"
 
  * 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<<CDECL_TYPE_LLONG)) {
+               if (map & spec_bit(CDECL_TYPE_LLONG)) {
                        fprintf(stderr, "too many long specifiers\n");
                        return -1;
-               } else if (map & (1ul<<CDECL_TYPE_LONG)) {
-                       return map | (1ul<<CDECL_TYPE_LLONG);
+               } else if (map & spec_bit(CDECL_TYPE_LONG)) {
+                       return map | spec_bit(CDECL_TYPE_LLONG);
                }
        }
 
-       if (map & (1ul<<s->type)) {
+       if (map & spec_bit(s->type)) {
                fprintf(stderr, "duplicate type specifier\n");
                return -1;
        }
 
-       return map | (1ul<<s->type);
+       return map | spec_bit(s->type);
 }
 
 unsigned long cdecl__build_typemap(struct cdecl_declspec *s)
index 3b92c722fd8880c0ad875baf02754f3d058428cb..d487a48231800e69eda10da98141e818f8d073c9 100644 (file)
@@ -6,7 +6,7 @@ h
 s/_//g
 y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
 s/LONG LONG/LLONG LONG/
-s/[[:upper:]][[:upper:]]*/(1ul<<CDECL_TYPE_&)/g
+s/[[:upper:]][[:upper:]]*/(1ul<<(CDECL_TYPE_&-CDECL_SPEC_TYPE))/g
 s/ /|/g
 s/.*/case &:/
 p
index 286e89aebc1c1c609bebcbe150b4716129089797..705291564d4687b7e6d2e9604d1ca199603c41c6 100644 (file)
@@ -5,6 +5,6 @@ s/[[:space:]][[:space:]]*/ /g
 s/_//g
 y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
 s/LONG LONG/LLONG LONG/
-s/[[:upper:]][[:upper:]]*/(1ul<<CDECL_TYPE_&)/g
+s/[[:upper:]][[:upper:]]*/(1ul<<(CDECL_TYPE_&-CDECL_SPEC_TYPE))/g
 s/ /|/g
 s/.*/case &:/