Annotation of 43BSDReno/contrib/isode-beta/others/quipu/uips/pod/conf_read.y, revision 1.1.1.1

1.1       root        1: %{
                      2: #ifndef lint
                      3: static char *rcsid = "$Header: /f/osi/others/quipu/uips/pod/RCS/conf_read.y,v 7.0 90/06/12 13:15:54 mrose Exp $";
                      4: #endif
                      5: 
                      6: /*
                      7:  * $Header: /f/osi/others/quipu/uips/pod/RCS/conf_read.y,v 7.0 90/06/12 13:15:54 mrose Exp $
                      8:  */
                      9: 
                     10: /*
                     11:  * $Log:       conf_read.y,v $
                     12:  * Revision 7.0  90/06/12  13:15:54  mrose
                     13:  * *** empty log message ***
                     14:  * 
                     15:  * Revision 1.5  90/04/26  10:21:47  emsrdsm
                     16:  * *** empty log message ***
                     17:  * 
                     18:  * Revision 1.4  90/04/25  13:48:16  emsrdsm
                     19:  * i) lint'ed
                     20:  * 
                     21:  * Revision 1.3  90/04/20  10:31:36  emsrdsm
                     22:  * *** empty log message ***
                     23:  * 
                     24:  * Revision 1.2  90/04/20  10:31:23  emsrdsm
                     25:  * *** empty log message ***
                     26:  * 
                     27:  * Revision 1.1  90/04/10  16:46:39  emsrdsm
                     28:  * Initial revision
                     29:  * 
                     30:  */
                     31: 
                     32: #include <stdio.h>
                     33: #include <string.h>
                     34: #include <ctype.h>
                     35: #include "filt.h"
                     36: #include "symtab.h"
                     37: 
                     38: extern make_type();
                     39: extern filt_struct *make_item_filter();
                     40: extern filt_struct *link_filters();
                     41: extern filt_struct *make_parent_filter();
                     42: extern put_symbol_value();
                     43: 
                     44: extern FILE *file;
                     45: extern int curr_filt;
                     46: extern char **file_names;
                     47: extern table_entry symtab;
                     48: %}
                     49: %start type_spec
                     50: 
                     51: %union {
                     52:        filt_struct *filt;
                     53:        char strval[255];
                     54:        int symbol;
                     55: }
                     56: 
                     57: %token NUMBER NAME DEFAULT STRING OID AND OR NOT APPROX EQUAL ITEM
                     58: 
                     59: %type <filt> filter filter_list assertion filter_item
                     60: %type <symbol> filt_type match
                     61: %token <symbol> NOT AND OR APPROX EQUAL SUBSTRING
                     62: %token <symbol> '"' ':' '(' ')'
                     63: %token <strval> STRING OID
                     64: %type  <strval> name default
                     65: 
                     66: %%
                     67:  type_spec    :        name filter             {make_type($1, $2);}
                     68:              ; 
                     69: 
                     70:  name         :        NAME ':' STRING                 {(void) strcpy($$, $3);}
                     71:              ;
                     72: 
                     73:  default      :        DEFAULT ':' STRING              {(void) strcpy($$, $3);}
                     74:               |                                        {(void) strcpy($$, "\0");}
                     75:              ;
                     76: 
                     77:  assertion    : '(' filt_type filter filter filter_list ')'    {$$ = make_parent_filter($2, $3, $4, $5);}
                     78:              | '(' NOT filter ')'                              {$$ = make_parent_filter($2, $3, (filt_struct *) 0,(filt_struct *) 0);}
                     79:              | filter_item                                     {$$ = $1;}
                     80:              ;
                     81: 
                     82:  filter_list  : filter filter_list                     {$$ = link_filters($1, $2);}
                     83:              | filter                                  {$$ = $1;}
                     84:              |                                         {$$ = (filt_struct *) 0;}
                     85:              ;
                     86: 
                     87:  filter       : filter_item                    {$$ = $1;}
                     88:              | assertion                       {$$ = $1;}
                     89:              ;
                     90: 
                     91:  filter_item  : '(' OID match STRING ')'       {$$ = make_item_filter($2, $3, $4);}
                     92:              ;
                     93: 
                     94:  match        : APPROX                         {$$ = $1;}
                     95:              | EQUAL                           {$$ = $1;}
                     96:              | SUBSTRING                       {$$ = $1;}
                     97:              ;
                     98: 
                     99:  filt_type    : AND                            {$$ = $1;}
                    100:              | OR                              {$$ = $1;}
                    101:              ;
                    102: %%
                    103: 
                    104: yylex()
                    105: {
                    106:        int c, count = 0;
                    107:        char lexeme[255];
                    108: 
                    109:        while(iswspace(c = getc(file)))
                    110:                if (c == EOF) return(0);
                    111: 
                    112:         lexeme[count++] = c;
                    113:        
                    114:        switch(c) {
                    115:              case '#':
                    116:                while (getc(file) != '\n');
                    117:                return(yylex());
                    118:               case '"':
                    119:                count = 0;
                    120:                while ((c = getc(file)) != '"')
                    121:                        lexeme[count++] = c;
                    122:                lexeme[count] = '\0';
                    123:                (void) strcpy(yylval.strval, lexeme);
                    124:                return STRING;
                    125:              case '$':
                    126:                while (!iswspace((c = getc(file))) && !issymbol(c))
                    127:                        lexeme[count++] = c;
                    128:                lexeme[count] = '\0';
                    129:                put_symbol_value(symtab, lexeme+1, (char *) 0);
                    130:                (void) strcpy(yylval.strval, lexeme);
                    131:                 return STRING;
                    132:              case '(':
                    133:                return (int) c;
                    134:              case ')':
                    135:                return (int) c;
                    136:              case ':':
                    137:                return (int) c;
                    138:              case '&':
                    139:                yylval.symbol = AND;
                    140:                return AND;
                    141:              case '|':
                    142:                yylval.symbol = OR;
                    143:                return OR;
                    144:              case '!':
                    145:                yylval.symbol = NOT;
                    146:                return NOT;
                    147:              case '*':
                    148:                lexeme[count] = '\0';
                    149:                (void) strcpy(yylval.strval, lexeme);
                    150:                return STRING;
                    151:              case '~':
                    152:                if((lexeme[count] = getc(file)) == '=') {
                    153:                        yylval.symbol = APPROX;
                    154:                        return APPROX;
                    155:                      }                 
                    156:                break;
                    157:              case '%':
                    158:                if((lexeme[count] = getc(file)) == '=') {
                    159:                         yylval.symbol = SUBSTRING;
                    160:                        return SUBSTRING;
                    161:                      }
                    162:                break;
                    163:              case '=':
                    164:                yylval.symbol = EQUAL;
                    165:                return EQUAL;
                    166:              }
                    167: 
                    168:        while(!iswspace(c = getc(file)) && c != '\0' && !issymbol(c))
                    169:                if (c != EOF)
                    170:                        lexeme[count++] = c;
                    171:                else
                    172:                        return(0);
                    173: 
                    174:        (void) fseek(file,(long) -1, 1);
                    175: 
                    176:        lexeme[count] = '\0';
                    177:        switch(*lexeme) {
                    178:              case 'd':
                    179:              case 'D':
                    180:                if(!strcmp(lexeme, "default") || !strcmp(lexeme, "DEFAULT"))
                    181:                        return DEFAULT;
                    182:                else {
                    183:                        (void) strcpy(yylval.strval, lexeme);
                    184:                        return STRING;
                    185:                }
                    186:              case 'n':
                    187:              case 'N':
                    188:                if(!strcmp(lexeme, "name") || !strcmp(lexeme, "NAME"))
                    189:                        return NAME;
                    190:                else {
                    191:                         (void) strcpy(yylval.strval, lexeme);
                    192:                        return STRING;
                    193:                }
                    194:              case '0':
                    195:              case '1':
                    196:              case '2':
                    197:              case '3':
                    198:              case '4':
                    199:              case '5':
                    200:              case '6':
                    201:              case '7':
                    202:              case '8':
                    203:              case '9':
                    204:                count = 0;
                    205:                while (isdigit(lexeme[count]) || lexeme[count] == '.') count++;
                    206:                if (lexeme[count] == '\0') {
                    207:                        (void) strcpy(yylval.strval, lexeme);
                    208:                        return OID;
                    209:                } else {
                    210:                        (void) strcpy(yylval.strval, lexeme);
                    211:                        return STRING;
                    212:                }
                    213:              default:
                    214:                (void) strcpy(yylval.strval, lexeme);
                    215:                return STRING;
                    216:        }
                    217: }
                    218: 
                    219: yyerror(err)
                    220: char *err;
                    221: {
                    222:   /* Sorry */
                    223:   (void) fprintf(stderr, "Parse error: ");
                    224:   (void) fprintf(stderr, err);
                    225:   (void) fprintf(stderr, "\n");
                    226: }
                    227: 
                    228: int
                    229: issymbol(c)
                    230: char c;
                    231: {
                    232:        switch(c) {
                    233:              case '#':
                    234:                 return 1;
                    235:               case '"':
                    236:                 return 1;
                    237:              case '(':
                    238:                return 1;
                    239:              case ')':
                    240:                return 1;
                    241:              case ':':
                    242:                return 1;
                    243:              case '&':
                    244:                return 1;
                    245:              case '|':
                    246:                return 1;
                    247:              case '!':
                    248:                return 1;
                    249:              case '*':
                    250:                return 1;
                    251:              case '~':
                    252:                return 1;
                    253:              case '=':
                    254:                return 1;
                    255:              case '$':
                    256:                return 1;
                    257:              case '%':
                    258:                return 1;
                    259:        }
                    260:        return 0;
                    261: }
                    262: 
                    263: int
                    264: iswspace(c)
                    265: char c;
                    266: {
                    267:        switch(c) {
                    268:              case ' ':
                    269:                return 1;
                    270:              case '\n':
                    271:                return 1;
                    272:              case '\t':
                    273:                return 1;
                    274:        }
                    275:        return 0;
                    276: }
                    277: 
                    278: 
                    279: 

unix.superglobalmegacorp.com

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