oops, that commit wasn't so clean
[hrr.git] / errors.c
blobcdcb573e4243f29ed7307b2e3fa395a8e3005ff0
1 #include <stdio.h>
3 #define MAX_IDENT 256
4 #define CREATE 0
5 #define FIND 1
8 int main(int argc, char **argv) {
9 int mode;
10 int cap = 0;
11 int phase = 0;
12 int inside = 0;
13 int this_is_it = 0;
14 char ident[MAX_IDENT];
15 FILE *db;
16 char dat = 0, prev;
17 if(argc<2) {
18 printf("usage: ./errors <error_ident>|<create>\n");
19 exit(-1);
22 if(strncmp( argv[1], "create", strlen("create"))==0)
23 mode = CREATE;
24 else
25 mode = FIND;
27 if((db = fopen("errors.db", "rb")) <=0) {
28 perror("errors.db");
29 exit(-1);
32 if(mode == CREATE)
33 puts("#include <stdarg.h>\n"
34 "\n"
35 "char not_found[0xff];\n"
36 "\n"
37 "typedef struct {\n"
38 " char *ident, *body, *vars;\n"
39 "} error_t;\n"
40 "\n"
41 "error_t errors[] = {");
43 #define PULL \
44 prev = dat; \
45 if((dat= fgetc(db))<0) \
46 if(feof(db)!=0) goto done;
48 for(;;) {
49 PULL;
50 if( dat == '^' && prev != '\\') {
51 inside^=1;
52 if(inside == 0) {
53 phase++;
54 phase%=3;
55 if(mode == FIND) {
56 if(this_is_it == 1) break;
57 if((cap>0) && phase == 1) {
58 ident[cap] = 0;
59 if(strncmp(ident, argv[1], MAX_IDENT)==0)
60 this_is_it = 1;
62 cap = 0;
63 } else
64 // CLOSE
65 switch(phase) {
66 case 0:
67 puts("\"},");
68 break;
69 case 1:
70 case 2:
71 printf("\"");
72 break;
74 } else
75 if(mode == CREATE)
76 // OPEN
77 switch(phase) {
78 case 0:
79 printf(" {\"");
80 break;
81 case 1:
82 case 2:
83 printf(", \"");
85 break;
88 } else
89 if(inside == 1) {
90 if(mode == FIND) {
91 if(this_is_it == 0) {
92 ident[cap++] = dat;
93 if(cap>=MAX_IDENT-1) cap = 0;
94 } else
95 putchar(dat);
96 } else
97 switch(dat) {
98 case '\n':
99 printf("\\n");
100 break;
101 case '\t':
102 printf("\\t");
103 break;
104 case '\r':
105 printf("\\r");
106 break;
107 default:
108 putchar(dat);
109 break;
114 done:
115 if(mode == CREATE)
116 puts(
117 " { (char *)0, (char *)0, (char *)0} \n"
118 "}; \n"
119 "\n"
120 "char *get_error(char *ident, ... ) { \n"
121 " int i; \n"
122 " char *body, *vars; \n"
123 " for(i=0;;i++) { \n"
124 " if(errors[i].ident == 0) break; \n"
125 " if(strncmp( errors[i].ident, ident, strlen(ident))==0) break; \n"
126 " } \n"
127 " if(errors[i].ident == 0) {\n"
128 " snprintf(not_found, 0xff, \n"
129 " \"There is no error-text for this in errors.db, I suggest you put something there.\\n\"\n"
130 " \"The ident string is \\\"%s\\\"\", ident);\n"
131 " return not_found;\n"
132 " }\n"
133 " return errors[i].body;\n"
136 else
137 if(this_is_it == 0)
138 printf("There is no error-text for this in errors.db, I suggest you put something in there.\n"
139 "The ident string is \"%s\"\n", argv[1]);