|
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 o
Length: 6229 (0x1855) Types: TextFile Names: »oc.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/dsap/common/oc.c«
/* oc.c - Object Class routines */ #ifndef lint static char *rcsid = "$Header: /f/osi/dsap/common/RCS/oc.c,v 7.1 90/01/11 23:49:43 mrose Exp $"; #endif /* * $Header: /f/osi/dsap/common/RCS/oc.c,v 7.1 90/01/11 23:49:43 mrose Exp $ * * * $Log: oc.c,v $ * Revision 7.1 90/01/11 23:49:43 mrose * lint * * Revision 7.0 89/11/23 21:42:31 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/entry.h" #include "tailor.h" extern LLog * log_dsap; extern short oc_sntx; extern IFP oc_hier; objectclass * oc_add (oid) OID oid; { oid_table * Current; extern objectclass ocOIDTable[]; extern int ocNumEntries; Current = &ocOIDTable[ocNumEntries].oc_ot; if (oid == NULLOID) Current->ot_oid = NULLOID; else Current->ot_oid = oid_cpy (oid); (void) strcpy (Current->ot_name, oid2ode(oid)); (void) strcpy (Current->ot_stroid, sprintoid(oid)); add_entry_aux (Current->ot_name,(caddr_t)&ocOIDTable[ocNumEntries],3,NULLCP); ocOIDTable[ocNumEntries].oc_hierachy = NULLOIDSEQ; ocOIDTable[ocNumEntries].oc_may = NULLTABLE_SEQ; ocOIDTable[ocNumEntries].oc_must = NULLTABLE_SEQ; return (&ocOIDTable[ocNumEntries++]); } static objectclass * str2oc (str) char * str; { char * ptr; char * get_oid (); objectclass *oc; if ((oc = name2oc (str)) != NULLOBJECTCLASS) return (oc); /* unknown object class -- need to add to table */ if ((ptr = get_oid (str)) == NULLCP) { parse_error ("Object class %s unknown",str); return (NULLOBJECTCLASS); } return (oc_add (str2oid(ptr))); } static AV_Sequence new_oc_avs (oc) objectclass * oc; { AV_Sequence avs; avs = avs_comp_alloc(); avs->avseq_next = NULLAV; avs->avseq_av.av_syntax = oc_sntx; avs->avseq_av.av_struct = (caddr_t) oc; return (avs); } static AV_Sequence str2oc_hier (str) char * str; { AV_Sequence avs = NULLAV; objectclass * oc; char * ptr, *save, val; str = SkipSpace (str); while ((ptr = index (str,'&')) != 0) { save = ptr++; save--; if (! isspace (*save)) save++; val = *save; *save = 0; if ((oc = str2oc (str)) == NULLOBJECTCLASS) return (NULLAV); if (avs == NULLAV) avs = new_oc_avs (oc); else add_oc_avs (oc,&avs); add_hierarchy (oc,&avs); *save = val; str = SkipSpace(ptr); } if ((oc = str2oc (str)) == NULLOBJECTCLASS) return (NULLAV); if (avs == NULLAV) avs = new_oc_avs (oc); else add_oc_avs (oc,&avs); add_hierarchy (oc,&avs); return (avs); } add_oc_avs (oc,avsp) objectclass * oc; AV_Sequence *avsp; { AV_Sequence loop; objectclass *ocp; /* see if we already have oc in heirarchy ... */ for (loop = *avsp; loop != NULLAV; loop = loop->avseq_next) { ocp = (objectclass *)loop->avseq_av.av_struct; if (oc == ocp) return; } *avsp = avs_merge (*avsp,new_oc_avs(oc)); } static add_hierarchy (oc,avsp) objectclass * oc; AV_Sequence *avsp; { struct oid_seq * oidseq; objectclass *ocp; for (oidseq = oc->oc_hierachy; oidseq != NULLOIDSEQ; oidseq = oidseq->oid_next) { ocp = oid2oc(oidseq->oid_oid); add_oc_avs (ocp,avsp); add_hierarchy (ocp,avsp); } } #ifdef notyet static in_hierarchy (a,b) AV_Sequence a, b; { struct oid_seq * oidseq; objectclass *oca, *ocb; if ((a == NULLAV) || (a->avseq_av.av_syntax != oc_sntx) || (a->avseq_av.av_struct == NULL)) return (FALSE); if ((b == NULLAV) || (b->avseq_av.av_syntax != oc_sntx) || (b->avseq_av.av_struct == NULL)) return (FALSE); oca = (objectclass *) a->avseq_av.av_struct; ocb = (objectclass *) b->avseq_av.av_struct; for (oidseq = ocb->oc_hierachy; oidseq != NULLOIDSEQ; oidseq = oidseq->oid_next) if (oid_cmp(oca->oc_ot.ot_oid,oidseq->oid_oid) == 0) return (TRUE); return (FALSE); } static oc_print_avs (ps,avs,format) /* need to use this somehow !!! */ PS ps; AV_Sequence avs; int format; { AV_Sequence newavs; char found; char printed = FALSE; if (avs == NULLAV) return; if (format != READOUT) DLOG (log_dsap,LLOG_EXCEPTIONS,("invalid call to oc_print")); for ( ; avs->avseq_next != NULLAV ; avs=avs->avseq_next) { found = FALSE; for (newavs = avs->avseq_next; newavs != NULLAV; newavs=newavs->avseq_next) if (in_hierarchy(avs,newavs) == TRUE) { found = TRUE; break; } if (found == FALSE) { if (printed == TRUE) ps_print (ps," & "); AttrV_print (ps,&avs->avseq_av,format); printed = TRUE; } } if (printed == TRUE) ps_print (ps," & "); AttrV_print (ps,&avs->avseq_av,format); } #endif objclass_cmp (a,b) objectclass *a, *b; { if (a == NULLOBJECTCLASS) return ( b ? -1 : 0 ); if (b == NULLOBJECTCLASS) return (1); return (oid_cmp(a->oc_ot.ot_oid,b->oc_ot.ot_oid)); } static objectclass * oc_cpy (oc) objectclass * oc; { return (oc); /* static table !!! */ } check_in_oc (oid,avs) OID oid; AV_Sequence avs; { objectclass * oc; for (; avs != NULLAV; avs = avs->avseq_next) { oc = (objectclass *) avs->avseq_av.av_struct; if (oc == NULLOBJECTCLASS) continue; if (oid_cmp(oid,oc->oc_ot.ot_oid) == 0) return (TRUE); } return (FALSE); } /* ARGSUSED */ static oc_free (oc) objectclass * oc; { ; /* static table !!! */ } static PE oc_enc (oc) objectclass *oc; { return (oid2prim(oc->oc_ot.ot_oid)); } static objectclass * oc_dec (pe) PE pe; { OID oid; objectclass *oc; if (! test_prim_pe (pe,PE_CLASS_UNIV,PE_PRIM_OID)) return NULLOBJECTCLASS; if ((oid = prim2oid (pe)) == NULLOID) return NULLOBJECTCLASS; if ((oc = oid2oc (oid)) != NULLOBJECTCLASS) return (oc); return (oc_add(oid)); } oc_print (ps,oc,format) PS ps; objectclass * oc; int format; { extern int oidformat; if ( format != READOUT) ps_printf (ps,"%s",oc2name (oc,OIDPART)); else ps_printf (ps,"%s",oc2name (oc,oidformat)); } objectclass_syntax () { oc_sntx = add_attribute_syntax ("objectclass", (IFP) oc_enc, (IFP) oc_dec, (IFP) str2oc, oc_print, (IFP) oc_cpy, objclass_cmp, oc_free, NULLCP, NULLIFP, FALSE ); oc_hier = (IFP) str2oc_hier; want_oc_hierarchy (); }