|
|
1.1 ! root 1: /* oc.c - Object Class routines */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/oc.c,v 7.3 90/07/09 14:34:47 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/dsap/common/RCS/oc.c,v 7.3 90/07/09 14:34:47 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: oc.c,v $ ! 12: * Revision 7.3 90/07/09 14:34:47 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.2 90/03/15 11:17:41 mrose ! 16: * quipu-sync ! 17: * ! 18: * Revision 7.1 90/01/11 23:49:43 mrose ! 19: * lint ! 20: * ! 21: * Revision 7.0 89/11/23 21:42:31 mrose ! 22: * Release 6.0 ! 23: * ! 24: */ ! 25: ! 26: /* ! 27: * NOTICE ! 28: * ! 29: * Acquisition, use, and distribution of this module and related ! 30: * materials are subject to the restrictions of a license agreement. ! 31: * Consult the Preface in the User's Manual for the full terms of ! 32: * this agreement. ! 33: * ! 34: */ ! 35: ! 36: ! 37: /* LINTLIBRARY */ ! 38: ! 39: #include "quipu/util.h" ! 40: #include "quipu/entry.h" ! 41: #include "tailor.h" ! 42: ! 43: extern LLog * log_dsap; ! 44: extern short oc_sntx; ! 45: extern IFP oc_hier; ! 46: ! 47: objectclass * oc_add (oid) ! 48: OID oid; ! 49: { ! 50: oid_table * Current; ! 51: extern objectclass ocOIDTable[]; ! 52: extern int ocNumEntries; ! 53: ! 54: Current = &ocOIDTable[ocNumEntries].oc_ot; ! 55: if (oid == NULLOID) ! 56: Current->ot_oid = NULLOID; ! 57: else ! 58: Current->ot_oid = oid_cpy (oid); ! 59: (void) strcpy (Current->ot_name, oid2ode_aux(oid,0)); ! 60: (void) strcpy (Current->ot_stroid, sprintoid(oid)); ! 61: add_entry_aux (Current->ot_name,(caddr_t)&ocOIDTable[ocNumEntries],3,NULLCP); ! 62: ocOIDTable[ocNumEntries].oc_hierachy = NULLOIDSEQ; ! 63: ocOIDTable[ocNumEntries].oc_may = NULLTABLE_SEQ; ! 64: ocOIDTable[ocNumEntries].oc_must = NULLTABLE_SEQ; ! 65: return (&ocOIDTable[ocNumEntries++]); ! 66: } ! 67: ! 68: objectclass * str2oc (str) ! 69: char * str; ! 70: { ! 71: char * ptr; ! 72: char * get_oid (); ! 73: objectclass *oc; ! 74: ! 75: if ((oc = name2oc (str)) != NULLOBJECTCLASS) ! 76: return (oc); ! 77: ! 78: /* unknown object class -- need to add to table */ ! 79: if ((ptr = get_oid (str)) == NULLCP) { ! 80: parse_error ("Object class %s unknown",str); ! 81: return (NULLOBJECTCLASS); ! 82: } ! 83: ! 84: return (oc_add (str2oid(ptr))); ! 85: } ! 86: ! 87: static AV_Sequence new_oc_avs (oc) ! 88: objectclass * oc; ! 89: { ! 90: AV_Sequence avs; ! 91: ! 92: avs = avs_comp_alloc(); ! 93: avs->avseq_next = NULLAV; ! 94: avs->avseq_av.av_syntax = oc_sntx; ! 95: avs->avseq_av.av_struct = (caddr_t) oc; ! 96: return (avs); ! 97: } ! 98: ! 99: static AV_Sequence str2oc_hier (str) ! 100: char * str; ! 101: { ! 102: AV_Sequence avs = NULLAV; ! 103: objectclass * oc; ! 104: char * ptr, *save, val; ! 105: ! 106: str = SkipSpace (str); ! 107: ! 108: while ((ptr = index (str,'&')) != 0) { ! 109: save = ptr++; ! 110: save--; ! 111: if (! isspace (*save)) ! 112: save++; ! 113: val = *save; ! 114: *save = 0; ! 115: ! 116: if ((oc = str2oc (str)) == NULLOBJECTCLASS) ! 117: return (NULLAV); ! 118: if (avs == NULLAV) ! 119: avs = new_oc_avs (oc); ! 120: else ! 121: add_oc_avs (oc,&avs); ! 122: add_hierarchy (oc,&avs); ! 123: ! 124: *save = val; ! 125: str = SkipSpace(ptr); ! 126: } ! 127: ! 128: if ((oc = str2oc (str)) == NULLOBJECTCLASS) ! 129: return (NULLAV); ! 130: if (avs == NULLAV) ! 131: avs = new_oc_avs (oc); ! 132: else ! 133: add_oc_avs (oc,&avs); ! 134: add_hierarchy (oc,&avs); ! 135: ! 136: return (avs); ! 137: } ! 138: ! 139: add_oc_avs (oc,avsp) ! 140: objectclass * oc; ! 141: AV_Sequence *avsp; ! 142: { ! 143: AV_Sequence loop; ! 144: objectclass *ocp; ! 145: ! 146: /* see if we already have oc in heirarchy ... */ ! 147: ! 148: for (loop = *avsp; loop != NULLAV; loop = loop->avseq_next) { ! 149: ocp = (objectclass *)loop->avseq_av.av_struct; ! 150: if (oc == ocp) ! 151: return; ! 152: } ! 153: *avsp = avs_merge (*avsp,new_oc_avs(oc)); ! 154: } ! 155: ! 156: static add_hierarchy (oc,avsp) ! 157: objectclass * oc; ! 158: AV_Sequence *avsp; ! 159: { ! 160: struct oid_seq * oidseq; ! 161: objectclass *ocp; ! 162: ! 163: for (oidseq = oc->oc_hierachy; ! 164: oidseq != NULLOIDSEQ; oidseq = oidseq->oid_next) { ! 165: ocp = oid2oc(oidseq->oid_oid); ! 166: add_oc_avs (ocp,avsp); ! 167: add_hierarchy (ocp,avsp); ! 168: } ! 169: } ! 170: ! 171: ! 172: #ifdef notyet ! 173: static in_hierarchy (a,b) ! 174: AV_Sequence a, b; ! 175: { ! 176: struct oid_seq * oidseq; ! 177: objectclass *oca, *ocb; ! 178: ! 179: if ((a == NULLAV) || (a->avseq_av.av_syntax != oc_sntx) || (a->avseq_av.av_struct == NULL)) ! 180: return (FALSE); ! 181: ! 182: if ((b == NULLAV) || (b->avseq_av.av_syntax != oc_sntx) || (b->avseq_av.av_struct == NULL)) ! 183: return (FALSE); ! 184: ! 185: oca = (objectclass *) a->avseq_av.av_struct; ! 186: ocb = (objectclass *) b->avseq_av.av_struct; ! 187: ! 188: for (oidseq = ocb->oc_hierachy; ! 189: oidseq != NULLOIDSEQ; oidseq = oidseq->oid_next) ! 190: if (oid_cmp(oca->oc_ot.ot_oid,oidseq->oid_oid) == 0) ! 191: return (TRUE); ! 192: ! 193: return (FALSE); ! 194: } ! 195: ! 196: static oc_print_avs (ps,avs,format) /* need to use this somehow !!! */ ! 197: PS ps; ! 198: AV_Sequence avs; ! 199: int format; ! 200: { ! 201: AV_Sequence newavs; ! 202: char found; ! 203: char printed = FALSE; ! 204: ! 205: if (avs == NULLAV) ! 206: return; ! 207: ! 208: if (format != READOUT) ! 209: DLOG (log_dsap,LLOG_EXCEPTIONS,("invalid call to oc_print")); ! 210: ! 211: for ( ; avs->avseq_next != NULLAV ; avs=avs->avseq_next) { ! 212: found = FALSE; ! 213: for (newavs = avs->avseq_next; newavs != NULLAV; newavs=newavs->avseq_next) ! 214: if (in_hierarchy(avs,newavs) == TRUE) { ! 215: found = TRUE; ! 216: break; ! 217: } ! 218: ! 219: if (found == FALSE) { ! 220: if (printed == TRUE) ! 221: ps_print (ps," & "); ! 222: AttrV_print (ps,&avs->avseq_av,format); ! 223: printed = TRUE; ! 224: } ! 225: } ! 226: ! 227: if (printed == TRUE) ! 228: ps_print (ps," & "); ! 229: AttrV_print (ps,&avs->avseq_av,format); ! 230: } ! 231: #endif ! 232: ! 233: objclass_cmp (a,b) ! 234: objectclass *a, *b; ! 235: { ! 236: if (a == NULLOBJECTCLASS) ! 237: return ( b ? -1 : 0 ); ! 238: ! 239: if (b == NULLOBJECTCLASS) ! 240: return (1); ! 241: ! 242: return (oid_cmp(a->oc_ot.ot_oid,b->oc_ot.ot_oid)); ! 243: } ! 244: ! 245: static objectclass * oc_cpy (oc) ! 246: objectclass * oc; ! 247: { ! 248: return (oc); /* static table !!! */ ! 249: } ! 250: ! 251: check_in_oc (oid,avs) ! 252: OID oid; ! 253: AV_Sequence avs; ! 254: { ! 255: objectclass * oc; ! 256: ! 257: for (; avs != NULLAV; avs = avs->avseq_next) { ! 258: oc = (objectclass *) avs->avseq_av.av_struct; ! 259: if (oc == NULLOBJECTCLASS) ! 260: continue; ! 261: if (oid_cmp(oid,oc->oc_ot.ot_oid) == 0) ! 262: return (TRUE); ! 263: } ! 264: ! 265: return (FALSE); ! 266: } ! 267: ! 268: /* ARGSUSED */ ! 269: static oc_free (oc) ! 270: objectclass * oc; ! 271: { ! 272: ; /* static table !!! */ ! 273: } ! 274: ! 275: static PE oc_enc (oc) ! 276: objectclass *oc; ! 277: { ! 278: return (oid2prim(oc->oc_ot.ot_oid)); ! 279: } ! 280: ! 281: ! 282: static objectclass * oc_dec (pe) ! 283: PE pe; ! 284: { ! 285: OID oid; ! 286: objectclass *oc; ! 287: ! 288: if (! test_prim_pe (pe,PE_CLASS_UNIV,PE_PRIM_OID)) ! 289: return NULLOBJECTCLASS; ! 290: ! 291: if ((oid = prim2oid (pe)) == NULLOID) ! 292: return NULLOBJECTCLASS; ! 293: ! 294: if ((oc = oid2oc (oid)) != NULLOBJECTCLASS) ! 295: return (oc); ! 296: ! 297: return (oc_add(oid)); ! 298: } ! 299: ! 300: ! 301: ! 302: oc_print (ps,oc,format) ! 303: PS ps; ! 304: objectclass * oc; ! 305: int format; ! 306: { ! 307: extern int oidformat; ! 308: ! 309: if ( format != READOUT) ! 310: ps_printf (ps,"%s",oc2name (oc,OIDPART)); ! 311: else ! 312: ps_printf (ps,"%s",oc2name (oc,oidformat)); ! 313: } ! 314: ! 315: objectclass_syntax () ! 316: { ! 317: ! 318: oc_sntx = add_attribute_syntax ("objectclass", ! 319: (IFP) oc_enc, (IFP) oc_dec, ! 320: (IFP) str2oc, oc_print, ! 321: (IFP) oc_cpy, objclass_cmp, ! 322: oc_free, NULLCP, ! 323: NULLIFP, FALSE ); ! 324: ! 325: oc_hier = (IFP) str2oc_hier; ! 326: want_oc_hierarchy (); ! 327: ! 328: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.