|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T r
Length: 5642 (0x160a)
Types: TextFile
Names: »rdn.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/dsap/common/rdn.c«
/* rdn.c - General Relative Distinguished Name utility routines */
#ifndef lint
static char *rcsid = "$Header: /f/osi/dsap/common/RCS/rdn.c,v 6.0 89/03/18 23:27:46 mrose Rel $";
#endif
/*
* $Header: /f/osi/dsap/common/RCS/rdn.c,v 6.0 89/03/18 23:27:46 mrose Rel $
*
*
* $Log: rdn.c,v $
* Revision 6.0 89/03/18 23:27:46 mrose
* Release 5.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/name.h"
#include "quipu/dsp.h"
#include "quipu/ds_error.h"
extern LLog * log_dsap;
rdn_comp_free (rdn)
RDN rdn;
{
AttrT_free (rdn->rdn_at);
AttrV_free (rdn->rdn_av);
free ((char *) rdn);
}
rdn_free (rdn)
RDN rdn;
{
register RDN eptr;
for (eptr=rdn; eptr!=NULLRDN; eptr=eptr->rdn_next)
rdn_comp_free (eptr);
}
RDN rdn_comp_new (at,av)
AttributeType at;
AttributeValue av;
{
register RDN ptr;
ptr = rdn_comp_alloc ();
rdn_comp_fill (ptr,at,av);
ptr->rdn_next = NULLRDN;
return (ptr);
}
rdn_decode (x)
RDN x;
{
register RDN eptr;
for (eptr=x; eptr!=NULLRDN; eptr=eptr->rdn_next)
AttrV_decode (eptr->rdn_at,eptr->rdn_av) ;
}
RDN rdn_merge (a,b)
RDN a,b;
{
register RDN aptr, bptr, result, trail;
if ( a == NULLRDN )
return (b);
if ( b == NULLRDN )
return (a);
/* start sequence off, make sure 'a' is the first */
switch (rdn_cmp_comp (a,b)) {
case 0: /* equal */
result = a;
aptr = a->rdn_next;
rdn_comp_free (b);
bptr = b->rdn_next;
break;
case -1:
result = b;
aptr = a;
bptr = b->rdn_next;
break;
case 1:
result = a;
aptr = a->rdn_next;
bptr = b;
break;
}
trail = result;
while ( (aptr != NULLRDN) && (bptr != NULLRDN) ) {
switch (rdn_cmp_comp (aptr,bptr)) {
case 0: /* equal */
trail->rdn_next = aptr;
trail = aptr;
rdn_comp_free (bptr);
aptr = aptr->rdn_next;
bptr = bptr->rdn_next;
break;
case -1:
trail->rdn_next = bptr;
trail = bptr;
bptr = bptr->rdn_next;
break;
case 1:
trail->rdn_next = aptr;
trail = aptr;
aptr = aptr->rdn_next;
break;
}
}
if (aptr == NULLRDN)
trail->rdn_next = bptr;
else
trail->rdn_next = aptr;
return (result);
}
RDN rdn_comp_cpy (rdn)
RDN rdn;
{
register RDN ptr;
if (rdn==NULLRDN) {
DLOG (log_dsap,LLOG_DEBUG,("copy of null rdn"));
return (NULLRDN);
}
ptr = (RDN) smalloc (sizeof(rdncomp));
ptr->rdn_at = AttrT_cpy (rdn->rdn_at);
ptr->rdn_av = AttrV_cpy (rdn->rdn_av);
ptr->rdn_next = NULLRDN;
return (ptr);
}
RDN rdn_cpy (rdn)
RDN rdn;
{
RDN start;
register RDN eptr;
register RDN ptr,ptr2;
if (rdn == NULLRDN) {
DLOG (log_dsap,LLOG_DEBUG,("rdn_cpy of null rdn"));
return (NULLRDN);
}
start = rdn_comp_cpy (rdn);
ptr2 = start;
for (eptr=rdn->rdn_next; eptr!=NULLRDN; eptr=eptr->rdn_next) {
ptr = rdn_comp_cpy (eptr);
ptr2->rdn_next = ptr;
ptr2 = ptr;
}
return (start);
}
rdn_cmp_comp (a,b)
RDN a,b;
{
register int i,j;
struct DSError err;
if ((i = AttrT_cmp (a->rdn_at,b->rdn_at)) != 0)
return (i);
j = AttrV_cmp (a->rdn_av,b->rdn_av,&err);
if ( j == -2)
ds_error_free (&err);
return (j);
}
rdn_cmp (a,b)
register RDN a,b;
{
register int i;
for (; (a != NULLRDN) && (b != NULLRDN) ; a = a->rdn_next, b = b->rdn_next)
if ( (i=rdn_cmp_comp (a,b)) != 0) {
return (i);
}
if ( (a == NULLRDN) && (b == NULLRDN) ) {
return 0;
} else {
return ( a ? 1 : -1);
}
}
rdn_comp_print (ps,rdn,format)
PS ps;
RDN rdn;
int format;
{
if (rdn!=NULLRDN) {
AttrT_print (ps,rdn->rdn_at,format);
ps_print (ps,"=");
AttrV_print (ps,rdn->rdn_av,format);
}
return;
}
rdn_print (ps,rdn,format)
RDN rdn;
PS ps;
int format;
{
register RDN eptr;
if (rdn == NULLRDN) {
if (format == READOUT)
ps_print (ps,"NULL");
return;
}
rdn_comp_print (ps,rdn,format);
if (rdn->rdn_next != NULLRDN)
for (eptr=rdn->rdn_next; eptr!=NULLRDN; eptr=eptr->rdn_next) {
switch (format) {
case DIROUT:
case EDBOUT: ps_print (ps,"%"); break;
case READOUT: ps_print (ps," % "); break;
}
rdn_comp_print (ps,eptr,format);
}
}
RDN str2rdn_aux (str)
char * str;
{
AttributeType at;
AttributeValue av;
char * ptr;
char * save, val;
char * TidyString();
/* look for "type = value" */
if (str == NULLCP) {
parse_error ("NULL rdn component",NULLCP);
return (NULLRDN);
}
if ((ptr=index(str,'=')) == 0) {
parse_error ("Equals missing in RDN '%s'",str);
return (NULLRDN);
}
save = ptr++;
save--;
if (! isspace (*save))
save++;
val = *save;
*save = 0;
if ((at = AttrT_new (TidyString(str))) == NULLAttrT) {
parse_error ("Unknown attribute type in RDN '%s'",str);
*save = val;
return (NULLRDN);
}
if ((av = str_at2AttrV (ptr,at)) == NULLAttrV) {
*save = val;
AttrT_free (at);
return (NULLRDN);
}
*save = val;
return (rdn_comp_new (at,av));
}
RDN str2rdn (str)
char * str;
{
register char *ptr;
register char *save,val;
RDN rdn = NULLRDN, newrdn;
/* look for "rdn % rdn % rdn" */
if (str == NULLCP)
return (NULLRDN);
while ( (ptr = index (str,'%')) != 0) {
save = ptr++;
save--;
if (! isspace (*save))
save++;
val = *save;
*save = 0;
if ((newrdn = str2rdn_aux (str)) == NULLRDN) {
rdn_free (rdn);
return (NULLRDN);
}
rdn = rdn_merge (rdn,newrdn);
*save = val;
str = ptr;
}
if ((newrdn = str2rdn_aux (str)) == NULLRDN) {
rdn_free (rdn);
return (NULLRDN);
}
return (rdn_merge (rdn,newrdn));
}