#!/bin/awk -f
#
-# Copyright © 2021, 2023 Nick Bowler
+# Copyright © 2021, 2023-2024 Nick Bowler
#
# Generate a function to return the C keyword corresponding to a specifier
# type as a string, for internal use by the output routines.
BEGIN {
kinds["TYPE"] = kinds["STOR"] = kinds["QUAL"] = kinds["FUNC"] = 1;
- count = maxwidth = 0;
+ count = 0;
}
# Locate all the relevant identifiers in cdecl.h. We assume everything
if (parts[2] in kinds) {
kind_counts[parts[2]]++;
specs[count++] = parts[3];
-
- if (length(parts[3]) > maxwidth)
- maxwidth = length(parts[3]);
}
}
if (specs[i] == "IDENT")
s = "0";
else
- s = "T_" substr(specs[i] " ", 1, maxwidth) " & 0xff";
+ s = "PACK_TOKEN(T_" specs[i] ")";
offset_table = offset_table s suffix;
}
print "static const char *spec_string(unsigned type)"
print "{"
- print "\tstatic const uint_least8_t idx[] = {";
+ print "\tstatic const unsigned char _Alignas(1) idx[] = {";
print "\t\t" offset_table;
print "\t};\n";
print "\tassert(x < sizeof idx);";
print "\tif (!(x = idx[x]))";
print "\t\treturn \"\";";
- print "\tif (T_" specs[0] " >= 256)";
- print "\t\tx += 256;";
- print "\treturn cdecl__token_name(x);";
+ print "\treturn cdecl__token_name(UNPACK_TOKEN(x));";
print "}";
}