Annotation of 43BSDReno/kerberosIV/compile_et/error_table.y, revision 1.1.1.1

1.1       root        1: %{
                      2: #include <stdio.h>
                      3: char *str_concat(), *ds(), *quote(), *malloc(), *realloc();
                      4: char *current_token = (char *)NULL;
                      5: extern char *table_name;
                      6: %}
                      7: %union {
                      8:        char *dynstr;
                      9: }
                     10: 
                     11: %token ERROR_TABLE ERROR_CODE_ENTRY END
                     12: %token <dynstr> STRING QUOTED_STRING
                     13: %type <dynstr> ec_name description table_id
                     14: %{
                     15: %}
                     16: %start error_table
                     17: %%
                     18: 
                     19: error_table    :       ERROR_TABLE table_id error_codes END
                     20:                        { table_name = ds($2);
                     21:                          current_token = table_name;
                     22:                          put_ecs(); }
                     23:                ;
                     24: 
                     25: table_id       :       STRING
                     26:                        { current_token = $1;
                     27:                          set_table_num($1);
                     28:                          $$ = $1; }
                     29:                ;
                     30: 
                     31: error_codes    :       error_codes ec_entry
                     32:                |       ec_entry
                     33:                ;
                     34: 
                     35: ec_entry       :       ERROR_CODE_ENTRY ec_name ',' description
                     36:                        { add_ec($2, $4);
                     37:                          free($2);
                     38:                          free($4); }
                     39:                |       ERROR_CODE_ENTRY ec_name '=' STRING ',' description
                     40:                        { add_ec_val($2, $4, $6);
                     41:                          free($2);
                     42:                          free($4);
                     43:                          free($6);
                     44:                        }
                     45:                ;
                     46: 
                     47: ec_name                :       STRING
                     48:                        { $$ = ds($1);
                     49:                          current_token = $$; }
                     50:                ;
                     51: 
                     52: description    :       QUOTED_STRING
                     53:                        { $$ = ds($1);
                     54:                          current_token = $$; }
                     55:                ;
                     56: 
                     57: %%
                     58: /*
                     59:  *
                     60:  * Copyright 1986, 1987 by the MIT Student Information Processing Board
                     61:  *
                     62:  * For copyright info, see mit-sipb-copyright.h.
                     63:  */
                     64: 
                     65: #include <strings.h>
                     66: #include <ctype.h>
                     67: #include <sys/types.h>
                     68: #include <sys/time.h>
                     69: #include "error_table.h"
                     70: #include "mit-sipb-copyright.h"
                     71: 
                     72: char *malloc(), *realloc();
                     73: extern FILE *hfile, *cfile;
                     74: 
                     75: static long gensym_n = 0;
                     76: char *
                     77: gensym(x)
                     78:        char *x;
                     79: {
                     80:        char *symbol;
                     81:        if (!gensym_n) {
                     82:                struct timeval tv;
                     83:                struct timezone tzp;
                     84:                gettimeofday(&tv, &tzp);
                     85:                gensym_n = (tv.tv_sec%10000)*100 + tv.tv_usec/10000;
                     86:        }
                     87:        symbol = malloc(32 * sizeof(char));
                     88:        gensym_n++;
                     89:        sprintf(symbol, "et%ld", gensym_n);
                     90:        return(symbol);
                     91: }
                     92: 
                     93: char *
                     94: ds(string)
                     95:        char *string;
                     96: {
                     97:        char *rv;
                     98:        rv = malloc(strlen(string)+1);
                     99:        strcpy(rv, string);
                    100:        return(rv);
                    101: }
                    102: 
                    103: char *
                    104: quote(string)
                    105:        char *string;
                    106: {
                    107:        char *rv;
                    108:        rv = malloc(strlen(string)+3);
                    109:        strcpy(rv, "\"");
                    110:        strcat(rv, string);
                    111:        strcat(rv, "\"");
                    112:        return(rv);
                    113: }
                    114: 
                    115: int table_number;
                    116: int current = 0;
                    117: char **error_codes = (char **)NULL;
                    118: 
                    119: add_ec(name, description)
                    120:        char *name, *description;
                    121: {
                    122:        fprintf(cfile, "\t\"%s\",\n", description);
                    123:        if (error_codes == (char **)NULL) {
                    124:                error_codes = (char **)malloc(sizeof(char *));
                    125:                *error_codes = (char *)NULL;
                    126:        }
                    127:        error_codes = (char **)realloc((char *)error_codes,
                    128:                                       (current + 2)*sizeof(char *));
                    129:        error_codes[current++] = ds(name);
                    130:        error_codes[current] = (char *)NULL;
                    131: }
                    132: 
                    133: add_ec_val(name, val, description)
                    134:        char *name, *val, *description;
                    135: {
                    136:        int ncurrent = atoi(val);
                    137:        if (ncurrent < current) {
                    138:                printf("Error code %s (%d) out of order", name,
                    139:                       current);
                    140:                return;
                    141:        }
                    142:       
                    143:        while (ncurrent > current)
                    144:             fputs("\t(char *)NULL,\n", cfile), current++;
                    145:        
                    146:        fprintf(cfile, "\t\"%s\",\n", description);
                    147:        if (error_codes == (char **)NULL) {
                    148:                error_codes = (char **)malloc(sizeof(char *));
                    149:                *error_codes = (char *)NULL;
                    150:        }
                    151:        error_codes = (char **)realloc((char *)error_codes,
                    152:                                       (current + 2)*sizeof(char *));
                    153:        error_codes[current++] = ds(name);
                    154:        error_codes[current] = (char *)NULL;
                    155: } 
                    156: 
                    157: put_ecs()
                    158: {
                    159:        int i;
                    160:        for (i = 0; i < current; i++) {
                    161:             if (error_codes[i] != (char *)NULL)
                    162:                  fprintf(hfile, "#define %-40s ((%s)%d)\n",
                    163:                          error_codes[i], ERROR_CODE, table_number + i);
                    164:        }
                    165: }
                    166: 
                    167: /*
                    168:  * char_to_num -- maps letters and numbers into a small numbering space
                    169:  *     uppercase ->  1-26
                    170:  *     lowercase -> 27-52
                    171:  *     digits    -> 53-62
                    172:  *     underscore-> 63
                    173:  */
                    174: int
                    175: char_to_num(c)
                    176:        char c;
                    177: {
                    178:        if (isupper(c))
                    179:                return(c-'A'+1);
                    180:        else if (islower(c))
                    181:                return(c-'a'+27);
                    182:        else if (isdigit(c))
                    183:                return(c-'0'+53);
                    184:        else {
                    185:                fprintf(stderr, "Illegal character in name: %c\n", c);
                    186:                exit(1);
                    187:                /*NOTREACHED*/
                    188:        }
                    189: }
                    190: 
                    191: set_table_num(string)
                    192:        char *string;
                    193: {
                    194:        if (strlen(string) > 4) {
                    195:                fprintf(stderr, "Table name %s too long, truncated ",
                    196:                        string);
                    197:                string[4] = '\0';
                    198:                fprintf(stderr, "to %s\n", string);
                    199:        }
                    200:        while (*string != '\0') {
                    201:                table_number = (table_number << BITS_PER_CHAR)
                    202:                        + char_to_num(*string);
                    203:                string++;
                    204:        }
                    205:        table_number = table_number << ERRCODE_RANGE;
                    206: }
                    207: 
                    208: #include "et_lex.lex.c"

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.