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