]> git.xonotic.org Git - xonotic/gmqcc.git/blob - main.c
Merge branch 'master' into blub/bc3
[xonotic/gmqcc.git] / main.c
1 /*
2  * Copyright (C) 2012
3  *     Dale Weiler
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy of
6  * this software and associated documentation files (the "Software"), to deal in
7  * the Software without restriction, including without limitation the rights to
8  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9  * of the Software, and to permit persons to whom the Software is furnished to do
10  * so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in all
13  * copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23 #include "gmqcc.h"
24
25 static const char *output = "progs.dat";
26 static const char *input  = NULL;
27
28 #define OptReq(opt, body)                                         \
29     case opt:                                                     \
30         if (argv[0][2]) argarg = argv[0]+2;                       \
31         else {                                                    \
32             if (argc < 2) {                                       \
33                 printf("option -%c requires an argument\n", opt); \
34                 exit(1);                                          \
35             }                                                     \
36             argarg = argv[1];                                     \
37             --argc;                                               \
38             ++argv;                                               \
39         }                                                         \
40         do { body } while (0);                                    \
41         break;
42
43 #define LongReq(opt, body)                                   \
44     if (!strcmp(argv[0], opt)) {                             \
45         if (argc < 2) {                                      \
46             printf("option " opt " requires an argument\n"); \
47             exit(1);                                         \
48         }                                                    \
49         argarg = argv[1];                                    \
50         --argc;                                              \
51         ++argv;                                              \
52         do { body } while (0);                               \
53         break;                                               \
54     } else if (!strncmp(argv[0], opt "=", sizeof(opt "=")))  \
55     {                                                        \
56         argarg = argv[0] + sizeof(opt "=");                  \
57         do { body } while (0);                               \
58         break;                                               \
59     }
60
61 bool parser_compile(const char *filename, const char *datfile);
62 int main(int argc, char **argv) {
63     const char *argarg;
64     char opt;
65
66     util_debug("COM", "starting ...\n");
67
68     --argc;
69     ++argv;
70     while (argc > 0) {
71         if (argv[0][0] == '-') {
72             opt = argv[0][1];
73             switch (opt)
74             {
75                 OptReq('o', output = argarg; );
76                 case '-':
77                     LongReq("--output", output = argarg; );
78                 default:
79                     printf("Unrecognized option: %s\n", argv[0]);
80                     break;
81             }
82         }
83         else
84         {
85             if (input) {
86                 printf("Onlyh 1 input file allowed\n");
87                 exit(1);
88             }
89             input = argv[0];
90         }
91         --argc;
92         ++argv;
93     }
94
95     if (!input) {
96         printf("must specify an input file\n");
97     }
98
99     if (!parser_compile(input, output)) {
100         printf("There were compile errors\n");
101     }
102
103     util_debug("COM", "cleaning ...\n");
104
105     util_meminfo();
106     return 0;
107 }