heimdal: import heimdal's trunk svn rev 23697 + lorikeet-heimdal patches
[sfrench/samba-autobuild/.git] / source4 / heimdal / lib / com_err / 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 "compile_et.h"
36 #include "lex.h"
37
38 RCSID("$Id$");
39
40 void yyerror (char *s);
41 static long name2number(const char *str);
42
43 extern char *yytext;
44
45 /* This is for bison */
46
47 #if !defined(alloca) && !defined(HAVE_ALLOCA)
48 #define alloca(x) malloc(x)
49 #endif
50
51 %}
52
53 %union {
54   char *string;
55   int number;
56 }
57
58 %token ET INDEX PREFIX EC ID END
59 %token <string> STRING
60 %token <number> NUMBER
61
62 %%
63
64 file            : /* */ 
65                 | header statements
66                 ;
67
68 header          : id et
69                 | et
70                 ;
71
72 id              : ID STRING
73                 {
74                     id_str = $2;
75                 }
76                 ;
77
78 et              : ET STRING
79                 {
80                     base_id = name2number($2);
81                     strlcpy(name, $2, sizeof(name));
82                     free($2);
83                 }
84                 | ET STRING STRING
85                 {
86                     base_id = name2number($2);
87                     strlcpy(name, $3, sizeof(name));
88                     free($2);
89                     free($3);
90                 }
91                 ;
92
93 statements      : statement
94                 | statements statement
95                 ;
96
97 statement       : INDEX NUMBER 
98                 {
99                         number = $2;
100                 }
101                 | PREFIX STRING
102                 {
103                     free(prefix);
104                     asprintf (&prefix, "%s_", $2);
105                     if (prefix == NULL)
106                         errx(1, "malloc");
107                     free($2);
108                 }
109                 | PREFIX
110                 {
111                     prefix = realloc(prefix, 1);
112                     if (prefix == NULL)
113                         errx(1, "malloc");
114                     *prefix = '\0';
115                 }
116                 | EC STRING ',' STRING
117                 {
118                     struct error_code *ec = malloc(sizeof(*ec));
119                     
120                     if (ec == NULL)
121                         errx(1, "malloc");
122
123                     ec->next = NULL;
124                     ec->number = number;
125                     if(prefix && *prefix != '\0') {
126                         asprintf (&ec->name, "%s%s", prefix, $2);
127                         if (ec->name == NULL)
128                             errx(1, "malloc");
129                         free($2);
130                     } else
131                         ec->name = $2;
132                     ec->string = $4;
133                     APPEND(codes, ec);
134                     number++;
135                 }
136                 | END
137                 {
138                         YYACCEPT;
139                 }
140                 ;
141
142 %%
143
144 static long
145 name2number(const char *str)
146 {
147     const char *p;
148     long num = 0;
149     const char *x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
150         "abcdefghijklmnopqrstuvwxyz0123456789_";
151     if(strlen(str) > 4) {
152         yyerror("table name too long");
153         return 0;
154     }
155     for(p = str; *p; p++){
156         char *q = strchr(x, *p);
157         if(q == NULL) {
158             yyerror("invalid character in table name");
159             return 0;
160         }
161         num = (num << 6) + (q - x) + 1;
162     }
163     num <<= 8;
164     if(num > 0x7fffffff)
165         num = -(0xffffffff - num + 1);
166     return num;
167 }
168
169 void
170 yyerror (char *s)
171 {
172      error_message ("%s\n", s);
173 }