DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T f

⟦29389c6ed⟧ TextFile

    Length: 5368 (0x14f8)
    Types: TextFile
    Names: »filter.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Chans/dirlist/filter.c« 

TextFile

/* filter.c - Directory Operation Filters */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/filter.c,v 5.0 90/09/20 15:45:50 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Chans/dirlist/RCS/filter.c,v 5.0 90/09/20 15:45:50 pp Exp Locker: pp $
 *
 * $Log:	filter.c,v $
 * Revision 5.0  90/09/20  15:45:50  pp
 * rcsforce : 5.0 public release
 * 
 */



/*
 *                                NOTICE
 *
 *    Acquisition, use, and distribution of this module and related
 *    materials are subject to the restrictions of a license agreement.
 *    Consult the Preface in the User's Manual for the full terms of
 *    this agreement.
 *
 */


/* LINTLIBRARY */

#include <isode/quipu/util.h>
#include <isode/quipu/ds_search.h>

extern LLog * log_dsap;

filter_free (filt)
Filter filt;
{
register Filter ptr;
register Filter next;

	for (ptr = filt; ptr != NULLFILTER; ptr=next) {
		if (ptr->flt_type  == FILTER_ITEM) {
			switch (ptr->FUITEM.fi_type) {
			case FILTERITEM_EQUALITY:
			case FILTERITEM_GREATEROREQUAL:
			case FILTERITEM_LESSOREQUAL:
			case FILTERITEM_APPROX:
				AttrT_free (ptr->FUITEM.UNAVA.ava_type);
				AttrV_free (ptr->FUITEM.UNAVA.ava_value);
				break;
			case FILTERITEM_PRESENT:
				AttrT_free (ptr->FUITEM.UNTYPE);
				break;
			case FILTERITEM_SUBSTRINGS:
				AttrT_free (ptr->FUITEM.UNSUB.fi_sub_type);
				avs_free (ptr->FUITEM.UNSUB.fi_sub_initial);
				avs_free (ptr->FUITEM.UNSUB.fi_sub_any);
				avs_free (ptr->FUITEM.UNSUB.fi_sub_final);
				break;
			}
		}  else
			filter_free (ptr->flt_un.flt_un_filter);

		next = ptr->flt_next;
		free ((char *) ptr);
	}
}

filter_append (a,b)
Filter a,b;
{
register Filter ptr,trail;

	if ( a == NULLFILTER)
		DLOG (log_dsap,LLOG_DEBUG,("appending to null filter !"));

	for (ptr=a; ptr!= NULLFILTER; ptr=ptr->flt_next)
		trail = ptr;

	trail->flt_next = b;
}


Filter strfilter (at,s,type)
AttributeType at;
char * s;
char type;
{
Filter filt;

	if (type == FILTERITEM_SUBSTRINGS) {

		filt = filter_alloc ();
		filt->flt_next = NULLFILTER;
		filt->flt_type = FILTER_ITEM;
		filt->FUITEM.fi_type = FILTERITEM_SUBSTRINGS;
		filt->FUITEM.UNSUB.fi_sub_initial = NULLAV;
		filt->FUITEM.UNSUB.fi_sub_final = NULLAV;
		filt->FUITEM.UNSUB.fi_sub_type = AttrT_cpy (at);
		filt->FUITEM.UNSUB.fi_sub_any = str2avs(s,
			filt->FUITEM.UNSUB.fi_sub_type);

	} else {

		filt = filter_alloc ();
		filt->flt_next = NULLFILTER;
		filt->flt_type = FILTER_ITEM;
		filt->FUITEM.fi_type = type;
		filt->FUITEM.UNAVA.ava_type = AttrT_cpy (at);
		filt->FUITEM.UNAVA.ava_value = str2AttrV(s,
			filt->FUITEM.UNAVA.ava_type->at_table->oa_syntax);
	
	}

	return filt;
}

Filter ocfilter (s)
char * s;
{
Filter filt;

	filt = filter_alloc ();
	filt->flt_next = NULLFILTER;
	filt->flt_type = FILTER_ITEM;
	filt->FUITEM.fi_type = FILTERITEM_EQUALITY;
	if ((filt->FUITEM.UNAVA.ava_type = AttrT_new ("ObjectClass")) == NULLAttrT) {
		LLOG (log_dsap,LLOG_EXCEPTIONS,("ObjectClass attribute unknown"))
		return NULLFILTER;
	}
	filt->FUITEM.UNAVA.ava_value = str2AttrV(s,
		filt->FUITEM.UNAVA.ava_type->at_table->oa_syntax);
	if (filt->FUITEM.UNAVA.ava_value == NULLAttrV) {
		LLOG (log_dsap,LLOG_EXCEPTIONS,("'%s' unknown",s));
		return NULLFILTER;
	}

	return filt;
}

Filter joinfilter (f, type)
Filter f;
char type;
{
Filter filt;

	filt = filter_alloc ();
	filt->flt_next = NULLFILTER;
	filt->flt_type = type;
	filt->FUFILT = f;

	return filt;
}

print_filter (nps, fi, level)
PS nps;
register Filter	fi;
int	level;
{
    char   *cp;
    register Filter    fi2;
    register struct filter_item *fi3;

    switch (fi -> flt_type) {
	case FILTER_ITEM:
	    fi3 = &fi -> FUITEM;
	    if (level)
		ps_print (nps, "(");
	    switch (fi3 -> fi_type) {
	        case FILTERITEM_APPROX:
		    cp = "~=";
		    goto item;

	        case FILTERITEM_EQUALITY:
		    cp = "=";
		    goto item;

	        case FILTERITEM_GREATEROREQUAL:
		    cp = ">=";
		    goto item;

	        case FILTERITEM_LESSOREQUAL:
		    cp = ">=";
item: ;
		    AttrT_print (nps, fi3 -> UNAVA.ava_type, EDBOUT);
		    ps_print (nps, cp);
		    AttrV_print (nps, fi3 -> UNAVA.ava_value, EDBOUT);
		    break;

	        case FILTERITEM_SUBSTRINGS:
		    AttrT_print (nps, fi3 -> UNSUB.fi_sub_type, EDBOUT);
		    ps_print (nps, "=");
		    avs_print_aux (nps, fi3 -> UNSUB.fi_sub_initial,EDBOUT,"*");
		    ps_print (nps, "*");
		    avs_print_aux (nps, fi3 -> UNSUB.fi_sub_any, EDBOUT, "*");
		    ps_print (nps, "*");
		    avs_print_aux (nps, fi3 -> UNSUB.fi_sub_final, EDBOUT, "*");
		    break;

	        case FILTERITEM_PRESENT:
		    AttrT_print (nps, fi3 -> UNTYPE, EDBOUT);
		    ps_print (nps, "=*");
		    break;

		default:
		    ps_printf (nps,
			       "[internal error--malformed filter item type 0x%x]",
			       fi3 -> fi_type);
		    break;
	    }
	    if (level)
		ps_print (nps, ")");
	    break;
	
	case FILTER_AND:
	    cp = "&";
	    goto op;
	case FILTER_OR:
	    cp = "|";
	    goto op;

	case FILTER_NOT:
	    cp = "!";
op: ;
	    ps_printf (nps, "(%s", cp);
	    level++;
	    for (fi2 = fi -> FUFILT; fi2; fi2 = fi2 -> flt_next) {
		ps_print (nps, " ");
		print_filter (nps, fi2, level);
	    }
	    ps_print (nps, ")");
	    break;

	default:
	    ps_printf (nps, "[internal error--malformed filter type 0x%x]",
		       fi -> flt_type);
    }
}