Net2/usr/src/contrib/isode/dsap/common/entryinfo.c

/* entryinfo.c - Entry Information routines */

#ifndef lint
static char *rcsid = "$Header: /f/osi/dsap/common/RCS/entryinfo.c,v 7.3 91/02/22 09:19:10 mrose Interim $";
#endif

/*
 * $Header: /f/osi/dsap/common/RCS/entryinfo.c,v 7.3 91/02/22 09:19:10 mrose Interim $
 *
 *
 * $Log:	entryinfo.c,v $
 * Revision 7.3  91/02/22  09:19:10  mrose
 * Interim 6.8
 * 
 * Revision 7.2  90/10/17  11:41:49  mrose
 * sync
 * 
 * Revision 7.1  90/07/09  14:34:26  mrose
 * sync
 * 
 * Revision 7.0  89/11/23  21:42:11  mrose
 * Release 6.0
 * 
 */

/*
 *                                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 "quipu/util.h"
#include "quipu/commonarg.h"

entryinfo_comp_free (a,state)
register EntryInfo *a;
int state;
{
register EntryInfo * einfo;
register Attr_Sequence as;

	if (a == NULLENTRYINFO)
		return;

	dn_free (a->ent_dn);
	if (state == 1)
		for ( as=a->ent_attr; as!= NULLATTR; as=as->attr_link)
			free ((char *) as);
	else
		as_free (a->ent_attr);

	for (einfo=a->ent_next; einfo!=NULLENTRYINFO; einfo=einfo->ent_next) {
		dn_free (einfo->ent_dn);
		if (state == 1)
			for ( as=einfo->ent_attr; as!= NULLATTR; as=as->attr_link)
				free ((char *) as);
		else
			as_free (einfo->ent_attr);
		free ((char *) einfo);
	}
}

entryinfo_free (a,state)
register EntryInfo * a;
register int state;
{
	if (a == NULLENTRYINFO)
		return;
	entryinfo_comp_free (a,state);
	free ((char *) a);
}

entryinfo_cpy (a,b)
register EntryInfo *a;
register EntryInfo *b;
{
	a->ent_dn        = dn_cpy (b->ent_dn);
	a->ent_attr      = as_cpy (b->ent_attr);
	a->ent_iscopy    = b->ent_iscopy;
	a->ent_age       = b->ent_age;
	a->ent_next      = b->ent_next;
}

entryinfo_append (a,b)
register EntryInfo *a,*b;
{
register EntryInfo *ptr;

	if ( a  == NULLENTRYINFO )
		return;

	for (ptr=a; ptr->ent_next != NULLENTRYINFO; ptr=ptr->ent_next)
		;  /* noop */

	ptr->ent_next = b;
}

entryinfo_merge (a,b)
register EntryInfo *a,*b;
{
register EntryInfo *ptr;
EntryInfo *tmp, *prev, *trail;

	if (( a == NULLENTRYINFO )
	   || (b == NULLENTRYINFO ))
		return;

	for (ptr=a; ptr != NULLENTRYINFO; ptr=ptr->ent_next) {
		prev = NULLENTRYINFO;
		for (tmp=b; tmp != NULLENTRYINFO; tmp=tmp->ent_next) {
		 	if (dn_cmp (ptr->ent_dn, tmp->ent_dn) == OK) {
				/* already got it - throw it away */
				if (prev == NULLENTRYINFO)
					b = tmp->ent_next;
				else
					prev->ent_next = tmp->ent_next;
				as_free (tmp->ent_attr);
				dn_free (tmp->ent_dn);
				free ((char *)tmp);
				break;	
			}
			prev = tmp;
		}
		trail = ptr;
	}

	trail->ent_next = b;
}

entryinfo_print (ps,entryinfo,format)
PS  ps;
EntryInfo *entryinfo;
int format;
{
register EntryInfo *einfo;

	for (einfo= entryinfo; einfo!=NULLENTRYINFO; einfo=einfo->ent_next) {
		dn_print(ps,einfo->ent_dn,EDBOUT);
		ps_print (ps,"\n");
		if (einfo->ent_attr)
			as_print (ps,einfo->ent_attr,format);
		ps_print (ps,"\n");
	}
}