|
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)); }