Annotation of src/usr.bin/compile_et/error_table.y, Revision 1.5
1.1 downsj 1: %{
1.3 hin 2: /*
3: * Copyright (c) 1998, 1999 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. All advertising materials mentioning features or use of this software
19: * must display the following acknowledgement:
20: * This product includes software developed by Kungliga Tekniska
21: * Högskolan and its contributors.
22: *
23: * 4. Neither the name of the Institute nor the names of its contributors
24: * may be used to endorse or promote products derived from this software
25: * without specific prior written permission.
1.1 downsj 26: *
1.3 hin 27: * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
28: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30: * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
31: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37: * SUCH DAMAGE.
1.1 downsj 38: */
39:
1.3 hin 40: #include "compile_et.h"
41: /* RCSID("$KTH: parse.y,v 1.9 1999/07/04 14:54:58 assar Exp $"); */
1.1 downsj 42:
1.3 hin 43: void yyerror (char *s);
44: long name2number(const char *str);
45: void error_message(char *, ...);
1.1 downsj 46:
1.3 hin 47: extern char *yytext;
1.5 ! deraadt 48: int yyparse(void);
1.1 downsj 49:
1.3 hin 50: /* This is for bison */
1.1 downsj 51:
1.3 hin 52: #if !defined(alloca) && !defined(HAVE_ALLOCA)
53: #define alloca(x) malloc(x)
1.1 downsj 54: #endif
55:
1.3 hin 56: %}
1.1 downsj 57:
1.3 hin 58: %union {
59: char *string;
60: int number;
1.1 downsj 61: }
62:
1.3 hin 63: %token ET INDEX PREFIX EC ID END
64: %token <string> STRING
65: %token <number> NUMBER
1.1 downsj 66:
1.3 hin 67: %%
1.1 downsj 68:
1.3 hin 69: file : /* */
70: | header statements
71: ;
1.1 downsj 72:
1.3 hin 73: header : id et
74: | et
75: ;
1.1 downsj 76:
1.3 hin 77: id : ID STRING
78: {
79: id_str = $2;
80: }
81: ;
82:
83: et : ET STRING
84: {
85: base = name2number($2);
86: strncpy(name, $2, sizeof(name));
87: name[sizeof(name) - 1] = '\0';
88: free($2);
89: }
90: | ET STRING STRING
91: {
92: base = name2number($2);
93: strncpy(name, $3, sizeof(name));
94: name[sizeof(name) - 1] = '\0';
95: free($2);
96: free($3);
97: }
98: ;
99:
100: statements : statement
101: | statements statement
102: ;
103:
104: statement : INDEX NUMBER
105: {
106: number = $2;
107: }
108: | PREFIX STRING
109: {
1.4 deraadt 110: size_t len = strlen($2) + 2;
111: prefix = realloc(prefix, len);
112: strlcpy(prefix, $2, len);
113: strlcat(prefix, "_", len);
1.3 hin 114: free($2);
115: }
116: | PREFIX
117: {
118: prefix = realloc(prefix, 1);
119: *prefix = '\0';
120: }
121: | EC STRING ',' STRING
122: {
123: struct error_code *ec = malloc(sizeof(*ec));
124:
125: ec->next = NULL;
126: ec->number = number;
127: if(prefix && *prefix != '\0') {
128: asprintf (&ec->name, "%s%s", prefix, $2);
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: ;
1.1 downsj 141:
1.3 hin 142: %%
1.1 downsj 143:
1.3 hin 144: long
145: name2number(const char *str)
1.1 downsj 146: {
1.3 hin 147: const char *p;
148: long base = 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: base = (base << 6) + (q - x) + 1;
162: }
163: base <<= 8;
164: if(base > 0x7fffffff)
165: base = -(0xffffffff - base + 1);
166: return base;
1.1 downsj 167: }
168:
1.2 art 169: void
1.3 hin 170: yyerror (char *s)
1.1 downsj 171: {
1.3 hin 172: error_message ("%s\n", s);
1.1 downsj 173: }