root/source4/heimdal/lib/com_err/parse.y

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. name2number
  2. yyerror

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

/* [<][>][^][v][top][bottom][index][help] */