12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- // 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);
- }
- }
|