#!/bin/awk -f # # Copyright © 2021-2022, 2024 Nick Bowler # # Generate a mapping from a (random) integer to a list of type specifiers # represented by struct cdecl_declspec. Used internally by declgen to # produce random valid declarations. # # License WTFPL2: Do What The Fuck You Want To Public License, version 2. # This is free software: you are free to do what the fuck you want to. # There is NO WARRANTY, to the extent permitted by law. END { print "/*" if (FILENAME) { print " * Automatically generated by gen-typegen.awk from " FILENAME } else { print " * Automatically generated by gen-typegen.awk" } print " * Do not edit." print " */" } BEGIN { count = 0 } $0 ~ /^[abcdefghijklmnopqrstuvwxyz_]/ { for (i = 1; i <= NF; i++) { sub(/_/, "", $i) $i = "CDECL_TYPE_" toupper($i) } specs[count++] = $0 } END { print "static inline struct cdecl_declspec *"; print "gen_raw_typespec_(unsigned type, struct cdecl_declspec *next)\n{"; print "\tstruct cdecl_declspec *s = malloc_nofail(sizeof *s);"; print "\ts->type = type;"; print "\ts->next = next;"; print "\ts->ident = 0;"; print "\treturn s;\n}\n" print "static inline struct cdecl_declspec *" print "gen_raw_typespecs(unsigned rngval)\n{" print "\tswitch (rngval) {" for (i = 0; i < count; i++) { print "\tcase " i ":"; n = split(specs[i], parts); for (j = 1; j <= n; j++) { prefix = j == 1 ? "return" : ""; printf "\t\t%6s gen_raw_typespec_(%s,\n", prefix, parts[j]; } printf "\t\t%25sNULL%s;\n", "", substr("))))))))", 1, n); } print "\tdefault:\n\t\tassert(0);\n\t}" print "}\n" print "enum { GEN_TOTAL_TYPES = " count " };" }