[BACK]Return to error_table.y CVS log [TXT][DIR] Up to [local] / src / usr.bin / compile_et

Annotation of src/usr.bin/compile_et/error_table.y, Revision 1.3

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:                {
        !           109:                    prefix = realloc(prefix, strlen($2) + 2);
        !           110:                    strcpy(prefix, $2);
        !           111:                    strcat(prefix, "_");
        !           112:                    free($2);
        !           113:                }
        !           114:                | PREFIX
        !           115:                {
        !           116:                    prefix = realloc(prefix, 1);
        !           117:                    *prefix = '\0';
        !           118:                }
        !           119:                | EC STRING ',' STRING
        !           120:                {
        !           121:                    struct error_code *ec = malloc(sizeof(*ec));
        !           122:
        !           123:                    ec->next = NULL;
        !           124:                    ec->number = number;
        !           125:                    if(prefix && *prefix != '\0') {
        !           126:                        asprintf (&ec->name, "%s%s", prefix, $2);
        !           127:                        free($2);
        !           128:                    } else
        !           129:                        ec->name = $2;
        !           130:                    ec->string = $4;
        !           131:                    APPEND(codes, ec);
        !           132:                    number++;
        !           133:                }
        !           134:                | END
        !           135:                {
        !           136:                        YYACCEPT;
        !           137:                }
        !           138:                ;
1.1       downsj    139:
1.3     ! hin       140: %%
1.1       downsj    141:
1.3     ! hin       142: long
        !           143: name2number(const char *str)
1.1       downsj    144: {
1.3     ! hin       145:     const char *p;
        !           146:     long base = 0;
        !           147:     const char *x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        !           148:        "abcdefghijklmnopqrstuvwxyz0123456789_";
        !           149:     if(strlen(str) > 4) {
        !           150:        yyerror("table name too long");
        !           151:        return 0;
        !           152:     }
        !           153:     for(p = str; *p; p++){
        !           154:        char *q = strchr(x, *p);
        !           155:        if(q == NULL) {
        !           156:            yyerror("invalid character in table name");
        !           157:            return 0;
        !           158:        }
        !           159:        base = (base << 6) + (q - x) + 1;
        !           160:     }
        !           161:     base <<= 8;
        !           162:     if(base > 0x7fffffff)
        !           163:        base = -(0xffffffff - base + 1);
        !           164:     return base;
1.1       downsj    165: }
                    166:
1.2       art       167: void
1.3     ! hin       168: yyerror (char *s)
1.1       downsj    169: {
1.3     ! hin       170:      error_message ("%s\n", s);
1.1       downsj    171: }