1 %{
2 /*
3  * Copyright (c) 1998 - 2000 Kungliga Tekniska H�gskolan
4  * (Royal Institute of Technology, Stockholm, Sweden).
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * 3. Neither the name of the Institute nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 
35 #include "make_cmds.h"
36 RCSID("$Id: parse.y 21745 2007-07-31 16:11:25Z lha $");
37 
38 static void yyerror (char *s);
39 
40 struct string_list* append_string(struct string_list*, char*);
41 void free_string_list(struct string_list *list);
42 unsigned string_to_flag(const char *);
43 
44 /* This is for bison */
45 
46 #if !defined(alloca) && !defined(HAVE_ALLOCA)
47 #define alloca(x) malloc(x)
48 #endif
49 
50 %}
51 
52 %union {
53   char *string;
54   unsigned number;
55   struct string_list *list;
56 }
57 
58 %token TABLE REQUEST UNKNOWN UNIMPLEMENTED END
59 %token <string> STRING
60 %type <number> flag flags
61 %type <list> aliases
62 
63 %%
64 
65 file		: /* */
66 		| statements
67 		;
68 
69 statements	: statement
70 		| statements statement
71 		;
72 
73 statement	: TABLE STRING ';'
74 		{
75 		    table_name = $2;
76 		}
77 		| REQUEST STRING ',' STRING ',' aliases ',' '(' flags ')' ';'
78 		{
79 		    add_command($2, $4, $6, $9);
80 		}
81 		| REQUEST STRING ',' STRING ',' aliases ';'
82 		{
83 		    add_command($2, $4, $6, 0);
84 		}
85 		| UNIMPLEMENTED STRING ',' STRING ',' aliases ';'
86 		{
87 		    free($2);
88 		    free($4);
89 		    free_string_list($6);
90 		}
91 		| UNKNOWN aliases ';'
92 		{
93 		    free_string_list($2);
94 		}
95 		| END ';'
96 		{
97 		    YYACCEPT;
98 		}
99 		;
100 
101 aliases		: STRING
102 		{
103 		    $$ = append_string(NULL, $1);
104 		}
105 		| aliases ',' STRING
106 		{
107 		    $$ = append_string($1, $3);
108 		}
109 		;
110 
111 flags		: flag
112 		{
113 		    $$ = $1;
114 		}
115 		| flags ',' flag
116 		{
117 		    $$ = $1 | $3;
118 		}
119 		;
120 flag		: STRING
121 		{
122 		    $$ = string_to_flag($1);
123 		    free($1);
124 		}
125 		;
126 
127 
128 
129 %%
130 
131 static void
132 yyerror (char *s)
133 {
134     error_message ("%s\n", s);
135 }
136 
137 struct string_list*
append_string(struct string_list * list,char * str)138 append_string(struct string_list *list, char *str)
139 {
140     struct string_list *sl = malloc(sizeof(*sl));
141     if (sl == NULL)
142 	return sl;
143     sl->string = str;
144     sl->next = NULL;
145     if(list) {
146 	*list->tail = sl;
147 	list->tail = &sl->next;
148 	return list;
149     }
150     sl->tail = &sl->next;
151     return sl;
152 }
153 
154 void
free_string_list(struct string_list * list)155 free_string_list(struct string_list *list)
156 {
157     while(list) {
158 	struct string_list *sl = list->next;
159 	free(list->string);
160 	free(list);
161 	list = sl;
162     }
163 }
164 
165 unsigned
string_to_flag(const char * string)166 string_to_flag(const char *string)
167 {
168     return 0;
169 }
170