]> git.draconx.ca Git - cdecl99.git/blobdiff - t/normalize.c
libcdecl: Fix scanning of hexadecimal constants.
[cdecl99.git] / t / normalize.c
index 9c54d02787fce611870b4d8aa6cdd654f1b9ec0f..558f5562414c358d9079ba2906539c47a863bb4a 100644 (file)
@@ -80,9 +80,53 @@ static unsigned to_spectype(const char *tok)
        return CDECL_TYPE_IDENT;
 }
 
+static const char *to_specstring(unsigned type)
+{
+       switch (type) {
+       case CDECL_STOR_TYPEDEF: return "typedef";
+       case CDECL_STOR_EXTERN: return "extern";
+       case CDECL_STOR_STATIC: return "static";
+       case CDECL_STOR_AUTO: return "auto";
+       case CDECL_STOR_REGISTER: return "register";
+       case CDECL_FUNC_INLINE: return "inline";
+       case CDECL_QUAL_RESTRICT: return "restrict";
+       case CDECL_QUAL_VOLATILE: return "volatile";
+       case CDECL_QUAL_CONST: return "const";
+       case CDECL_TYPE_VOID: return "void";
+       case CDECL_TYPE_SIGNED: return "signed";
+       case CDECL_TYPE_UNSIGNED: return "unsigned";
+       case CDECL_TYPE_CHAR: return "char";
+       case CDECL_TYPE_SHORT: return "short";
+       case CDECL_TYPE_LONG: return "long";
+       case CDECL_TYPE_INT: return "int";
+       case CDECL_TYPE_FLOAT: return "float";
+       case CDECL_TYPE_DOUBLE: return "double";
+       case CDECL_TYPE_COMPLEX: return "_Complex";
+       case CDECL_TYPE_IMAGINARY: return "_Imaginary";
+       case CDECL_TYPE_BOOL: return "_Bool";
+       case CDECL_TYPE_STRUCT: return "struct";
+       case CDECL_TYPE_UNION: return "union";
+       case CDECL_TYPE_ENUM: return "enum";
+       }
+
+       return "";
+}
+
+static void print_spec(struct cdecl_declspec *spec)
+{
+       const char *s = to_specstring(spec->type);
+
+       printf("%s", s);
+       if (spec->ident) {
+               if (s[0])
+                       putchar(' ');
+               printf("%s", spec->ident);
+       }
+}
+
 int do_normalize(char *line, size_t n)
 {
-       struct cdecl_declspec *specs = NULL, **newspec = &specs;
+       struct cdecl_declspec *s, *specs = NULL, **newspec = &specs;
        char *tok = NULL;
 
        while ((tok = strtok(tok ? NULL : line, " "))) {
@@ -105,17 +149,13 @@ int do_normalize(char *line, size_t n)
                newspec = &spec->next;
        }
 
-       line = malloc_nofail(n);
-       line[0] = 0;
-       if (specs) {
-               char *tmp_line = line;
-               size_t tmp_n = n;
-
-               specs = cdecl__normalize_specs(specs);
-               cdecl__emit_specs(&tmp_line, &tmp_n, specs, -1);
+       specs = cdecl__normalize_specs(specs);
+       for (s = specs; s; s = s->next) {
+               print_spec(s);
+               if (s->next)
+                       putchar(' ');
        }
-       printf("%s\n", line);
-       free(line);
+       putchar('\n');
 
        while (specs) {
                struct cdecl_declspec *c = specs;