Net2/usr/src/contrib/isode/others/quipu/uips/xd/filt.c


#ifndef lint
static char *rcsid = "$Header: /f/osi/others/quipu/uips/xd/RCS/filt.c,v 7.2 91/02/22 09:32:47 mrose Interim $";
#endif

/*
 * $Header: /f/osi/others/quipu/uips/xd/RCS/filt.c,v 7.2 91/02/22 09:32:47 mrose Interim $
 */

/*
 * $Log:	filt.c,v $
 * Revision 7.2  91/02/22  09:32:47  mrose
 * Interim 6.8
 * 
 * Revision 7.1  90/07/27  08:45:57  mrose
 * update
 * 
 * Revision 7.0  90/06/12  13:10:49  mrose
 * *** empty log message ***
 * 
 * Revision 1.5  90/04/26  10:22:40  emsrssn
 * Installation fixed
 * 
 * 
 * Revision 1.4  90/04/25  17:28:10  emsrssn
 * Lint tidy up
 * 
 * 
 * Revision 1.3  90/04/19  13:54:11  emsrssn
 * keyboard accelerator now activates button highlight.
 * 
 * search types available is dependent on current position
 * to prevent unreasonable searches.
 * 
 * the help popup changes automatically depending on the 
 * position of the cursor
 * 
 * buttons remain a fixed size when the application is
 * resized
 * 
 * command line options are now handled properly
 * 
 * logging added
 * 
 * "reads" are now sorted to show mail address at top etc.
 * 
 * 
 * Revision 1.2  90/03/16  11:29:41  emsrdsm
 * *** empty log message ***
 * 
 * Revision 1.1  90/03/09  16:48:58  emsrdsm
 * Initial revision
 * 
 * Revision 1.1  90/03/09  12:10:17  emsrdsm
 * Initial revision
 * 
 * Revision 1.1  90/03/09  11:36:42  emsrdsm
 * Initial revision
 * 
 */

#include "quipu/util.h"
#include "quipu/common.h"
#include "quipu/entry.h"
#include "filt.h"
#include "y.tab.h"
#include "symtab.h"

extern unsigned int curr_filt;
extern unsigned int filt_num;
extern unsigned int typeindx;
extern filt_struct *filt_arr[];
extern char *filtvalue[];
extern char *filttype[];
extern char *default_arr[];

extern char svalue[], mvalue[];

make_type(name_val, filt)
char * name_val;
filt_struct * filt;
{
  filttype[curr_filt] = (char *) malloc((unsigned int) (strlen(name_val) + 1));
  (void) strcpy(filttype[curr_filt], name_val);
  
/*  if (default_val) {
    default_arr[curr_filt] = 
      (char *) malloc((unsigned int) (strlen(default_val)+1));
    (void) strcpy(default_arr[curr_filt], default_val);
  } else {
    default_arr[curr_filt] = (char *) malloc((unsigned int) 2);
    *default_arr[curr_filt] = '\0';
  }*/
  filt_arr[curr_filt] = filt;
}

filt_struct *
make_item_filter(oid, match, value)
char *oid;
int match;
char *value;
{
  register filt_struct * filt = (filt_struct *) malloc(sizeof(filt_struct));
  
  filt->flt_type = ITEM;
  filt->next = 0;
  
  filt->fu_cont.item.fi_type = match;
  filt->fu_cont.item.stroid = 
    (char *) malloc((unsigned int) (strlen(oid) + 1));
  (void) strcpy(filt->fu_cont.item.stroid, oid);
  
  if (*value == '*') filt->fu_cont.item.name = (char *) 0;
  else {
    filt->fu_cont.item.name = 
      (char *) malloc((unsigned int) (strlen(value) + 1));
    (void) strcpy(filt->fu_cont.item.name, value);
  }
  return filt;
}

filt_struct *
link_filters(filt1, filt2)
filt_struct *filt1;
filt_struct *filt2;
{
  filt1->next = filt2;
  return filt1;
}

filt_struct *
make_parent_filter(filt_type, filt1, filt2, filt3)
int filt_type;
filt_struct * filt1;
filt_struct * filt2;
filt_struct * filt3;
{
  filt_struct * parent = (filt_struct *) malloc(sizeof(filt_struct));

  switch (filt_type) {

  case NOT:
    parent->flt_type = NOT;
    parent->fu_cont.sub_filt = filt1;
    parent->next = 0;
    break;

  case AND:
    parent->flt_type = AND;
    parent->fu_cont.sub_filt = filt1;
    filt1->next = filt2;
    filt2->next = filt3;
    parent->next = 0;
    break;

  default:
    parent->flt_type = OR;
    parent->fu_cont.sub_filt = filt1;
    filt1->next = filt2;
    filt2->next = filt3;
    parent->next = 0;
    break;
  }

  return parent;
}

free_filt(filt)
filt_struct *filt;
{
  if (filt) {
    free_filt(filt->next);

    if (filt->flt_type = ITEM) {
      free(filt->fu_cont.item.stroid);
      if (filt->fu_cont.item.name) free(filt->fu_cont.item.name);
    } else
      free_filt(filt->fu_cont.sub_filt);

    free((char *) filt);
  } else
    return;
}

Filter
make_filter(filt)
filt_struct *filt;
{
  int type;
  Filter rfilt, sfilt = filter_alloc();
  
  if (!filt)
    return 0;
  
  switch(filt->flt_type) {

  case ITEM:
    sfilt->flt_type = FILTER_ITEM;
    sfilt->flt_next = make_filter(filt->next);
    
    (void) strcpy(svalue, (filt->fu_cont.item.name? 
			   filt->fu_cont.item.name:
			   mvalue));
    
    type = filt->fu_cont.item.fi_type;

    switch(type) {
    case APPROX:
    case EQUAL:
      sfilt->flt_un.flt_un_item.fi_un.fi_un_ava.ava_type = 
	AttrT_new(filt->fu_cont.item.stroid);

      if ((sfilt->flt_un.flt_un_item.fi_un.fi_un_ava.ava_value =
	   str2AttrV(svalue,
		     sfilt->flt_un.flt_un_item.fi_un.fi_un_ava.ava_type->
		     oa_syntax)) == NULL) {
	
	rfilt = sfilt->flt_next;
	sfilt->flt_next = NULLFILTER;
	filter_free(sfilt);
	return rfilt;
      }

      if (type == EQUAL)
	sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_EQUALITY;
      else
	sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_APPROX;

      break;

    case SUBSTRING:
      sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_SUBSTRINGS;
      sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_type =
	AttrT_new(filt->fu_cont.item.stroid);
      
      sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_initial =
	NULLAV;
      sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_final = 
	NULLAV;
      sfilt->flt_un.flt_un_item.fi_un.fi_un_substrings.fi_sub_any =
	avs_comp_new(str2AttrV(svalue,
			       sfilt->flt_un.flt_un_item.fi_un.
			       fi_un_substrings.fi_sub_type->
			       oa_syntax));
      break;
      
    default:
      sfilt->flt_un.flt_un_item.fi_type = FILTERITEM_APPROX;
      break;
    }
    return sfilt;

    
  case AND:
    sfilt->flt_type = FILTER_AND;
    sfilt->flt_un.flt_un_filter = make_filter(filt->fu_cont.sub_filt);
    sfilt->flt_next = make_filter(filt->next);
    return sfilt;

    
  case OR:
    sfilt->flt_type = FILTER_OR;
    sfilt->flt_un.flt_un_filter = make_filter(filt->fu_cont.sub_filt);
    sfilt->flt_next = make_filter(filt->next);
    return sfilt;


  case NOT:
    sfilt->flt_type = FILTER_NOT;
    sfilt->flt_next = make_filter(filt->next);
    sfilt->flt_un.flt_un_filter = make_filter(filt->fu_cont.sub_filt);
    return sfilt;


  default:
    return NULLFILTER;
  }
}