Annotation of src/usr.bin/compile_et/error_table.y, Revision 1.4
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.1 downsj 48:
1.3 hin 49: /* This is for bison */
1.1 downsj 50:
1.3 hin 51: #if !defined(alloca) && !defined(HAVE_ALLOCA)
52: #define alloca(x) malloc(x)
1.1 downsj 53: #endif
54:
1.3 hin 55: %}
1.1 downsj 56:
1.3 hin 57: %union {
58: char *string;
59: int number;
1.1 downsj 60: }
61:
1.3 hin 62: %token ET INDEX PREFIX EC ID END
63: %token <string> STRING
64: %token <number> NUMBER
1.1 downsj 65:
1.3 hin 66: %%
1.1 downsj 67:
1.3 hin 68: file : /* */
69: | header statements
70: ;
1.1 downsj 71:
1.3 hin 72: header : id et
73: | et
74: ;
1.1 downsj 75:
1.3 hin 76: id : ID STRING
77: {
78: id_str = $2;
79: }
80: ;
81:
82: et : ET STRING
83: {
84: base = name2number($2);
85: strncpy(name, $2, sizeof(name));
86: name[sizeof(name) - 1] = '\0';
87: free($2);
88: }
89: | ET STRING STRING
90: {
91: base = name2number($2);
92: strncpy(name, $3, sizeof(name));
93: name[sizeof(name) - 1] = '\0';
94: free($2);
95: free($3);
96: }
97: ;
98:
99: statements : statement
100: | statements statement
101: ;
102:
103: statement : INDEX NUMBER
104: {
105: number = $2;
106: }
107: | PREFIX STRING
108: {
1.4 ! deraadt 109: size_t len = strlen($2) + 2;
! 110: prefix = realloc(prefix, len);
! 111: strlcpy(prefix, $2, len);
! 112: strlcat(prefix, "_", len);
1.3 hin 113: free($2);
114: }
115: | PREFIX
116: {
117: prefix = realloc(prefix, 1);
118: *prefix = '\0';
119: }
120: | EC STRING ',' STRING
121: {
122: struct error_code *ec = malloc(sizeof(*ec));
123:
124: ec->next = NULL;
125: ec->number = number;
126: if(prefix && *prefix != '\0') {
127: asprintf (&ec->name, "%s%s", prefix, $2);
128: free($2);
129: } else
130: ec->name = $2;
131: ec->string = $4;
132: APPEND(codes, ec);
133: number++;
134: }
135: | END
136: {
137: YYACCEPT;
138: }
139: ;
1.1 downsj 140:
1.3 hin 141: %%
1.1 downsj 142:
1.3 hin 143: long
144: name2number(const char *str)
1.1 downsj 145: {
1.3 hin 146: const char *p;
147: long base = 0;
148: const char *x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
149: "abcdefghijklmnopqrstuvwxyz0123456789_";
150: if(strlen(str) > 4) {
151: yyerror("table name too long");
152: return 0;
153: }
154: for(p = str; *p; p++){
155: char *q = strchr(x, *p);
156: if(q == NULL) {
157: yyerror("invalid character in table name");
158: return 0;
159: }
160: base = (base << 6) + (q - x) + 1;
161: }
162: base <<= 8;
163: if(base > 0x7fffffff)
164: base = -(0xffffffff - base + 1);
165: return base;
1.1 downsj 166: }
167:
1.2 art 168: void
1.3 hin 169: yyerror (char *s)
1.1 downsj 170: {
1.3 hin 171: error_message ("%s\n", s);
1.1 downsj 172: }