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

1.1       root        1: 
                      2: #ifndef lint
                      3: static char *rcsid = "$Header: /f/osi/others/quipu/uips/pod/RCS/filt.c,v 7.1 90/07/27 08:45:37 mrose Exp $";
                      4: #endif
                      5: 
                      6: /*
                      7:  * $Header: /f/osi/others/quipu/uips/pod/RCS/filt.c,v 7.1 90/07/27 08:45:37 mrose Exp $
                      8:  */
                      9: 
                     10: /*
                     11:  * $Log:       filt.c,v $
                     12:  * Revision 7.1  90/07/27  08:45:37  mrose
                     13:  * update
                     14:  * 
                     15:  * Revision 7.0  90/06/12  13:15:49  mrose
                     16:  * *** empty log message ***
                     17:  * 
                     18:  * Revision 1.5  90/04/26  10:21:12  emsrdsm
                     19:  * *** empty log message ***
                     20:  * 
                     21:  * Revision 1.4  90/04/25  13:47:24  emsrdsm
                     22:  * i) lint'ed
                     23:  * 
                     24:  * Revision 1.3  90/04/20  10:28:16  emsrdsm
                     25:  * (i) fixed form bug
                     26:  * 
                     27:  * Revision 1.2  90/04/18  18:48:11  emsrdsm
                     28:  * i) added logging
                     29:  * 
                     30:  * Revision 1.1  90/04/10  16:43:44  emsrdsm
                     31:  * Initial revision
                     32:  * 
                     33:  */
                     34: #include <string.h>
                     35: #include <malloc.h>
                     36: #include <ctype.h>
                     37: 
                     38: #include "quipu/util.h"
                     39: #include "quipu/common.h"
                     40: #include "quipu/entry.h"
                     41: 
                     42: #include "filt.h"
                     43: #include "y.tab.h"
                     44: #include "symtab.h"
                     45: 
                     46: extern unsigned int curr_filt;
                     47: extern unsigned int filt_num;
                     48: extern unsigned int typeindx;
                     49: extern filt_struct *filt_arr[];
                     50: extern char *filtvalue[];
                     51: extern char *filttype[];
                     52: extern char *default_arr[];
                     53: 
                     54: extern char svalue[], mvalue[];
                     55: 
                     56: make_type(name_val, filt)
                     57: char * name_val;
                     58: filt_struct * filt;
                     59: {
                     60:   filttype[curr_filt] = (char *) malloc((unsigned int) (strlen(name_val) + 1));
                     61:   (void) strcpy(filttype[curr_filt], name_val);
                     62:   
                     63: /*  if (default_val) {
                     64:     default_arr[curr_filt] = 
                     65:       (char *) malloc((unsigned int) (strlen(default_val)+1));
                     66:     (void) strcpy(default_arr[curr_filt], default_val);
                     67:   } else {
                     68:     default_arr[curr_filt] = (char *) malloc((unsigned int) 2);
                     69:     *default_arr[curr_filt] = '\0';
                     70:   }*/
                     71:   filt_arr[curr_filt] = filt;
                     72: }
                     73: 
                     74: filt_struct *
                     75: make_item_filter(oid, match, value)
                     76: char *oid;
                     77: int match;
                     78: char *value;
                     79: {
                     80:   register filt_struct * filt = (filt_struct *) malloc(sizeof(filt_struct));
                     81:   
                     82:   filt->flt_type = ITEM;
                     83:   filt->next = 0;
                     84:   
                     85:   filt->fu_cont.item.fi_type = match;
                     86:   filt->fu_cont.item.stroid = 
                     87:     (char *) malloc((unsigned int) (strlen(oid) + 1));
                     88:   (void) strcpy(filt->fu_cont.item.stroid, oid);
                     89:   
                     90:   if (*value == '*') filt->fu_cont.item.name = (char *) 0;
                     91:   else {
                     92:     filt->fu_cont.item.name = 
                     93:       (char *) malloc((unsigned int) (strlen(value) + 1));
                     94:     (void) strcpy(filt->fu_cont.item.name, value);
                     95:   }
                     96:   return filt;
                     97: }
                     98: 
                     99: filt_struct *
                    100: link_filters(filt1, filt2)
                    101: filt_struct *filt1;
                    102: filt_struct *filt2;
                    103: {
                    104:   filt1->next = filt2;
                    105:   return filt1;
                    106: }
                    107: 
                    108: filt_struct *
                    109: make_parent_filter(filt_type, filt1, filt2, filt3)
                    110: int filt_type;
                    111: filt_struct * filt1;
                    112: filt_struct * filt2;
                    113: filt_struct * filt3;
                    114: {
                    115:   filt_struct * parent = (filt_struct *) malloc(sizeof(filt_struct));
                    116: 
                    117:   switch (filt_type) {
                    118: 
                    119:   case NOT:
                    120:     parent->flt_type = NOT;
                    121:     parent->fu_cont.sub_filt = filt1;
                    122:     parent->next = 0;
                    123:     break;
                    124: 
                    125:   case AND:
                    126:     parent->flt_type = AND;
                    127:     parent->fu_cont.sub_filt = filt1;
                    128:     filt1->next = filt2;
                    129:     filt2->next = filt3;
                    130:     parent->next = 0;
                    131:     break;
                    132: 
                    133:   default:
                    134:     parent->flt_type = OR;
                    135:     parent->fu_cont.sub_filt = filt1;
                    136:     filt1->next = filt2;
                    137:     filt2->next = filt3;
                    138:     parent->next = 0;
                    139:     break;
                    140:   }
                    141: 
                    142:   return parent;
                    143: }
                    144: 
                    145: free_filt(filt)
                    146: filt_struct *filt;
                    147: {
                    148:   if (filt) {
                    149:     free_filt(filt->next);
                    150: 
                    151:     if (filt->flt_type = ITEM) {
                    152:       free(filt->fu_cont.item.stroid);
                    153:       if (filt->fu_cont.item.name) free(filt->fu_cont.item.name);
                    154:     } else
                    155:       free_filt(filt->fu_cont.sub_filt);
                    156: 
                    157:     free((char *) filt);
                    158:   } else
                    159:     return;
                    160: }
                    161: 
                    162: Filter
                    163: make_filter(filt)
                    164: filt_struct *filt;
                    165: {
                    166:   int type, count;
                    167:   char *value;
                    168:   Filter rfilt, sfilt = filter_alloc();
                    169:   
                    170:   if (!filt)
                    171:     return (Filter) 0;
                    172:   
                    173:   switch(filt->flt_type) {
                    174: 
                    175:   case ITEM:
                    176:     sfilt->flt_type = FILTER_ITEM;
                    177:     sfilt->flt_next = make_filter(filt->next);
                    178: 
                    179:     if (strcmp(filt->fu_cont.item.stroid, "2.5.4.4"))
                    180:       (void) strcpy(svalue, (filt->fu_cont.item.name? 
                    181:                             filt->fu_cont.item.name:
                    182:                             mvalue));
                    183:     else if (!filt->fu_cont.item.name) {
                    184:       count = strlen(mvalue);
                    185:       value = mvalue + count - 1;
                    186: 
                    187:       while(!isalpha(*value) && value > mvalue) value--;
                    188:       while (!isspace(*value) && value > mvalue) value--;
                    189: 
                    190:       if (mvalue < value) (void) strcpy(svalue, ++value);
                    191:       else (void) strcpy(svalue, mvalue);
                    192:     } else (void) strcpy(svalue, filt->fu_cont.item.name);
                    193:     
                    194:     type = filt->fu_cont.item.fi_type;
                    195: 
                    196:     switch(type) {
                    197:     case APPROX:
                    198:     case EQUAL:
                    199:       sfilt->flt_un.flt_un_item.fi_un.fi_un_ava.ava_type = 
                    200:        AttrT_new(filt->fu_cont.item.stroid);
                    201: 
                    202:       if ((sfilt->flt_un.flt_un_item.fi_un.fi_un_ava.ava_value =
                    203:           str2AttrV(svalue,
                    204:                     sfilt->flt_un.flt_un_item.fi_un.fi_un_ava.ava_type->
                    205:                     oa_syntax)) == NULL) {
                    206:        
                    207:        rfilt = sfilt->flt_next;
                    208:        sfilt->flt_next = NULLFILTER;
                    209:        filter_free(sfilt);
                    210:        return rfilt;
                    211:       }
                    212: 
                    213:       if (type == EQUAL)
                    214:        sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_EQUALITY;
                    215:       else
                    216:        sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_APPROX;
                    217: 
                    218:       break;
                    219: 
                    220:     case SUBSTRING:
                    221:       sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_SUBSTRINGS;
                    222:       sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_type =
                    223:        AttrT_new(filt->fu_cont.item.stroid);
                    224:       
                    225:       sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_initial =
                    226:        NULLAV;
                    227:       sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_final = 
                    228:        NULLAV;
                    229:       sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_any =
                    230:        avs_comp_new(str2AttrV(svalue,
                    231:                               sfilt->flt_un.flt_un_item.fi_un.
                    232:                               fi_un_substrings.fi_sub_type->
                    233:                               oa_syntax));
                    234:       break;
                    235:       
                    236:     default:
                    237:       sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_APPROX;
                    238:       break;
                    239:     }
                    240:     return sfilt;
                    241:     
                    242:   case AND:
                    243:     sfilt->flt_type = FILTER_AND;
                    244:     sfilt->flt_un.flt_un_filter = make_filter(filt->fu_cont.sub_filt);
                    245:     sfilt->flt_next = make_filter(filt->next);
                    246:     return sfilt;
                    247:     
                    248:   case OR:
                    249:     sfilt->flt_type = FILTER_OR;
                    250:     sfilt->flt_un.flt_un_filter = make_filter(filt->fu_cont.sub_filt);
                    251:     sfilt->flt_next = make_filter(filt->next);
                    252:     return sfilt;
                    253: 
                    254:   case NOT:
                    255:     sfilt->flt_type = FILTER_NOT;
                    256:     sfilt->flt_next = make_filter(filt->next);
                    257:     sfilt->flt_un.flt_un_filter = make_filter(filt->fu_cont.sub_filt);
                    258:     return sfilt;
                    259: 
                    260:   default:
                    261:     return NULLFILTER;
                    262:   }
                    263: }
                    264: 
                    265: 
                    266: 
                    267: 
                    268: 
                    269: 
                    270: 
                    271: 
                    272: 
                    273: 
                    274: 
                    275: 
                    276: 
                    277: 

unix.superglobalmegacorp.com

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