#include #include void printEnumHeader(FILE *out) { fprintf(out, "enum TokenKind\n"); fprintf(out, "{\n"); } void printEnumFooter(FILE *out) { fprintf(out, "};\n"); } void printStrHeader(FILE *out) { fprintf(out, "const char *\n"); fprintf(out, "strTokenKind(enum TokenKind tokenKind)\n"); fprintf(out, "{\n"); fprintf(out, "%*sswitch (tokenKind) {\n", 4, ""); } void printStrFooter(FILE *out) { fprintf(out, "%*sdefault:\n", 4, ""); fprintf(out, "%*sfprintf(stderr, \"internal error in strTokenKind: " "tokenKind = %%d\",", 8, ""); fprintf(out, "%*stokenKind);\n", 4, ""); fprintf(out, "%*sfinalizeExit(1);\n", 4, ""); fprintf(out, "%*sreturn \"\";\n", 4, ""); fprintf(out, "%*s}\n", 4, ""); fprintf(out, "}\n"); } void usage(const char *prg) { fprintf(stderr, "usage: %s input output1 outpu2\n", prg); exit(1); } int main(int argc, char *argv[]) { if (argc != 4) { usage(argv[0]); } FILE *in = fopen(argv[1], "r"); FILE *outEnum = fopen(argv[2], "w"); FILE *outStr = fopen(argv[3], "w"); if (!in) { fprintf(stderr, "can not open input file '%s'\n", argv[1]); } if (!outEnum) { fprintf(stderr, "can not open output file '%s'\n", argv[2]); } if (!outStr) { fprintf(stderr, "can not open output file '%s'\n", argv[3]); } printEnumHeader(outEnum); printStrHeader(outStr); char *line = 0; size_t capacity = 0; ssize_t len; while ((len = getline(&line, &capacity, in)) > 0) { line[len - 2] == '\r' ? (line[len - 2] = 0) : (line[len - 1] = 0); fprintf(outEnum, "%*s%s,\n", 4, "", line); fprintf(outStr, "%*scase %s:\n", 4, "", line); fprintf(outStr, "%*sreturn \"%s\";\n", 8, "", line); } free(line); printEnumFooter(outEnum); printStrFooter(outStr); fclose(in); fclose(outEnum); fclose(outStr); }