]> git.draconx.ca Git - cdecl99.git/blobdiff - src/typemap.c
Split up interactive/noninteractive loops.
[cdecl99.git] / src / typemap.c
index 0e5b41c49b73ee95cba18bf770e59a5345fc7c36..cab18c8e793773e52dd536eec87fa6e5821bd4ea 100644 (file)
@@ -1,3 +1,20 @@
+/*
+ *  Helpers for dealing with type specifiers.
+ *  Copyright © 2011 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
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 #include <stdio.h>
 #include <stdbool.h>
 #include "cdecl.h"
@@ -36,16 +53,6 @@ static unsigned long add_typespec(unsigned long map, struct cdecl_declspec *s)
        return map | (1ul<<s->type);
 }
 
-bool cdecl__typemap_is_valid(unsigned long map)
-{
-       switch (map) {
-#      include "validtypes.h"
-               return true;
-       }
-
-       return false;
-}
-
 unsigned long cdecl__build_typemap(struct cdecl_declspec *s)
 {
        unsigned long map = 0;
@@ -56,8 +63,27 @@ unsigned long cdecl__build_typemap(struct cdecl_declspec *s)
 
                map = add_typespec(map, c);
                if (map == -1)
-                       break;
+                       return -1;
        }
 
-       return map;
+       switch (map) {
+       case 0:
+               fprintf(stderr, "no type specifiers\n");
+               return -1;
+#      include "validtypes.h"
+               return map;
+       default:
+               fprintf(stderr, "conflicting type specifiers\n");
+               return -1;
+       }
+}
+
+const char *cdecl__explain_typemap(unsigned long map)
+{
+       switch (map) {
+#      include "typenames.h"
+       default:
+               fprintf(stderr, "invalid type specifiers\n");
+               return NULL;
+       }
 }