1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "globals.h"
6 #include "parse.h"
7 #include "dfa.h"
8 #include "mbo_getopt.h"
9
10 const char *fileName = 0;
11 char *outputFileName = 0;
12 int sFlag = 0;
13 int bFlag = 0;
14 int dFlag = 0;
15 int iFlag = 0;
16 int bUsedYYAccept = 0;
17 unsigned int oline = 1;
18 unsigned int maxFill = 1;
19 int vFillIndexes = -1;
20 unsigned char *vUsedLabels;
21 unsigned int vUsedLabelAlloc = 1000;
22
23 static char *opt_arg = NULL;
24 static int opt_ind = 1;
25
26 static const mbo_opt_struct OPTIONS[] = {
27 {'?', 0, "help"},
28 {'b', 0, "bit-vectors"},
29 {'d', 0, "debug-output"},
30 {'e', 0, "ecb"},
31 {'f', 0, "storable-state"},
32 {'h', 0, "help"},
33 {'i', 0, "no-debug-info"},
34 {'o', 1, "output"},
35 {'s', 0, "nested-ifs"},
36 {'v', 0, "version"},
37 {'-', 0, NULL} /* end of args */
38 };
39
usage()40 static void usage()
41 {
42 fprintf(stderr,
43 "usage: re2c [-esbvhd] file\n"
44 "\n"
45 "-? -h --help Display this info.\n"
46 "\n"
47 "-b --bit-vectors Implies -s. Use bit vectors as well in the attempt to\n"
48 " coax better code out of the compiler. Most useful for\n");
49 fprintf(stderr,
50 " specifications with more than a few keywords (e.g. for\n"
51 " most programming languages).\n"
52 "\n"
53 "-e --ecb Cross-compile from an ASCII platform to\n"
54 " an EBCDIC one.\n"
55 "\n");
56 fprintf(stderr,
57 "-s --nested-ifs Generate nested ifs for some switches. Many compilers\n"
58 " need this assist to generate better code.\n"
59 "\n"
60 "-f --storable-state Generate a scanner with support for storable state\n"
61 "\n"
62 "-o --output=output Specify the output file instead of stdout\n"
63 "\n");
64 fprintf(stderr,
65 "-d --debug-output Creates a parser that dumps information during\n"
66 " about the current position and in which state the\n"
67 " parser is.\n"
68 "\n"
69 "-i --no-debug-info Do not generate '#line' info (usefull for versioning).\n"
70 "\n"
71 "-v --version Show version information.\n"
72 "-V --vernum Show version as one number.\n");
73 }
74
75 char *
mystrdup(const char * str)76 mystrdup(const char *str)
77 {
78 size_t len;
79 char *copy;
80
81 len = strlen(str) + 1;
82 copy = malloc(len);
83 memcpy(copy, str, len);
84 return (copy);
85 }
86
main(int argc,char * argv[])87 int main(int argc, char *argv[])
88 {
89 int c;
90 FILE *f, *output;
91
92 fileName = NULL;
93
94 if(argc == 1) {
95 usage();
96 return 2;
97 }
98
99 while ((c = mbo_getopt(argc, argv, OPTIONS, &opt_arg, &opt_ind, 0))!=-1) {
100 switch (c) {
101 case 'b':
102 sFlag = 1;
103 bFlag = 1;
104 break;
105 case 'e':
106 xlat = asc2ebc;
107 talx = ebc2asc;
108 break;
109 case 's':
110 sFlag = 1;
111 break;
112 case 'd':
113 dFlag = 1;
114 break;
115 case 'f':
116 vFillIndexes = 0;
117 break;
118 case 'i':
119 iFlag = 1;
120 break;
121 case 'o':
122 outputFileName = opt_arg;
123 break;
124 case 'v':
125 fputs("re2c " PACKAGE_VERSION "\n", stdout);
126 break;
127 case 'V': {
128 int v1, v2, v3;
129 sscanf(PACKAGE_VERSION, "%d.%d.%d", &v1, &v2, &v3);
130 fprintf(stdout, "%02d%02d%02d\n", v1, v2, v3);
131 return 2;
132 }
133 case 'h':
134 case '?':
135 default:
136 usage();
137 return 2;
138 }
139 }
140
141 if (argc == opt_ind + 1) {
142 fileName = argv[opt_ind];
143 } else {
144 usage();
145 return 2;
146 }
147
148 vUsedLabels = calloc(vUsedLabelAlloc, 1);
149 if (!vUsedLabels) {
150 fputs("Out of memory.\n", stderr);
151 return 1;
152 }
153
154 /* set up the input stream */
155 if(fileName[0] == '-' && fileName[1] == '\0'){
156 fileName = "<stdin>";
157 f = stdin;
158 } else {
159 if((f = fopen(fileName, "rt")) == NULL){
160 fprintf(stderr, "can't open %s\n", fileName);
161 return 1;
162 }
163 }
164
165 /* set up the output stream */
166 if (outputFileName == 0 || (fileName[0] == '-' && fileName[1] == '\0')) {
167 outputFileName = mystrdup("<stdout>");
168 output = stdout;
169 } else {
170 int len;
171 char *src, *dst, *tmp;
172
173 output = fopen(outputFileName, "wt");
174 if (!output) {
175 fprintf(stderr, "can't open %s\n", outputFileName);
176 return 1;
177 }
178
179 len = strlen(outputFileName);
180 tmp = (char*)malloc((len+1)*2);
181
182 for (src = outputFileName, dst = tmp; *src; ++src)
183 {
184 if (*src == '\\')
185 *dst++ = *src;
186 *dst++ = *src;
187 }
188 *dst = '\0';
189
190 outputFileName = tmp;
191 }
192
193 parse(f, output);
194 free(outputFileName);
195 return 0;
196 }
197