OSDN Git Service

Add -h and -L to file.
[android-x86/external-toybox.git] / scripts / mktags.c
1 // Process TAGGED_ARRAY() macros to emit TAG_STRING index macros.
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <ctype.h>
7
8 int main(int argc, char *argv[])
9 {
10   char *tag = 0;
11   int idx = 0;
12
13   for (;;) {
14     char *line = 0, *s;
15     ssize_t len;
16
17     len = getline(&line, &len, stdin);
18     if (len<0) break;
19     while (len && isspace(line[len-1])) line[--len]=0;
20
21     // Very simple parser: If we haven't got a TAG then first line is TAG.
22     // Then look for { followed by "str" (must be on same line, may have
23     // more than one per line), for each one emit #define. Current TAG ended
24     // by ) at start of line.
25
26     if (!tag) {
27       if (!isalpha(*line)) {
28         fprintf(stderr, "bad tag %s\n", line);
29         exit(1);
30       }
31       tag = strdup(line);
32       idx = 0;
33
34       continue;
35     }
36
37     for (s = line; isspace(*s); s++);
38     if (*s == ')') tag = 0;
39     else for (;;) {
40       char *start;
41
42       while (*s && *s != '{') s++;
43       while (*s && *s != '"') s++;
44       if (!*s) break;
45
46       start = ++s;
47       while (*s && *s != '"') {
48         if (!isalpha(*s) && !isdigit(*s)) *s = '_';
49         s++;
50       }
51       printf("#define %s_%*.*s %d\n", tag, -40, (int)(s-start), start, idx);
52       printf("#define _%s_%*.*s (1%s<<%d)\n", tag, -39, (int)(s-start), start,
53         idx>31 ? "LL": "", idx);
54       idx++;
55     }
56     free(line);
57   }
58 }