|
|
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.