150764Smarkm%{
250764Smarkm/*
3127807Snectar * Copyright (c) 1998 - 2000 Kungliga Tekniska H�gskolan
450764Smarkm * (Royal Institute of Technology, Stockholm, Sweden).
550764Smarkm * All rights reserved.
650764Smarkm *
750764Smarkm * Redistribution and use in source and binary forms, with or without
850764Smarkm * modification, are permitted provided that the following conditions
950764Smarkm * are met:
1050764Smarkm *
1150764Smarkm * 1. Redistributions of source code must retain the above copyright
1250764Smarkm *    notice, this list of conditions and the following disclaimer.
1350764Smarkm *
1450764Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1550764Smarkm *    notice, this list of conditions and the following disclaimer in the
1650764Smarkm *    documentation and/or other materials provided with the distribution.
1750764Smarkm *
18127807Snectar * 3. Neither the name of the Institute nor the names of its contributors
1950764Smarkm *    may be used to endorse or promote products derived from this software
2050764Smarkm *    without specific prior written permission.
2150764Smarkm *
2250764Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2350764Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2450764Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2550764Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2650764Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2750764Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2850764Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2950764Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3050764Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3150764Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3250764Smarkm * SUCH DAMAGE.
3350764Smarkm */
34127807Snectar/* $FreeBSD$ */
3550764Smarkm
3650764Smarkm#include "compile_et.h"
37127807Snectar#include "lex.h"
3850880Smarkm#if 0
39178846SdfrRCSID("$Id: parse.y 15426 2005-06-16 19:21:42Z lha $");
4050880Smarkm#endif
4150764Smarkm
4250764Smarkmvoid yyerror (char *s);
43127807Snectarstatic long name2number(const char *str);
4450764Smarkm
4550764Smarkmextern char *yytext;
4650764Smarkm
4750764Smarkm/* This is for bison */
4850764Smarkm
4950764Smarkm#if !defined(alloca) && !defined(HAVE_ALLOCA)
5050764Smarkm#define alloca(x) malloc(x)
5150764Smarkm#endif
5250764Smarkm
5350764Smarkm%}
5450764Smarkm
5550764Smarkm%union {
5650764Smarkm  char *string;
5750764Smarkm  int number;
5850764Smarkm}
5950764Smarkm
6050764Smarkm%token ET INDEX PREFIX EC ID END
6150764Smarkm%token <string> STRING
6250764Smarkm%token <number> NUMBER
6350764Smarkm
6450764Smarkm%%
6550764Smarkm
6650764Smarkmfile		: /* */
6750764Smarkm		| header statements
6850764Smarkm		;
6950764Smarkm
7050764Smarkmheader		: id et
7150764Smarkm		| et
7250764Smarkm		;
7350764Smarkm
7450764Smarkmid		: ID STRING
7550764Smarkm		{
7650764Smarkm		    id_str = $2;
7750764Smarkm		}
7850764Smarkm		;
7950764Smarkm
8050764Smarkmet		: ET STRING
8150764Smarkm		{
82178846Sdfr		    base_id = name2number($2);
83178846Sdfr		    strlcpy(name, $2, sizeof(name));
8450764Smarkm		    free($2);
8550764Smarkm		}
8650764Smarkm		| ET STRING STRING
8750764Smarkm		{
88178846Sdfr		    base_id = name2number($2);
89178846Sdfr		    strlcpy(name, $3, sizeof(name));
9050764Smarkm		    free($2);
9150764Smarkm		    free($3);
9250764Smarkm		}
9350764Smarkm		;
9450764Smarkm
9550764Smarkmstatements	: statement
9650764Smarkm		| statements statement
9750764Smarkm		;
9850764Smarkm
9950764Smarkmstatement	: INDEX NUMBER
10050764Smarkm		{
10150764Smarkm			number = $2;
10250764Smarkm		}
10350764Smarkm		| PREFIX STRING
10450764Smarkm		{
105178846Sdfr		    free(prefix);
106178846Sdfr		    asprintf (&prefix, "%s_", $2);
107178846Sdfr		    if (prefix == NULL)
108178846Sdfr			errx(1, "malloc");
10950764Smarkm		    free($2);
11050764Smarkm		}
11150764Smarkm		| PREFIX
11250764Smarkm		{
11350764Smarkm		    prefix = realloc(prefix, 1);
114178846Sdfr		    if (prefix == NULL)
115178846Sdfr			errx(1, "malloc");
11650764Smarkm		    *prefix = '\0';
11750764Smarkm		}
11850764Smarkm		| EC STRING ',' STRING
11950764Smarkm		{
12050764Smarkm		    struct error_code *ec = malloc(sizeof(*ec));
121178846Sdfr
122178846Sdfr		    if (ec == NULL)
123178846Sdfr			errx(1, "malloc");
12450764Smarkm
12550764Smarkm		    ec->next = NULL;
12650764Smarkm		    ec->number = number;
12750764Smarkm		    if(prefix && *prefix != '\0') {
12850764Smarkm			asprintf (&ec->name, "%s%s", prefix, $2);
129178846Sdfr			if (ec->name == NULL)
130178846Sdfr			    errx(1, "malloc");
13150764Smarkm			free($2);
13250764Smarkm		    } else
13350764Smarkm			ec->name = $2;
13450764Smarkm		    ec->string = $4;
13550764Smarkm		    APPEND(codes, ec);
13650764Smarkm		    number++;
13750764Smarkm		}
13850764Smarkm		| END
13950764Smarkm		{
14050764Smarkm			YYACCEPT;
14150764Smarkm		}
14250764Smarkm		;
14350764Smarkm
14450764Smarkm%%
14550764Smarkm
146127807Snectarstatic long
14750764Smarkmname2number(const char *str)
14850764Smarkm{
14950764Smarkm    const char *p;
150178846Sdfr    long num = 0;
15150764Smarkm    const char *x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
15250764Smarkm	"abcdefghijklmnopqrstuvwxyz0123456789_";
15350764Smarkm    if(strlen(str) > 4) {
15450764Smarkm	yyerror("table name too long");
15550764Smarkm	return 0;
15650764Smarkm    }
15750764Smarkm    for(p = str; *p; p++){
15850764Smarkm	char *q = strchr(x, *p);
15950764Smarkm	if(q == NULL) {
16050764Smarkm	    yyerror("invalid character in table name");
16150764Smarkm	    return 0;
16250764Smarkm	}
163178846Sdfr	num = (num << 6) + (q - x) + 1;
16450764Smarkm    }
165178846Sdfr    num <<= 8;
166178846Sdfr    if(num > 0x7fffffff)
167178846Sdfr	num = -(0xffffffff - num + 1);
168178846Sdfr    return num;
16950764Smarkm}
17050764Smarkm
17150764Smarkmvoid
17250764Smarkmyyerror (char *s)
17350764Smarkm{
17450764Smarkm     error_message ("%s\n", s);
17550764Smarkm}
176