15e9cd1aeSAssar Westerlund %{ 25e9cd1aeSAssar Westerlund /* 3*ae771770SStanislav Sedov * Copyright (c) 1998 - 2000 Kungliga Tekniska Högskolan 45e9cd1aeSAssar Westerlund * (Royal Institute of Technology, Stockholm, Sweden). 55e9cd1aeSAssar Westerlund * All rights reserved. 65e9cd1aeSAssar Westerlund * 75e9cd1aeSAssar Westerlund * Redistribution and use in source and binary forms, with or without 85e9cd1aeSAssar Westerlund * modification, are permitted provided that the following conditions 95e9cd1aeSAssar Westerlund * are met: 105e9cd1aeSAssar Westerlund * 115e9cd1aeSAssar Westerlund * 1. Redistributions of source code must retain the above copyright 125e9cd1aeSAssar Westerlund * notice, this list of conditions and the following disclaimer. 135e9cd1aeSAssar Westerlund * 145e9cd1aeSAssar Westerlund * 2. Redistributions in binary form must reproduce the above copyright 155e9cd1aeSAssar Westerlund * notice, this list of conditions and the following disclaimer in the 165e9cd1aeSAssar Westerlund * documentation and/or other materials provided with the distribution. 175e9cd1aeSAssar Westerlund * 185e9cd1aeSAssar Westerlund * 3. Neither the name of the Institute nor the names of its contributors 195e9cd1aeSAssar Westerlund * may be used to endorse or promote products derived from this software 205e9cd1aeSAssar Westerlund * without specific prior written permission. 215e9cd1aeSAssar Westerlund * 225e9cd1aeSAssar Westerlund * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 235e9cd1aeSAssar Westerlund * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 245e9cd1aeSAssar Westerlund * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 255e9cd1aeSAssar Westerlund * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 265e9cd1aeSAssar Westerlund * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 275e9cd1aeSAssar Westerlund * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 285e9cd1aeSAssar Westerlund * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 295e9cd1aeSAssar Westerlund * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 305e9cd1aeSAssar Westerlund * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 315e9cd1aeSAssar Westerlund * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 325e9cd1aeSAssar Westerlund * SUCH DAMAGE. 335e9cd1aeSAssar Westerlund */ 345e9cd1aeSAssar Westerlund 355e9cd1aeSAssar Westerlund #include "compile_et.h" 365e9cd1aeSAssar Westerlund #include "lex.h" 375e9cd1aeSAssar Westerlund 385e9cd1aeSAssar Westerlund void yyerror (char *s); 395e9cd1aeSAssar Westerlund static long name2number(const char *str); 405e9cd1aeSAssar Westerlund 415e9cd1aeSAssar Westerlund extern char *yytext; 425e9cd1aeSAssar Westerlund 435e9cd1aeSAssar Westerlund /* This is for bison */ 445e9cd1aeSAssar Westerlund 455e9cd1aeSAssar Westerlund #if !defined(alloca) && !defined(HAVE_ALLOCA) 465e9cd1aeSAssar Westerlund #define alloca(x) malloc(x) 475e9cd1aeSAssar Westerlund #endif 485e9cd1aeSAssar Westerlund 49*ae771770SStanislav Sedov #define YYMALLOC malloc 50*ae771770SStanislav Sedov #define YYFREE free 51*ae771770SStanislav Sedov 525e9cd1aeSAssar Westerlund %} 535e9cd1aeSAssar Westerlund 545e9cd1aeSAssar Westerlund %union { 555e9cd1aeSAssar Westerlund char *string; 565e9cd1aeSAssar Westerlund int number; 575e9cd1aeSAssar Westerlund } 585e9cd1aeSAssar Westerlund 595e9cd1aeSAssar Westerlund %token ET INDEX PREFIX EC ID END 605e9cd1aeSAssar Westerlund %token <string> STRING 615e9cd1aeSAssar Westerlund %token <number> NUMBER 625e9cd1aeSAssar Westerlund 635e9cd1aeSAssar Westerlund %% 645e9cd1aeSAssar Westerlund 655e9cd1aeSAssar Westerlund file : /* */ 665e9cd1aeSAssar Westerlund | header statements 675e9cd1aeSAssar Westerlund ; 685e9cd1aeSAssar Westerlund 695e9cd1aeSAssar Westerlund header : id et 705e9cd1aeSAssar Westerlund | et 715e9cd1aeSAssar Westerlund ; 725e9cd1aeSAssar Westerlund 735e9cd1aeSAssar Westerlund id : ID STRING 745e9cd1aeSAssar Westerlund { 755e9cd1aeSAssar Westerlund id_str = $2; 765e9cd1aeSAssar Westerlund } 775e9cd1aeSAssar Westerlund ; 785e9cd1aeSAssar Westerlund 795e9cd1aeSAssar Westerlund et : ET STRING 805e9cd1aeSAssar Westerlund { 81c19800e8SDoug Rabson base_id = name2number($2); 82c19800e8SDoug Rabson strlcpy(name, $2, sizeof(name)); 835e9cd1aeSAssar Westerlund free($2); 845e9cd1aeSAssar Westerlund } 855e9cd1aeSAssar Westerlund | ET STRING STRING 865e9cd1aeSAssar Westerlund { 87c19800e8SDoug Rabson base_id = name2number($2); 88c19800e8SDoug Rabson strlcpy(name, $3, sizeof(name)); 895e9cd1aeSAssar Westerlund free($2); 905e9cd1aeSAssar Westerlund free($3); 915e9cd1aeSAssar Westerlund } 925e9cd1aeSAssar Westerlund ; 935e9cd1aeSAssar Westerlund 945e9cd1aeSAssar Westerlund statements : statement 955e9cd1aeSAssar Westerlund | statements statement 965e9cd1aeSAssar Westerlund ; 975e9cd1aeSAssar Westerlund 985e9cd1aeSAssar Westerlund statement : INDEX NUMBER 995e9cd1aeSAssar Westerlund { 1005e9cd1aeSAssar Westerlund number = $2; 1015e9cd1aeSAssar Westerlund } 1025e9cd1aeSAssar Westerlund | PREFIX STRING 1035e9cd1aeSAssar Westerlund { 104c19800e8SDoug Rabson free(prefix); 105c19800e8SDoug Rabson asprintf (&prefix, "%s_", $2); 106c19800e8SDoug Rabson if (prefix == NULL) 107c19800e8SDoug Rabson errx(1, "malloc"); 1085e9cd1aeSAssar Westerlund free($2); 1095e9cd1aeSAssar Westerlund } 1105e9cd1aeSAssar Westerlund | PREFIX 1115e9cd1aeSAssar Westerlund { 1125e9cd1aeSAssar Westerlund prefix = realloc(prefix, 1); 113c19800e8SDoug Rabson if (prefix == NULL) 114c19800e8SDoug Rabson errx(1, "malloc"); 1155e9cd1aeSAssar Westerlund *prefix = '\0'; 1165e9cd1aeSAssar Westerlund } 1175e9cd1aeSAssar Westerlund | EC STRING ',' STRING 1185e9cd1aeSAssar Westerlund { 1195e9cd1aeSAssar Westerlund struct error_code *ec = malloc(sizeof(*ec)); 1205e9cd1aeSAssar Westerlund 121c19800e8SDoug Rabson if (ec == NULL) 122c19800e8SDoug Rabson errx(1, "malloc"); 123c19800e8SDoug Rabson 1245e9cd1aeSAssar Westerlund ec->next = NULL; 1255e9cd1aeSAssar Westerlund ec->number = number; 1265e9cd1aeSAssar Westerlund if(prefix && *prefix != '\0') { 1275e9cd1aeSAssar Westerlund asprintf (&ec->name, "%s%s", prefix, $2); 128c19800e8SDoug Rabson if (ec->name == NULL) 129c19800e8SDoug Rabson errx(1, "malloc"); 1305e9cd1aeSAssar Westerlund free($2); 1315e9cd1aeSAssar Westerlund } else 1325e9cd1aeSAssar Westerlund ec->name = $2; 1335e9cd1aeSAssar Westerlund ec->string = $4; 1345e9cd1aeSAssar Westerlund APPEND(codes, ec); 1355e9cd1aeSAssar Westerlund number++; 1365e9cd1aeSAssar Westerlund } 1375e9cd1aeSAssar Westerlund | END 1385e9cd1aeSAssar Westerlund { 1395e9cd1aeSAssar Westerlund YYACCEPT; 1405e9cd1aeSAssar Westerlund } 1415e9cd1aeSAssar Westerlund ; 1425e9cd1aeSAssar Westerlund 1435e9cd1aeSAssar Westerlund %% 1445e9cd1aeSAssar Westerlund 1455e9cd1aeSAssar Westerlund static long 1465e9cd1aeSAssar Westerlund name2number(const char *str) 1475e9cd1aeSAssar Westerlund { 1485e9cd1aeSAssar Westerlund const char *p; 149c19800e8SDoug Rabson long num = 0; 1505e9cd1aeSAssar Westerlund const char *x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 1515e9cd1aeSAssar Westerlund "abcdefghijklmnopqrstuvwxyz0123456789_"; 1525e9cd1aeSAssar Westerlund if(strlen(str) > 4) { 1535e9cd1aeSAssar Westerlund yyerror("table name too long"); 1545e9cd1aeSAssar Westerlund return 0; 1555e9cd1aeSAssar Westerlund } 1565e9cd1aeSAssar Westerlund for(p = str; *p; p++){ 1575e9cd1aeSAssar Westerlund char *q = strchr(x, *p); 1585e9cd1aeSAssar Westerlund if(q == NULL) { 1595e9cd1aeSAssar Westerlund yyerror("invalid character in table name"); 1605e9cd1aeSAssar Westerlund return 0; 1615e9cd1aeSAssar Westerlund } 162c19800e8SDoug Rabson num = (num << 6) + (q - x) + 1; 1635e9cd1aeSAssar Westerlund } 164c19800e8SDoug Rabson num <<= 8; 165c19800e8SDoug Rabson if(num > 0x7fffffff) 166c19800e8SDoug Rabson num = -(0xffffffff - num + 1); 167c19800e8SDoug Rabson return num; 1685e9cd1aeSAssar Westerlund } 1695e9cd1aeSAssar Westerlund 1705e9cd1aeSAssar Westerlund void 1715e9cd1aeSAssar Westerlund yyerror (char *s) 1725e9cd1aeSAssar Westerlund { 173*ae771770SStanislav Sedov _lex_error_message ("%s\n", s); 1745e9cd1aeSAssar Westerlund } 175