Annotation of 43BSDReno/contrib/isode-beta/others/quipu/uips/pod/filt.c, revision 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.