Change __signed to signed.
[dragonfly.git] / crypto / kerberosIV / lib / sl / make_cmds.c
1 /*
2  * Copyright (c) 1998-1999 Kungliga Tekniska Högskolan
3  * (Royal Institute of Technology, Stockholm, Sweden). 
4  * All rights reserved. 
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met: 
9  *
10  * 1. Redistributions of source code must retain the above copyright 
11  *    notice, this list of conditions and the following disclaimer. 
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright 
14  *    notice, this list of conditions and the following disclaimer in the 
15  *    documentation and/or other materials provided with the distribution. 
16  *
17  * 3. Neither the name of the Institute nor the names of its contributors 
18  *    may be used to endorse or promote products derived from this software 
19  *    without specific prior written permission. 
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
31  * SUCH DAMAGE. 
32  */
33
34 #include "make_cmds.h"
35 #include <getarg.h>
36
37 RCSID("$Id: make_cmds.c,v 1.6 1999/12/02 16:58:55 joda Exp $");
38
39 #include <roken.h>
40 #include <err.h>
41 #include "parse.h"
42
43 int numerror;
44 extern FILE *yyin;
45 FILE *c_file;
46
47 extern void yyparse(void);
48
49 #ifdef YYDEBUG
50 extern int yydebug = 1;
51 #endif
52
53 char *filename;
54 char *table_name;
55
56 static struct command_list *commands;
57
58 void
59 add_command(char *function, 
60             char *help, 
61             struct string_list *aliases, 
62             unsigned flags)
63 {
64     struct command_list *cl = malloc(sizeof(*cl));
65
66     if (cl == NULL)
67         err (1, "malloc");
68     cl->function = function;
69     cl->help = help;
70     cl->aliases = aliases;
71     cl->flags = flags;
72     cl->next = NULL;
73     if(commands) {
74         *commands->tail = cl;
75         commands->tail = &cl->next;
76         return;
77     }
78     cl->tail = &cl->next;
79     commands = cl;
80 }
81
82 static char *
83 quote(const char *str)
84 {
85     char buf[1024]; /* XXX */
86     const char *p;
87     char *q;
88     q = buf;
89     
90     *q++ = '\"';
91     for(p = str; *p != '\0'; p++) {
92         if(*p == '\n') {
93             *q++ = '\\';
94             *q++ = 'n';
95             continue;
96         }
97         if(*p == '\t') {
98             *q++ = '\\';
99             *q++ = 't';
100             continue;
101         }
102         if(*p == '\"' || *p == '\\')
103             *q++ = '\\';
104         *q++ = *p;
105     }
106     *q++ = '\"';
107     *q++ = '\0';
108     return strdup(buf);
109 }
110
111 static void
112 generate_commands(void)
113 {
114     char *base;
115     char *cfn;
116     char *p;
117
118     p = strrchr(table_name, '/');
119     if(p == NULL)
120         p = table_name;
121     else
122         p++;
123
124     base = strdup (p);
125     if (base == NULL)
126         err (1, "strdup");
127
128     p = strrchr(base, '.');
129     if(p)
130         *p = '\0';
131     
132     asprintf(&cfn, "%s.c", base);
133     if (cfn == NULL)
134         err (1, "asprintf");
135
136     c_file = fopen(cfn, "w");
137     if (c_file == NULL)
138         err (1, "cannot fopen %s", cfn);
139     
140     fprintf(c_file, "/* Generated from %s */\n", filename);
141     fprintf(c_file, "\n");
142     fprintf(c_file, "#include <stddef.h>\n");
143     fprintf(c_file, "#include <sl.h>\n");
144     fprintf(c_file, "\n");
145
146     {
147         struct command_list *cl, *xl;
148         char *p, *q;
149
150         for(cl = commands; cl; cl = cl->next) {
151             for(xl = commands; xl != cl; xl = xl->next)
152                 if(strcmp(cl->function, xl->function) == 0)
153                     break;
154             if(xl != cl)
155                 continue;
156             /* XXX hack for ss_quit */
157             if(strcmp(cl->function, "ss_quit") == 0) {
158                 fprintf(c_file, "int %s (int, char**);\n", cl->function);
159                 fprintf(c_file, "#define _ss_quit_wrap ss_quit\n\n"); 
160                 continue;
161             }
162             fprintf(c_file, "void %s (int, char**);\n", cl->function);
163             fprintf(c_file, "static int _%s_wrap (int argc, char **argv)\n", 
164                     cl->function);
165             fprintf(c_file, "{\n");
166             fprintf(c_file, "  %s (argc, argv);\n", cl->function);
167             fprintf(c_file, "  return 0;\n");
168             fprintf(c_file, "}\n\n");
169         }
170
171         fprintf(c_file, "SL_cmd %s[] = {\n", table_name);
172         for(cl = commands; cl; cl = cl->next) {
173             struct string_list *sl;
174             sl = cl->aliases;
175             p = quote(sl->string);
176             q = quote(cl->help);
177             fprintf(c_file, "  { %s, _%s_wrap, %s },\n", p, cl->function, q);
178             free(p);
179             free(q);
180     
181             for(sl = sl->next; sl; sl = sl->next) {
182                 p = quote(sl->string);
183                 fprintf(c_file, "  { %s },\n", p);
184                 free(p);
185             }
186         }
187         fprintf(c_file, "  { NULL },\n");
188         fprintf(c_file, "};\n");
189         fprintf(c_file, "\n");
190     }
191     fclose(c_file);
192     free(base);
193     free(cfn);
194 }
195
196 int version_flag;
197 int help_flag;
198 struct getargs args[] = {
199     { "version", 0, arg_flag, &version_flag },
200     { "help", 0, arg_flag, &help_flag }
201 };
202 int num_args = sizeof(args) / sizeof(args[0]);
203
204 static void
205 usage(int code)
206 {
207     arg_printusage(args, num_args, NULL, "command-table");
208     exit(code);
209 }
210
211 int
212 main(int argc, char **argv)
213 {
214     int optind = 0;
215
216     set_progname(argv[0]);
217     if(getarg(args, num_args, argc, argv, &optind))
218         usage(1);
219     if(help_flag)
220         usage(0);
221     if(version_flag) {
222         print_version(NULL);
223         exit(0);
224     }
225     
226     if(argc == optind)
227         usage(1);
228     filename = argv[optind];
229     yyin = fopen(filename, "r");
230     if(yyin == NULL)
231         err(1, "%s", filename);
232     
233     yyparse();
234     
235     generate_commands();
236
237     if(numerror)
238         return 1;
239     return 0;
240 }