+/*
+ * 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"
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;
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;
+ }
}