Restructure Makefiles to accomodate multiple archs
[dragonfly.git] / crypto / heimdal-0.6.3 / lib / sl / parse.y
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,v 1.7 2000/06/27 02:37:18 assar Exp $");
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*
138 append_string(struct string_list *list, char *str)
139 {
140     struct string_list *sl = malloc(sizeof(*sl));
141     sl->string = str;
142     sl->next = NULL;
143     if(list) {
144         *list->tail = sl;
145         list->tail = &sl->next;
146         return list;
147     }
148     sl->tail = &sl->next;
149     return sl;
150 }
151
152 void
153 free_string_list(struct string_list *list)
154 {
155     while(list) {
156         struct string_list *sl = list->next;
157         free(list->string);
158         free(list);
159         list = sl;
160     }
161 }
162
163 unsigned
164 string_to_flag(const char *string)
165 {
166     return 0;
167 }