Annotation of src/usr.bin/compile_et/error_table.y, Revision 1.7
1.1 downsj 1: %{
1.3 hin 2: /*
1.7 ! biorn 3: * Copyright (c) 1998 - 2000 Kungliga Tekniska Högskolan
1.3 hin 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: *
1.7 ! biorn 18: * 3. Neither the name of the Institute nor the names of its contributors
1.3 hin 19: * may be used to endorse or promote products derived from this software
20: * without specific prior written permission.
1.1 downsj 21: *
1.3 hin 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.
1.1 downsj 33: */
34:
1.3 hin 35: #include "compile_et.h"
1.7 ! biorn 36:
! 37: /* RCSID("$KTH: parse.y,v 1.13 2005/05/16 08:53:34 lha Exp $"); */
1.1 downsj 38:
1.3 hin 39: void yyerror (char *s);
1.7 ! biorn 40: static long name2number(const char *str);
1.3 hin 41: void error_message(char *, ...);
1.1 downsj 42:
1.3 hin 43: extern char *yytext;
1.5 deraadt 44: int yyparse(void);
1.1 downsj 45:
1.3 hin 46: /* This is for bison */
1.1 downsj 47:
1.3 hin 48: #if !defined(alloca) && !defined(HAVE_ALLOCA)
49: #define alloca(x) malloc(x)
1.1 downsj 50: #endif
51:
1.3 hin 52: %}
1.1 downsj 53:
1.3 hin 54: %union {
55: char *string;
56: int number;
1.1 downsj 57: }
58:
1.3 hin 59: %token ET INDEX PREFIX EC ID END
60: %token <string> STRING
61: %token <number> NUMBER
1.1 downsj 62:
1.3 hin 63: %%
1.1 downsj 64:
1.3 hin 65: file : /* */
66: | header statements
67: ;
1.1 downsj 68:
1.3 hin 69: header : id et
70: | et
71: ;
1.1 downsj 72:
1.3 hin 73: id : ID STRING
74: {
75: id_str = $2;
76: }
77: ;
78:
79: et : ET STRING
80: {
81: base = name2number($2);
1.6 jaredy 82: strlcpy(name, $2, sizeof(name));
1.3 hin 83: free($2);
84: }
85: | ET STRING STRING
86: {
87: base = name2number($2);
1.6 jaredy 88: strlcpy(name, $3, sizeof(name));
1.3 hin 89: free($2);
90: free($3);
91: }
92: ;
93:
94: statements : statement
95: | statements statement
96: ;
97:
98: statement : INDEX NUMBER
99: {
100: number = $2;
101: }
102: | PREFIX STRING
103: {
1.7 ! biorn 104: free(prefix);
! 105: asprintf (&prefix, "%s_", $2);
! 106: if (prefix == NULL)
! 107: errx(1, "malloc");
1.3 hin 108: free($2);
109: }
110: | PREFIX
111: {
1.7 ! biorn 112: prefix = realloc(prefix, 1);
! 113: if (prefix == NULL)
! 114: errx(1, "malloc");
1.3 hin 115: *prefix = '\0';
116: }
117: | EC STRING ',' STRING
118: {
119: struct error_code *ec = malloc(sizeof(*ec));
1.7 ! biorn 120:
! 121: if (ec == NULL)
! 122: errx(1, "malloc");
! 123:
1.3 hin 124: ec->next = NULL;
125: ec->number = number;
126: if(prefix && *prefix != '\0') {
1.7 ! biorn 127: asprintf (&ec->name, "%s%s", prefix, $2);
! 128: if (ec->name == NULL)
! 129: errx(1, "malloc");
1.3 hin 130: free($2);
131: } else
132: ec->name = $2;
133: ec->string = $4;
134: APPEND(codes, ec);
135: number++;
136: }
137: | END
138: {
139: YYACCEPT;
140: }
141: ;
1.1 downsj 142:
1.3 hin 143: %%
1.1 downsj 144:
1.7 ! biorn 145: static long
1.3 hin 146: name2number(const char *str)
1.1 downsj 147: {
1.3 hin 148: const char *p;
149: long base = 0;
150: const char *x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
151: "abcdefghijklmnopqrstuvwxyz0123456789_";
152: if(strlen(str) > 4) {
153: yyerror("table name too long");
154: return 0;
155: }
156: for(p = str; *p; p++){
157: char *q = strchr(x, *p);
158: if(q == NULL) {
159: yyerror("invalid character in table name");
160: return 0;
161: }
162: base = (base << 6) + (q - x) + 1;
163: }
164: base <<= 8;
165: if(base > 0x7fffffff)
166: base = -(0xffffffff - base + 1);
167: return base;
1.1 downsj 168: }
169:
1.2 art 170: void
1.3 hin 171: yyerror (char *s)
1.1 downsj 172: {
1.3 hin 173: error_message ("%s\n", s);
1.1 downsj 174: }