A mk_cmds clone that creates SL structures.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4400 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		
							
								
								
									
										119
									
								
								lib/sl/lex.l
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								lib/sl/lex.l
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| %{ | ||||
| /* | ||||
|  * Copyright (c) 1998 Kungliga Tekniska H<>gskolan | ||||
|  * (Royal Institute of Technology, Stockholm, Sweden).  | ||||
|  * All rights reserved.  | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without  | ||||
|  * modification, are permitted provided that the following conditions  | ||||
|  * are met:  | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright  | ||||
|  *    notice, this list of conditions and the following disclaimer.  | ||||
|  * | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright  | ||||
|  *    notice, this list of conditions and the following disclaimer in the  | ||||
|  *    documentation and/or other materials provided with the distribution.  | ||||
|  * | ||||
|  * 3. All advertising materials mentioning features or use of this software  | ||||
|  *    must display the following acknowledgement:  | ||||
|  *      This product includes software developed by Kungliga Tekniska  | ||||
|  *      H<>gskolan and its contributors.  | ||||
|  * | ||||
|  * 4. Neither the name of the Institute nor the names of its contributors  | ||||
|  *    may be used to endorse or promote products derived from this software  | ||||
|  *    without specific prior written permission.  | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  | ||||
|  * SUCH DAMAGE.  | ||||
|  */ | ||||
|  | ||||
| #include "make_cmds.h" | ||||
| #include "parse.h" | ||||
|  | ||||
| RCSID("$Id$"); | ||||
|  | ||||
| static unsigned lineno = 1; | ||||
| void error_message(char *, ...); | ||||
| int getstring(void); | ||||
|  | ||||
| %} | ||||
|  | ||||
|  | ||||
| %% | ||||
| command_table		{ return TABLE; } | ||||
| request			{ return REQUEST; } | ||||
| unknown			{ return UNKNOWN; } | ||||
| unimplemented		{ return UNIMPLEMENTED; } | ||||
| end			{ return END; } | ||||
| #[^\n]*			; | ||||
| [ \t]			; | ||||
| \n			{ lineno++; } | ||||
| \"			{ return getstring(); } | ||||
| [a-zA-Z0-9_]+		{ yylval.string = strdup(yytext); return STRING; } | ||||
| .			{ return *yytext; } | ||||
| %% | ||||
|  | ||||
| #ifndef yywrap /* XXX */ | ||||
| int | ||||
| yywrap ()  | ||||
| { | ||||
|      return 1; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| int | ||||
| getstring(void) | ||||
| { | ||||
|     char x[128]; | ||||
|     int i = 0; | ||||
|     int c; | ||||
|     int backslash = 0; | ||||
|     while((c = getc(yyin)) != EOF){ | ||||
| 	if(backslash) { | ||||
| 	    if(c == 'n') | ||||
| 		c = '\n'; | ||||
| 	    else if(c == 't') | ||||
| 		c = '\t'; | ||||
| 	    x[i++] = c; | ||||
| 	    backslash = 0; | ||||
| 	    continue; | ||||
| 	} | ||||
| 	if(c == '\n'){ | ||||
| 	    error_message("unterminated string"); | ||||
| 	    lineno++; | ||||
| 	    break; | ||||
| 	} | ||||
| 	if(c == '\\'){ | ||||
| 	    backslash++; | ||||
| 	    continue; | ||||
| 	} | ||||
| 	if(c == '\"') | ||||
| 	    break; | ||||
| 	x[i++] = c; | ||||
|     } | ||||
|     x[i] = '\0'; | ||||
|     yylval.string = strdup(x); | ||||
|     return STRING; | ||||
| } | ||||
|  | ||||
| void | ||||
| error_message (char *format, ...) | ||||
| { | ||||
|      va_list args; | ||||
|  | ||||
|      va_start (args, format); | ||||
|      fprintf (stderr, "%s:%d: ", filename, lineno); | ||||
|      vfprintf (stderr, format, args); | ||||
|      va_end (args); | ||||
|      numerror++; | ||||
| } | ||||
							
								
								
									
										206
									
								
								lib/sl/make_cmds.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								lib/sl/make_cmds.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,206 @@ | ||||
| /* | ||||
|  * Copyright (c) 1998 Kungliga Tekniska H<>gskolan | ||||
|  * (Royal Institute of Technology, Stockholm, Sweden).  | ||||
|  * All rights reserved.  | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without  | ||||
|  * modification, are permitted provided that the following conditions  | ||||
|  * are met:  | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright  | ||||
|  *    notice, this list of conditions and the following disclaimer.  | ||||
|  * | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright  | ||||
|  *    notice, this list of conditions and the following disclaimer in the  | ||||
|  *    documentation and/or other materials provided with the distribution.  | ||||
|  * | ||||
|  * 3. All advertising materials mentioning features or use of this software  | ||||
|  *    must display the following acknowledgement:  | ||||
|  *      This product includes software developed by Kungliga Tekniska  | ||||
|  *      H<>gskolan and its contributors.  | ||||
|  * | ||||
|  * 4. Neither the name of the Institute nor the names of its contributors  | ||||
|  *    may be used to endorse or promote products derived from this software  | ||||
|  *    without specific prior written permission.  | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  | ||||
|  * SUCH DAMAGE.  | ||||
|  */ | ||||
|  | ||||
| #include "make_cmds.h" | ||||
|  | ||||
| RCSID("$Id$"); | ||||
|  | ||||
| #include <roken.h> | ||||
| #include "parse.h" | ||||
|  | ||||
| int numerror; | ||||
| extern FILE *yyin; | ||||
| FILE *c_file; | ||||
|  | ||||
| extern void yyparse(void); | ||||
|  | ||||
| #ifdef YYDEBUG | ||||
| extern int yydebug = 1; | ||||
| #endif | ||||
|  | ||||
| char *filename; | ||||
| char *table_name; | ||||
|  | ||||
| static struct command_list *commands; | ||||
|  | ||||
| void | ||||
| add_command(char *function,  | ||||
| 	    char *help,  | ||||
| 	    struct string_list *aliases,  | ||||
| 	    unsigned flags) | ||||
| { | ||||
|     struct command_list *cl = malloc(sizeof(*cl)); | ||||
|     cl->function = function; | ||||
|     cl->help = help; | ||||
|     cl->aliases = aliases; | ||||
|     cl->flags = flags; | ||||
|     cl->next = NULL; | ||||
|     if(commands) { | ||||
| 	*commands->tail = cl; | ||||
| 	commands->tail = &cl->next; | ||||
| 	return; | ||||
|     } | ||||
|     cl->tail = &cl->next; | ||||
|     commands = cl; | ||||
| } | ||||
|  | ||||
| static char * | ||||
| quote(const char *str) | ||||
| { | ||||
|     char buf[1024]; /* XXX */ | ||||
|     const char *p; | ||||
|     char *q; | ||||
|     q = buf; | ||||
|      | ||||
|     *q++ = '\"'; | ||||
|     for(p = str; *p != '\0'; p++) { | ||||
| 	if(*p == '\n') { | ||||
| 	    *q++ = '\\'; | ||||
| 	    *q++ = 'n'; | ||||
| 	    continue; | ||||
| 	} | ||||
| 	if(*p == '\t') { | ||||
| 	    *q++ = '\\'; | ||||
| 	    *q++ = 't'; | ||||
| 	    continue; | ||||
| 	} | ||||
| 	if(*p == '\"' || *p == '\\') | ||||
| 	    *q++ = '\\'; | ||||
| 	*q++ = *p; | ||||
|     } | ||||
|     *q++ = '\"'; | ||||
|     *q++ = '\0'; | ||||
|     return strdup(buf); | ||||
| } | ||||
|  | ||||
| static void | ||||
| generate_commands(void) | ||||
| { | ||||
|     char base[128]; | ||||
|     char cfn[128]; | ||||
|     const char *p; | ||||
|     p = strrchr(table_name, '/'); | ||||
|     if(p == NULL) | ||||
| 	p = table_name; | ||||
|     else | ||||
| 	p++; | ||||
|     strcpy(base, p); | ||||
|     p = strrchr(base, '.'); | ||||
|     if(p) | ||||
| 	*p == '\0'; | ||||
|      | ||||
|     snprintf(cfn, sizeof(cfn), "%s.c", base); | ||||
|     c_file = fopen(cfn, "w"); | ||||
|      | ||||
|     fprintf(c_file, "/* Generated from %s */\n", filename); | ||||
|     fprintf(c_file, "\n"); | ||||
|     fprintf(c_file, "#include <stddef.h>\n"); | ||||
|     fprintf(c_file, "#include <sl.h>\n"); | ||||
|     fprintf(c_file, "\n"); | ||||
|  | ||||
|     { | ||||
| 	struct string_list *sl; | ||||
| 	struct command_list *cl, *xl; | ||||
| 	char *p, *q; | ||||
|  | ||||
| 	for(cl = commands; cl; cl = cl->next) { | ||||
| 	    for(xl = commands; xl != cl; xl = xl->next) | ||||
| 		if(strcmp(cl->function, xl->function) == 0) | ||||
| 		    break; | ||||
| 	    if(xl != cl) | ||||
| 		continue; | ||||
| 	    /* XXX hack for ss_quit */ | ||||
| 	    if(strcmp(cl->function, "ss_quit") == 0) { | ||||
| 		fprintf(c_file, "int %s (int, char**);\n", cl->function); | ||||
| 		fprintf(c_file, "#define _ss_quit_wrap ss_quit\n\n",  | ||||
| 			cl->function, cl->function); | ||||
| 		continue; | ||||
| 	    } | ||||
| 	    fprintf(c_file, "void %s (int, char**);\n", cl->function); | ||||
| 	    fprintf(c_file, "static int _%s_wrap (int argc, char **argv)\n",  | ||||
| 		    cl->function); | ||||
| 	    fprintf(c_file, "{\n"); | ||||
| 	    fprintf(c_file, "  %s (argc, argv);\n", cl->function); | ||||
| 	    fprintf(c_file, "  return 0;\n"); | ||||
| 	    fprintf(c_file, "}\n\n"); | ||||
| 	} | ||||
|  | ||||
| 	fprintf(c_file, "SL_cmd %s[] = {\n", table_name); | ||||
| 	for(cl = commands; cl; cl = cl->next) { | ||||
| 	    p = quote(cl->function); | ||||
| 	    q = quote(cl->help); | ||||
| 	    fprintf(c_file, "  { %s, _%s_wrap, %s },\n", p, cl->function, q); | ||||
| 	    free(p); | ||||
| 	    free(q); | ||||
|      | ||||
| 	    for(sl = cl->aliases; sl; sl = sl->next) { | ||||
| 		p = quote(sl->string); | ||||
| 		fprintf(c_file, "  { %s },\n", p); | ||||
| 		free(p); | ||||
| 	    } | ||||
| 	} | ||||
| 	fprintf(c_file, "  { NULL },\n"); | ||||
| 	fprintf(c_file, "};\n"); | ||||
| 	fprintf(c_file, "\n"); | ||||
|     } | ||||
|     fclose(c_file); | ||||
| } | ||||
|  | ||||
| int | ||||
| main(int argc, char **argv) | ||||
| { | ||||
|     char *p; | ||||
|     set_progname(argv[0]); | ||||
|  | ||||
|     if(argc != 2) { | ||||
| 	fprintf(stderr, "Usage: %s command_table\n", __progname); | ||||
| 	exit(1); | ||||
|     } | ||||
|     filename = argv[1]; | ||||
|     yyin = fopen(filename, "r"); | ||||
|     if(yyin == NULL) | ||||
| 	err(1, "%s", filename); | ||||
|      | ||||
|     yyparse(); | ||||
|      | ||||
|     generate_commands(); | ||||
|  | ||||
|     if(numerror) | ||||
| 	return 1; | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										74
									
								
								lib/sl/make_cmds.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								lib/sl/make_cmds.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| /* | ||||
|  * Copyright (c) 1998 Kungliga Tekniska H<>gskolan | ||||
|  * (Royal Institute of Technology, Stockholm, Sweden).  | ||||
|  * All rights reserved.  | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without  | ||||
|  * modification, are permitted provided that the following conditions  | ||||
|  * are met:  | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright  | ||||
|  *    notice, this list of conditions and the following disclaimer.  | ||||
|  * | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright  | ||||
|  *    notice, this list of conditions and the following disclaimer in the  | ||||
|  *    documentation and/or other materials provided with the distribution.  | ||||
|  * | ||||
|  * 3. All advertising materials mentioning features or use of this software  | ||||
|  *    must display the following acknowledgement:  | ||||
|  *      This product includes software developed by Kungliga Tekniska  | ||||
|  *      H<>gskolan and its contributors.  | ||||
|  * | ||||
|  * 4. Neither the name of the Institute nor the names of its contributors  | ||||
|  *    may be used to endorse or promote products derived from this software  | ||||
|  *    without specific prior written permission.  | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  | ||||
|  * SUCH DAMAGE.  | ||||
|  */ | ||||
|  | ||||
| /* $Id$ */ | ||||
|  | ||||
| #ifndef __MAKE_CMDS_H__ | ||||
| #define __MAKE_CMDS_H__ | ||||
|  | ||||
| #ifdef HAVE_CONFIG_H | ||||
| #include <config.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <stdarg.h> | ||||
|  | ||||
| extern char *filename; | ||||
| extern char *table_name; | ||||
| extern int numerror; | ||||
|  | ||||
| struct command_list { | ||||
|     char *function; | ||||
|     char *help; | ||||
|     struct string_list *aliases; | ||||
|     unsigned flags; | ||||
|     struct command_list *next; | ||||
|     struct command_list **tail; | ||||
| }; | ||||
|  | ||||
| struct string_list { | ||||
|     char *string; | ||||
|     struct string_list *next; | ||||
|     struct string_list **tail; | ||||
| }; | ||||
|  | ||||
| void add_command(char*, char*, struct string_list*, unsigned); | ||||
|  | ||||
| #endif /* __MAKE_CMDS_H__ */ | ||||
							
								
								
									
										191
									
								
								lib/sl/parse.y
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								lib/sl/parse.y
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,191 @@ | ||||
| %{ | ||||
| /* | ||||
|  * Copyright (c) 1998 Kungliga Tekniska H<>gskolan | ||||
|  * (Royal Institute of Technology, Stockholm, Sweden).  | ||||
|  * All rights reserved.  | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without  | ||||
|  * modification, are permitted provided that the following conditions  | ||||
|  * are met:  | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright  | ||||
|  *    notice, this list of conditions and the following disclaimer.  | ||||
|  * | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright  | ||||
|  *    notice, this list of conditions and the following disclaimer in the  | ||||
|  *    documentation and/or other materials provided with the distribution.  | ||||
|  * | ||||
|  * 3. All advertising materials mentioning features or use of this software  | ||||
|  *    must display the following acknowledgement:  | ||||
|  *      This product includes software developed by Kungliga Tekniska  | ||||
|  *      H<>gskolan and its contributors.  | ||||
|  * | ||||
|  * 4. Neither the name of the Institute nor the names of its contributors  | ||||
|  *    may be used to endorse or promote products derived from this software  | ||||
|  *    without specific prior written permission.  | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  | ||||
|  * SUCH DAMAGE.  | ||||
|  */ | ||||
|  | ||||
| #include "make_cmds.h" | ||||
| RCSID("$Id$"); | ||||
|  | ||||
| void yyerror (char *s); | ||||
| long name2number(const char *str); | ||||
|  | ||||
| struct string_list* append_string(struct string_list*, char*); | ||||
| void free_string_list(struct string_list *list); | ||||
| unsigned string_to_flag(const char *); | ||||
| %} | ||||
|  | ||||
| %union { | ||||
|   char *string; | ||||
|   unsigned number; | ||||
|   struct string_list *list; | ||||
| } | ||||
|  | ||||
| %token TABLE REQUEST UNKNOWN UNIMPLEMENTED END | ||||
| %token <string> STRING | ||||
| %type <number> flag flags | ||||
| %type <list> aliases | ||||
|  | ||||
| %% | ||||
|  | ||||
| file		: /* */  | ||||
| 		| statements | ||||
| 		; | ||||
|  | ||||
| statements	: statement | ||||
| 		| statements statement | ||||
| 		; | ||||
|  | ||||
| statement	: TABLE STRING ';' | ||||
| 		{ | ||||
| 		    table_name = $2; | ||||
| 		} | ||||
| 		| REQUEST STRING ',' STRING ',' aliases ',' '(' flags ')' ';' | ||||
| 		{ | ||||
| 		    add_command($2, $4, $6, $9); | ||||
| 		} | ||||
| 		| REQUEST STRING ',' STRING ',' aliases ';' | ||||
| 		{ | ||||
| 		    add_command($2, $4, $6, 0); | ||||
| 		} | ||||
| 		| UNIMPLEMENTED STRING ',' STRING ',' aliases ';' | ||||
| 		{ | ||||
| 		    free($2); | ||||
| 		    free($4); | ||||
| 		    free_string_list($6); | ||||
| 		} | ||||
| 		| UNKNOWN aliases ';' | ||||
| 		{ | ||||
| 		    free_string_list($2); | ||||
| 		} | ||||
| 		| END ';' | ||||
| 		{ | ||||
| 		    return; | ||||
| 		} | ||||
| 		; | ||||
|  | ||||
| aliases		: STRING | ||||
| 		{ | ||||
| 		    $$ = append_string(NULL, $1); | ||||
| 		} | ||||
| 		| aliases ',' STRING | ||||
| 		{ | ||||
| 		    $$ = append_string($1, $3); | ||||
| 		} | ||||
| 		; | ||||
|  | ||||
| flags		: flag | ||||
| 		{ | ||||
| 		    $$ = $1; | ||||
| 		} | ||||
| 		| flags ',' flag | ||||
| 		{ | ||||
| 		    $$ = $1 | $3; | ||||
| 		} | ||||
| 		; | ||||
| flag		: STRING | ||||
| 		{ | ||||
| 		    $$ = string_to_flag($1); | ||||
| 		    free($1); | ||||
| 		} | ||||
| 		; | ||||
|  | ||||
|  | ||||
|  | ||||
| %% | ||||
|  | ||||
| long | ||||
| name2number(const char *str) | ||||
| { | ||||
|     const char *p; | ||||
|     long base = 0; | ||||
|     const char *x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | ||||
| 	"abcdefghijklmnopqrstuvwxyz0123456789_"; | ||||
|     if(strlen(str) > 4) { | ||||
| 	yyerror("table name too long"); | ||||
| 	return 0; | ||||
|     } | ||||
|     for(p = str; *p; p++){ | ||||
| 	char *q = strchr(x, *p); | ||||
| 	if(q == NULL) { | ||||
| 	    yyerror("invalid character in table name"); | ||||
| 	    return 0; | ||||
| 	} | ||||
| 	base = (base << 6) + (q - x) + 1; | ||||
|     } | ||||
|     base <<= 8; | ||||
|     if(base > 0x7fffffff) | ||||
| 	base = -(0xffffffff - base + 1); | ||||
|     return base; | ||||
| } | ||||
|  | ||||
| void | ||||
| yyerror (char *s) | ||||
| { | ||||
|     error_message ("%s\n", s); | ||||
| } | ||||
|  | ||||
| struct string_list* | ||||
| append_string(struct string_list *list, char *str) | ||||
| { | ||||
|     struct string_list *sl = malloc(sizeof(*sl)); | ||||
|     sl->string = str; | ||||
|     sl->next = NULL; | ||||
|     if(list) { | ||||
| 	*list->tail = sl; | ||||
| 	list->tail = &sl->next; | ||||
| 	return list; | ||||
|     } | ||||
|     sl->tail = &sl->next; | ||||
|     return sl; | ||||
| } | ||||
|  | ||||
| void | ||||
| free_string_list(struct string_list *list) | ||||
| { | ||||
|     while(list) { | ||||
| 	struct string_list *sl = list->next; | ||||
| 	free(list->string); | ||||
| 	free(list); | ||||
| 	list = sl; | ||||
|     } | ||||
| } | ||||
|  | ||||
| unsigned | ||||
| string_to_flag(const char *string) | ||||
| { | ||||
|     return 0; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson