| // Process TAGGED_ARRAY() macros to emit TAG_STRING index macros. |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <ctype.h> |
| |
| int main(int argc, char *argv[]) |
| { |
| char *tag = 0; |
| int idx = 0; |
| |
| for (;;) { |
| char *line = 0, *s; |
| ssize_t len; |
| |
| len = getline(&line, (void *)&len, stdin); |
| if (len<0) break; |
| while (len && isspace(line[len-1])) line[--len]=0; |
| |
| // Very simple parser: If we haven't got a TAG then first line is TAG. |
| // Then look for { followed by "str" (must be on same line, may have |
| // more than one per line), for each one emit #define. Current TAG ended |
| // by ) at start of line. |
| |
| if (!tag) { |
| if (!isalpha(*line)) { |
| fprintf(stderr, "bad tag %s\n", line); |
| exit(1); |
| } |
| tag = strdup(line); |
| idx = 0; |
| |
| continue; |
| } |
| |
| for (s = line; isspace(*s); s++); |
| if (*s == ')') tag = 0; |
| else for (;;) { |
| char *start; |
| |
| while (*s && *s != '{') s++; |
| while (*s && *s != '"') s++; |
| if (!*s) break; |
| |
| start = ++s; |
| while (*s && *s != '"') { |
| if (!isalpha(*s) && !isdigit(*s)) *s = '_'; |
| s++; |
| } |
| printf("#define %s_%*.*s %d\n", tag, -40, (int)(s-start), start, idx); |
| printf("#define _%s_%*.*s (1%s<<%d)\n", tag, -39, (int)(s-start), start, |
| idx>31 ? "LL": "", idx); |
| idx++; |
| } |
| free(line); |
| } |
| } |