|
|
1.1 root 1: /* dec.c */
2:
3: #ifndef lint
4: static char *rcsid = "$Header$";
5: #endif
6:
7: /*
8: * $Header$
9: *
10: *
11: * $Log$
12: */
13:
14: /*
15: * NOTICE
16: *
17: * Acquisition, use, and distribution of this module and related
18: * materials are subject to the restrictions of a license agreement.
19: * Consult the Preface in the User's Manual for the full terms of
20: * this agreement.
21: *
22: */
23:
24:
25: /*
26: * These routines are the driving routines for parsing encoding and printing
27: * data
28: */
29: #include <stdio.h>
30: #include "../h/psap.h"
31: #include "pep.h"
32: #include "pepdefs.h"
33:
34: #define PEPYPARM char **
35: #ifndef PEPYPARM
36: #define PEPYPARM char **
37: #endif
38: extern PEPYPARM NullParm;
39:
40:
41:
42: extern PE pr_seq(), pr_seqof(), pr_set(), pr_setof(), pr_type();
43: extern PE en_seq(), en_seqof(), en_set(), en_setof(), en_type();
44: extern PE pr_choice(), en_choice(), en_etype(), pr_etype(), pr_obj();
45: extern PE setpresent();
46:
47: extern tpe *next_tpe();
48: extern int _pverbose;
49:
50: #define NEXT_TPE(p) p = next_tpe(p)
51: #define CHKTAG(mod, p, pe) ismatch(p, mod, pe->pe_class, pe->pe_id)
52:
53: /* Have we got an optional object which we have allocated sapce for */
54: #define ALLOC_MEM(p, parm) (p->pe_type == SOBJECT \
55: && p[-1].pe_type == MALLOC)
56:
57: /*SUPPRESS 36*/ /* for Saber C */
58:
59: /*
60: * decode the specified type of the specified module into the given pe
61: */
62: dec_f(typ, mod, pe, explicit, len, buf, parm)
63: /*ARGSUSED*/
64: int typ; /* which type it is */
65: modtyp *mod; /* Module it is from */
66: PE pe;
67: int explicit;
68: int *len;
69: char **buf;
70: PEPYPARM parm;
71: {
72: tpe *p;
73:
74: if (typ < 0 || typ >= mod->md_nentries)
75: ferrd(1, "dec_f:Illegal typ %d\n", typ);
76:
77: p = mod->md_dtab[typ];
78: if (p->pe_type != PE_START)
79: ferr(1, "dec_f: missing PE_START\n");
80: p++;
81: if ((pe = pr_obj(explicit, pe, parm, p, mod)) == NULLPE)
82: return (NOTOK);
83:
84: return (OK);
85: }
86:
87: /*
88: * Parse an object. The top level of an object does not have any offset field
89: * which makes it different to pr_type routine which must assume that it
90: * has an offset.
91: */
92: PE
93: pr_obj(expl, pe, parm, p, mod)
94: int expl; /* do we look at the tag */
95: PE pe;
96: PEPYPARM parm;
97: tpe *p;
98: modtyp *mod; /* Module it is from */
99: {
100: int cnt = 0;
101:
102:
103: if (_pverbose > 6) {
104: printf(dfp, "1st Decoding the type %d \n",p->pe_type);
105: }
106: while (p->pe_type != PE_END) {
107:
108: if (ISDTYPE(p) && expl && CHKTAG(mod, p, pe) == 0) {
109: if (DEFAULT(p))
110: ferr(1, "pr_obj:Default not implemented\n");
111: else if (OPTIONAL(p)) {
112: if (ALLOC_MEM(p, parm))
113: fix_mem(parm, p);
114: goto next;
115: } else {
116: dmp_tpe("pr_obj:missing mandatory parameter", p, mod);
117: return (NULLPE);
118: }
119: }
120:
121: if (_pverbose > 6) {
122: printf("2nd Decoding the type %d \n",p->pe_type);
123: }
124:
125: switch (p->pe_type) {
126: case PE_END:
127: case PE_START:
128: return (NULLPE);
129:
130: case UCODE:
131: if ((*mod->md_ducode)(pe, parm, p, mod) != OK)
132: return (NULLPE);
133: break;
134:
135: case ETAG:
136: switch (p->pe_ucode) {
137: default:
138: p++;
139: if (pr_obj(1, pe->pe_cons, parm, p, mod) == NULLPE)
140: return (NULLPE);
141: }
142: break;
143:
144: case MALLOC:
145: if ((*(parm) = (char *) calloc(1, p->pe_tag)) == NULL)
146: return NULLPE;
147: break;
148:
149: case SEQ_START:
150: if ((pe = pr_seq(pe, parm, p, mod)) == NULLPE)
151: return (NULLPE);
152: break;
153:
154: case SEQOF_START:
155: if ((pe = pr_seqof(pe, parm, p, mod)) == NULLPE)
156: return (NULLPE);
157: break;
158:
159: case SET_START:
160: if ((pe = pr_set(pe, parm, p, mod)) == NULLPE)
161: return (NULLPE);
162: break;
163:
164: case SETOF_START:
165: if ((pe = pr_setof(pe, parm, p, mod)) == NULLPE)
166: return (NULLPE);
167: break;
168:
169: case IMP_OBJ:
170: p++;
171: if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ) {
172: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 0, NULL,
173: (char **) 0, parm);
174: } else {
175: if (p->pe_type == SOBJECT) {
176: if ((pe = pr_obj(0, pe, parm,
177: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
178: return (NULLPE);
179: } else
180: if ((pe = pr_obj(0, pe, *parm + p->pe_ucode,
181: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
182: return (NULLPE);
183: }
184: break;
185:
186: case SOBJECT:
187: case OBJECT:
188: if ((pe = pr_obj(expl, pe, parm, mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
189: return (NULLPE);
190: break;
191:
192: case CHOICE_START:
193: if ((pe = pr_choice(pe, parm, p, mod)) == NULLPE)
194: return (NULLPE);
195: break;
196:
197: case SEXTOBJ:
198: case EXTOBJ:
199: if (p[1].pe_type != EXTMOD) {
200: dmp_tpe("pr_type: missing EXTMOD", p, mod);
201: ferr(1, "pr_type:internal error\n");
202: }
203: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
204: (char **) 0, parm);
205: break;
206:
207: default:
208: if ((pe = pr_type(expl, pe, parm, p, mod)) == NULLPE)
209: return (NULLPE);
210: break;
211: }
212: if (ISDTYPE(p) && cnt > 0)
213: ferr(1, "pr_obj:compound type found\n");
214: if (ISDTYPE(p) && pe != NULLPE)
215: return (pe);
216: next:
217: NEXT_TPE(p);
218: }
219:
220: return (pe);
221: }
222: /*
223: * Parse a single type.
224: * If a basic type parse it, if a compound type call the appropriate
225: * parsing routine
226: */
227: PE
228: pr_type(expl, pe, parm, p, mod)
229: int expl; /* do we look at the tag */
230: PE pe;
231: PEPYPARM parm;
232: tpe *p;
233: modtyp *mod; /* Module it is from */
234: {
235: int cnt = 0;
236: OID oid;
237:
238:
239: if (_pverbose > 6) {
240: printf("pr_type:type %d \n",p->pe_type);
241: }
242: while (p->pe_type != PE_END) {
243: /*
244: print_pe (pe, 1);
245: */
246:
247: if (ISDTYPE(p) && expl && CHKTAG(mod, p, pe) == 0) {
248: if (DEFAULT(p)) {
249: setdval(p, p + 1, parm, mod);
250: goto next;
251: } else if (OPTIONAL(p)) {
252: if (ALLOC_MEM(p, parm))
253: fix_mem(parm, p);
254: goto next;
255: } else {
256: dmp_tpe("pr_type:missing mandatory parameter", p, mod);
257: return (NULLPE);
258: }
259: }
260:
261: if (_pverbose > 6) {
262: printf("2nd prtype: type %d \n",p->pe_type);
263: }
264:
265: switch (p->pe_type) {
266: case PE_END:
267: case PE_START:
268: return (NULLPE);
269:
270: case UCODE:
271: if ((*mod->md_ducode)(pe, parm, p, mod) != OK)
272: return (NULLPE);
273: break;
274:
275: case ETAG:
276: switch (p->pe_ucode) {
277: default:
278: p++;
279: if (pr_etype(pe->pe_cons, parm, p, mod) == NULLPE)
280: return (NULLPE);
281: }
282: break;
283:
284: case MALLOC:
285: if ((*(parm) = (char *) calloc(1, p->pe_tag)) == NULL)
286: return NULLPE;
287: break;
288:
289: case SEQ_START:
290: if ((pe = pr_seq(pe, parm, p, mod)) == NULLPE)
291: return (NULLPE);
292: break;
293:
294: case SEQOF_START:
295: if ((pe = pr_seqof(pe, parm, p, mod)) == NULLPE)
296: return (NULLPE);
297: break;
298:
299: case SET_START:
300: if ((pe = pr_set(pe, parm, p, mod)) == NULLPE)
301: return (NULLPE);
302: break;
303:
304: case SETOF_START:
305: if ((pe = pr_setof(pe, parm, p, mod)) == NULLPE)
306: return (NULLPE);
307: break;
308:
309: case IMP_OBJ:
310: p++;
311: if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ) {
312: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 0, NULL,
313: (char **) 0, parm);
314: } else {
315: if (p->pe_type == SOBJECT) {
316: if ((pe = pr_obj(0, pe, parm,
317: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
318: return (NULLPE);
319: } else
320: if ((pe = pr_obj(0, pe, *parm + p->pe_ucode,
321: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
322: return (NULLPE);
323: }
324: break;
325:
326: case SOBJECT:
327: case OBJECT:
328: if ((pe = pr_obj(expl, pe, parm, mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
329: return (NULLPE);
330: break;
331:
332: case CHOICE_START:
333: if ((pe = pr_choice(pe, parm, p, mod)) == NULLPE)
334: return (NULLPE);
335: break;
336:
337: case SEXTOBJ:
338: case EXTOBJ:
339: if (p[1].pe_type != EXTMOD) {
340: dmp_tpe("pr_type: missing EXTMOD", p, mod);
341: ferr(1, "pr_type:internal error\n");
342: }
343: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
344: (char **) 0, parm);
345: break;
346:
347: case INTEGER:
348: if (pe != NULLPE) {
349: if (_pverbose > 6) {
350: printf("integer value is %d\n",prim2num(pe));
351: }
352: if (((*(int *)(*parm + p->pe_ucode)) = prim2num(pe))
353: == NOTOK && pe->pe_errno != PE_ERR_NONE) {
354: printf("pr_type:bad integer %s",
355: pe_error(pe->pe_errno));
356: return (NULLPE);
357: }
358: }
359: break;
360:
361: case BOOLEAN:
362: if (pe != NULLPE) {
363: if (_pverbose > 6) {
364: printf("boolean value is %d\n",prim2flag(pe));
365: }
366: if (((* (char *)(*parm + p->pe_ucode)) = prim2flag(pe))==NOTOK && pe->pe_errno != PE_ERR_NONE) {
367: printf("pr_type:bad integer %s",
368: pe_error(pe->pe_errno));
369: return (NULLPE);
370: }
371: }
372: break;
373:
374: case T_NULL:
375: break;
376:
377: case SCONS_ANY:
378: case SANY:
379: if (pe != NULLPE) {
380: ((* (PE *) parm) = pe)->pe_refcnt++;
381: if (pe->pe_errno != PE_ERR_NONE) {
382: printf("pr_type:bad integer %s",
383: pe_error(pe->pe_errno));
384: return (NULLPE);
385: }
386: }
387: break;
388:
389:
390: case CONS_ANY:
391: case ANY:
392: if (pe != NULLPE) {
393: (* (PE *) (*parm + p->pe_ucode) = pe) ->pe_refcnt++;
394: if (pe->pe_errno != PE_ERR_NONE) {
395: printf("pr_type:bad integer %s",
396: pe_error(pe->pe_errno));
397: return (NULLPE);
398: }
399: }
400: break;
401:
402: case SOCTETSTRING:
403: if (pe != NULLPE) {
404: if ((*((struct qbuf **) parm) = prim2qb(pe)) ==
405: (struct qbuf *) NULL && pe->pe_errno != PE_ERR_NONE) {
406: printf("pr_type:bad octet string %s",
407: pe_error(pe->pe_errno));
408: return (NULLPE);
409: }
410: }
411: break;
412:
413: case OCTETSTRING:
414: if (pe != NULLPE) {
415: if ((*((struct qbuf **) (*parm + p->pe_ucode))
416: = prim2qb(pe)) == (struct qbuf *) NULL
417: && pe->pe_errno != PE_ERR_NONE) {
418: printf("pr_type:bad octet string %s",
419: pe_error(pe->pe_errno));
420: return (NULLPE);
421: }
422: }
423: break;
424:
425: case SBITSTRING:
426: if (pe != NULLPE) {
427: /*
428: if ((*((PE *)(*parm + p->pe_ucode))=prim2bit(pe))== NULLPE)
429: I think this is a bug in ISODE's routines prim2bit
430: does the wrong thing
431: */
432: if ((*((PE *)parm)=prim2bit(pe_cpy(pe))) == NULLPE) {
433: printf("pr_type:out of memory");
434: return (NULLPE);
435: }
436: }
437: break;
438:
439: case BITSTRING:
440: if (pe != NULLPE) {
441: /*
442: if ((*((PE *)(*parm + p->pe_ucode))=prim2bit(pe))== NULLPE)
443: I think this is a bug in ISODE's routines prim2bit
444: does the wrong thing
445: */
446: if ((*((PE *)(*parm + p->pe_ucode))=prim2bit(pe_cpy(pe))) == NULLPE) {
447: printf("pr_type:out of memory");
448: return (NULLPE);
449: }
450: }
451: break;
452:
453: case SOBJID:
454: /* This is messy because ISODE's library routine uses a static. Don't
455: * know why they do
456: */
457: if ((oid = prim2oid(pe)) == NULLOID
458: || (*(OID *)parm = oid_cpy(oid)) == NULLOID) {
459: printf("pr_type:Object Identifier: out of memory");
460: if (oid && oid->oid_elements) {
461: free(oid->oid_elements);
462: oid->oid_elements = NULL;
463: }
464: return (NULLPE);
465: }
466: if (oid && oid->oid_elements) {
467: free(oid->oid_elements);
468: oid->oid_elements = NULL;
469: }
470: break;
471:
472: case OBJID:
473: if ((oid = prim2oid(pe)) == NULLOID
474: || (*(OID *)(*parm + p->pe_ucode) = oid_cpy(oid)) == NULLOID) {
475: printf("pr_type:Object Identifier: out of memory");
476: if (oid && oid->oid_elements) {
477: free(oid->oid_elements);
478: oid->oid_elements = NULL;
479: }
480: return (NULLPE);
481: }
482: if (oid && oid->oid_elements) {
483: free(oid->oid_elements);
484: oid->oid_elements = NULL;
485: }
486: break;
487:
488: default:
489: dmp_tpe("pr_type: type not implemented", p, mod);
490: ferrd(1, "pr_type: %d not implemented\n", p->pe_type);
491: break;
492: }
493: if (ISDTYPE(p) && cnt > 0)
494: ferr(1, "pr_type:compound type found\n");
495: if (ISDTYPE(p) && pe != NULLPE)
496: return (pe);
497: next:
498: NEXT_TPE(p);
499: }
500:
501: return (pe);
502: }
503:
504: /*
505: * Parse a sequence, calling appropriate routines to parse each sub type
506: */
507: PE
508: pr_seq(head, parm, p, mod)
509: PE head;
510: PEPYPARM parm;
511: tpe *p;
512: modtyp *mod; /* Module it is from */
513: {
514: PE pe;
515: int *popt = NULL; /* Pointer to optional field */
516: int optcnt = 0; /* Number of optionals bits so far */
517:
518: if (p->pe_type != SEQ_START)
519: ferr(1, "pr_seq: missing SEQ_START\n");
520: p++;
521:
522: if (p->pe_type == DFLT_B)
523: p++;
524:
525: pe = first_member(head);
526: while (p->pe_type != PE_END) {
527: if (_pverbose > 6) {
528: printf("pr_seq:type %d\n",p->pe_type);
529: }
530:
531:
532: if (ISDTYPE(p) && OPTIONAL(p)) {
533: switch (p->pe_type) {
534: case INTEGER:
535: case BOOLEAN:
536: case T_NULL:
537: if (pe == NULLPE || CHKTAG(mod, p, pe) == 0) {
538: optcnt++;
539: goto next;
540: }
541: SETBIT(*popt, optcnt++);
542: break;
543:
544: #if 0
545: case ANY:
546: case CONS_ANY:
547: case SANY:
548: case SCONS_ANY:
549: dmp_tpe("pr_seq:optional/default ANY", p, mod);
550: ferr(1, "unable to distinguish tags");
551: #endif
552:
553: default:
554: if (pe == NULLPE || CHKTAG(mod, p, pe) == 0) {
555: if (ALLOC_MEM(p, parm))
556: fix_mem(parm, p);
557: goto next;
558: }
559: break;
560: }
561: } else if (ISDTYPE(p) && (pe == NULLPE || CHKTAG(mod, p, pe) == 0)) {
562: if (DEFAULT(p)) {
563: setdval(p, p + 1, parm, mod);
564: goto next;
565: } else {
566: dmp_tpe("pr_seq:missing mandatory parameter", p, mod);
567: return (NULLPE);
568: }
569: }
570:
571: switch (p->pe_type) {
572: case OPTL:
573: popt = (int *) (*parm + p->pe_ucode);
574: break;
575:
576: case UCODE:
577: if ((*mod->md_ducode)(pe, parm, p, mod) != OK)
578: return (NULLPE);
579: break;
580:
581: case ETAG:
582: if ((pe = pr_type(1, pe, parm, p, mod)) == NULLPE)
583: return NULLPE;
584: break;
585:
586: case MALLOC:
587: if ((*parm = (char *) calloc(1, p->pe_tag)) == NULL)
588: return NULLPE;
589: break;
590:
591: case SEQ_START:
592: if ((pe = pr_seq(pe, (char **)(*parm + p->pe_ucode), p, mod))
593: == NULLPE)
594: return (NULLPE);
595: break;
596:
597: case SEQOF_START:
598: if ((pe = pr_seqof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
599: return (NULLPE);
600: break;
601:
602: case SET_START:
603: if ((pe = pr_set(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
604: return (NULLPE);
605: break;
606:
607: case SETOF_START:
608: if ((pe = pr_setof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
609: return (NULLPE);
610: break;
611:
612: case IMP_OBJ:
613: p++;
614: if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ) {
615: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 0, NULL,
616: (char **) 0, *parm + p->pe_ucode);
617: } else {
618: if (p->pe_type == SOBJECT) {
619: if ((pe = pr_obj(0, pe, parm,
620: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
621: return (NULLPE);
622: } else
623: if ((pe = pr_obj(0, pe, *parm + p->pe_ucode,
624: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
625: return (NULLPE);
626: }
627: break;
628:
629: case SOBJECT:
630: if ((pe = pr_obj(1, pe, parm,
631: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
632: return (NULLPE);
633: break;
634:
635: case OBJECT:
636: if ((pe = pr_obj(1, pe, *parm + p->pe_ucode,
637: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
638: return (NULLPE);
639: break;
640:
641: case CHOICE_START:
642: if ((pe = pr_choice(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
643: return (NULLPE);
644: break;
645:
646: case SEXTOBJ:
647: if (p[1].pe_type != EXTMOD) {
648: dmp_tpe("pr_seq: missing EXTMOD", p, mod);
649: ferr(1, "pr_seq:internal error\n");
650: }
651: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
652: (char **) 0, parm);
653: break;
654:
655: case EXTOBJ:
656: if (p[1].pe_type != EXTMOD) {
657: dmp_tpe("pr_seq: missing EXTMOD", p, mod);
658: ferr(1, "pr_seq:internal error\n");
659: }
660: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
661: (char **) 0, *parm + p->pe_ucode);
662: break;
663:
664: default:
665: if ((pe = pr_type(1, pe, parm, p, mod)) == NULLPE)
666: return (NULLPE);
667: break;
668: /*
669: ferrd(1, "pr_seq: unknown type %d\n", p->pe_type);
670: */
671: }
672:
673: if (ISDTYPE(p) && pe != NULLPE)
674: pe = next_member(head, pe);
675: next:
676: NEXT_TPE(p);
677: }
678:
679: return (head);
680:
681: }
682:
683:
684: /*
685: * Parse a set, calling appropriate routines to parse each sub type
686: */
687: PE
688: pr_set(head, parm, p, mod)
689: PE head;
690: PEPYPARM parm;
691: tpe *p;
692: modtyp *mod; /* Module it is from */
693: {
694: PE pe;
695: int *popt = NULL; /* Pointer to optional field */
696: int optcnt = 0; /* Number of optionals bits so far */
697:
698: if (p->pe_type != SET_START)
699: ferr(1, "pr_seq: missing SET_START\n");
700: p++;
701:
702: if (p->pe_type == DFLT_B)
703: p++;
704:
705: while (p->pe_type != PE_END) {
706:
707: if (_pverbose > 6) {
708: printf("dec_set with the type %d\n",p->pe_type);
709: }
710:
711: if (ISDTYPE(p) && OPTIONAL(p)) {
712: switch (p->pe_type) {
713: case INTEGER:
714: case BOOLEAN:
715: case T_NULL:
716: if ((pe = setpresent(head, p, mod)) == NULLPE) {
717: optcnt++;
718: goto next;
719: }
720: SETBIT(*popt, optcnt++);
721: break;
722:
723: #if 0
724: case ANY:
725: case CONS_ANY:
726: case SANY:
727: case SCONS_ANY:
728: dmp_tpe("pr_set:optional/default ANY\n", p, mod);
729: ferr(1, "unable to distinguish tags");
730: #endif
731:
732: default:
733: if ((pe = setpresent(head, p, mod)) == NULLPE) {
734: if (ALLOC_MEM(p, parm))
735: fix_mem(parm, p);
736: goto next;
737: }
738: break;
739: }
740: } else if (ISDTYPE(p) && (pe = setpresent(head, p, mod)) == NULLPE) {
741: if (DEFAULT(p)) {
742: setdval(p, p + 1, parm, mod);
743: goto next;
744: } else {
745: dmp_tpe("pr_set:missing mandatory parameter", p, mod);
746: return (NULLPE);
747: }
748: }
749:
750: switch (p->pe_type) {
751: case OPTL:
752: popt = (int *) (*parm + p->pe_ucode);
753: break;
754:
755: case UCODE:
756: if ((*mod->md_ducode)(pe, parm, p, mod) != OK)
757: return (NULLPE);
758: break;
759:
760: case ETAG:
761: if ((pe = pr_type(1, pe, parm, p, mod)) == NULLPE)
762: return NULLPE;
763: break;
764:
765: case MALLOC:
766: if ((*parm = (char *) calloc(1, p->pe_tag)) == NULL)
767: return NULLPE;
768: break;
769:
770: case SEQ_START:
771: if ((pe = pr_seq(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
772: return (NULLPE);
773: break;
774:
775: case SEQOF_START:
776: if ((pe = pr_seqof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
777: return (NULLPE);
778: break;
779:
780: case SET_START:
781: if ((pe = pr_set(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
782: return (NULLPE);
783: break;
784:
785: case SETOF_START:
786: if ((pe = pr_setof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
787: return (NULLPE);
788: break;
789:
790: case IMP_OBJ:
791: p++;
792: if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ) {
793: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 0, NULL,
794: (char **) 0, *parm + p->pe_ucode);
795: } else {
796: if (p->pe_type == SOBJECT) {
797: if ((pe = pr_obj(0, pe, parm,
798: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
799: return (NULLPE);
800: } else
801: if ((pe = pr_obj(0, pe, *parm + p->pe_ucode,
802: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
803: return (NULLPE);
804: }
805: break;
806:
807: case SOBJECT:
808: if ((pe = pr_obj(1, pe, parm, mod->md_dtab[p->pe_tag] + 1,
809: mod)) == NULLPE)
810: return (NULLPE);
811: break;
812:
813: case OBJECT:
814: if ((pe = pr_obj(1, pe, *parm + p->pe_ucode,
815: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
816: return (NULLPE);
817: break;
818:
819: case CHOICE_START:
820: if ((pe = pr_choice(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
821: return (NULLPE);
822: break;
823:
824: case SEXTOBJ:
825: if (p[1].pe_type != EXTMOD) {
826: dmp_tpe("pr_set: missing EXTMOD", p, mod);
827: ferr(1, "pr_set:internal error\n");
828: }
829: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
830: (char **) 0, parm);
831: break;
832:
833: case EXTOBJ:
834: if (p[1].pe_type != EXTMOD) {
835: dmp_tpe("pr_set: missing EXTMOD", p, mod);
836: ferr(1, "pr_set:internal error\n");
837: }
838: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
839: (char **) 0, *parm + p->pe_ucode);
840: break;
841:
842: default:
843: if ((pe = pr_type(1, pe, parm, p, mod)) == NULLPE)
844: return (NULLPE);
845: break;
846: /*
847: ferrd(1, "pr_set: unknown type %d\n", p->pe_type);
848: */
849: }
850:
851: next:
852: NEXT_TPE(p);
853: }
854:
855: return (head);
856:
857: }
858:
859:
860: /*
861: * Parse a sequence of calling appropriate routines to parse each sub type
862: */
863: PE
864: pr_seqof(head, parm, p, mod)
865: PE head;
866: PEPYPARM parm;
867: tpe *p;
868: modtyp *mod; /* Module it is from */
869: {
870: PE pe;
871: tpe *start; /* first entry in list */
872: int dflt = 0;
873:
874: if (p->pe_type != SEQOF_START) {
875: dmp_tpe("pr_seqof:missing SEQOF_START", p, mod);
876: ferr(1, "pr_seqof: missing SEQOF_START\n");
877: }
878: p++;
879:
880: if (p->pe_type == DFLT_B)
881: p++;
882:
883: start = p;
884:
885: pe = first_member(head);
886: while (pe != NULLPE) {
887: while (p->pe_type != PE_END) {
888:
889: if (_pverbose > 6) {
890: printf("dec_seqof with the type %d\n",p->pe_type);
891: }
892:
893: if (ISDTYPE(p) && CHKTAG(mod, p, pe) == 0) {
894: if (DEFAULT(p)) {
895: setdval(p, p + 1, parm, mod);
896: goto next;
897: } else if (OPTIONAL(p)) {
898: if (ALLOC_MEM(p, parm))
899: fix_mem(parm, p);
900: goto next;
901: } else {
902: dmp_tpe( "pr_seqof:missing mandatory parameter", p,
903: mod);
904: return (NULLPE);
905: }
906: }
907:
908: switch (p->pe_type) {
909: case UCODE:
910: if ((*mod->md_ducode)(pe, parm, p, mod) != OK)
911: return (NULLPE);
912: break;
913:
914: case ETAG:
915: if ((pe = pr_type(1, pe, parm, p, mod)) == NULLPE)
916: return NULLPE;
917: break;
918:
919: case MALLOC:
920: if ((*parm = (char *) calloc(1, p->pe_tag)) == NULL)
921: return NULLPE;
922: break;
923:
924: case SCTRL:
925: parm = (char **) ((char *)*parm + p->pe_ucode);
926: break;
927:
928: case SEQ_START:
929: if ((pe = pr_seq(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
930: return (NULLPE);
931: break;
932:
933: case SEQOF_START:
934: if ((pe = pr_seqof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
935: return (NULLPE);
936: break;
937:
938: case SET_START:
939: if ((pe = pr_set(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
940: return (NULLPE);
941: break;
942:
943: case SETOF_START:
944: if ((pe = pr_setof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
945: return (NULLPE);
946: break;
947:
948: case SOBJECT:
949: if ((pe = pr_obj(1, pe, parm,
950: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
951: return (NULLPE);
952: break;
953:
954: case OBJECT:
955: if ((pe = pr_obj(1, pe, *parm + p->pe_ucode,
956: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
957: return (NULLPE);
958: break;
959:
960: case CHOICE_START:
961: if ((pe = pr_choice(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
962: return (NULLPE);
963: break;
964:
965: case SEXTOBJ:
966: if (p[1].pe_type != EXTMOD) {
967: dmp_tpe("pr_seqof: missing EXTMOD", p, mod);
968: ferr(1, "pr_seqof:internal error\n");
969: }
970: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
971: (char **) 0, parm);
972: break;
973:
974: case EXTOBJ:
975: if (p[1].pe_type != EXTMOD) {
976: dmp_tpe("pr_seqof: missing EXTMOD", p, mod);
977: ferr(1, "pr_seqof:internal error\n");
978: }
979: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
980: (char **) 0, *parm + p->pe_ucode);
981: break;
982:
983: default:
984: if ((pe = pr_type(1, pe, parm, p, mod)) == NULLPE)
985: return (NULLPE);
986: break;
987: }
988:
989: if (ISDTYPE(p) && dflt == 0)
990: pe = next_member(head, pe);
991: next:
992: NEXT_TPE(p);
993: }
994: parm = (char **)(*parm + p->pe_ucode);
995: p = start;
996: }
997:
998: return (head);
999:
1000: }
1001:
1002: /*
1003: * Parse a setof, calling appropriate routines to parse each sub type
1004: */
1005: PE
1006: pr_setof(head, parm, p, mod)
1007: PE head;
1008: PEPYPARM parm;
1009: tpe *p;
1010: modtyp *mod; /* Module it is from */
1011: {
1012: PE pe;
1013: int dflt;
1014: tpe *start;
1015:
1016: if (p->pe_type != SETOF_START)
1017: ferr(1, "pr_setof: missing SETOF_START\n");
1018: p++;
1019:
1020: if (p->pe_type == DFLT_B)
1021: p++;
1022:
1023: start = p;
1024: pe = first_member(head);
1025:
1026: for (pe = first_member(head); pe; pe = next_member(head, pe)) {
1027: while (p->pe_type != PE_END) {
1028: if (_pverbose > 6) {
1029: printf("dec_seqof with the type %d\n", p->pe_type);
1030: }
1031:
1032: if (pe == NULLPE || CHKTAG(mod, p, pe) == 0) {
1033: if (DEFAULT(p)) {
1034: setdval(p, p + 1, parm, mod);
1035: goto next;
1036: } else {
1037: dmp_tpe( "pr_setof:missing mandatory parameter",
1038: p, mod);
1039: return (NULLPE);
1040: }
1041: }
1042: else
1043: dflt = 0;
1044:
1045: switch (p->pe_type) {
1046: case UCODE:
1047: if ((*mod->md_ducode)(pe, parm, p, mod) != OK)
1048: return (NULLPE);
1049: break;
1050:
1051: case ETAG:
1052: if ((pe = pr_type(1, pe->pe_cons, parm, p, mod)) == NULLPE)
1053: return NULLPE;
1054: break;
1055:
1056: case MALLOC:
1057: if ((*parm = (char *) calloc(1, p->pe_tag)) == NULL)
1058: return NULLPE;
1059: break;
1060:
1061: case SCTRL:
1062: parm = (char **) (*parm + p->pe_ucode);
1063: break;
1064:
1065: case SEQ_START:
1066: if ((pe = pr_seq(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
1067: return (NULLPE);
1068: break;
1069:
1070: case SEQOF_START:
1071: if ((pe = pr_seqof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
1072: return (NULLPE);
1073: break;
1074:
1075: case SET_START:
1076: if ((pe = pr_set(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
1077: return (NULLPE);
1078: break;
1079:
1080: case SETOF_START:
1081: if ((pe = pr_setof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
1082: return (NULLPE);
1083: break;
1084:
1085: case SOBJECT:
1086: if ((pe = pr_obj(1, pe, parm,
1087: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
1088: return (NULLPE);
1089: break;
1090:
1091: case OBJECT:
1092: if ((pe = pr_obj(1, pe, *parm + p->pe_ucode,
1093: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
1094: return (NULLPE);
1095: break;
1096:
1097: case CHOICE_START:
1098: if ((pe = pr_choice(pe, *parm + p->pe_ucode,
1099: p, mod)) == NULLPE)
1100: return (NULLPE);
1101: break;
1102:
1103: case SEXTOBJ:
1104: if (p[1].pe_type != EXTMOD) {
1105: dmp_tpe("pr_setof: missing EXTMOD", p, mod);
1106: ferr(1, "pr_setof:internal error\n");
1107: }
1108: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1,
1109: NULL, (char **) 0, parm);
1110: break;
1111:
1112: case EXTOBJ:
1113: if (p[1].pe_type != EXTMOD) {
1114: dmp_tpe("pr_setof: missing EXTMOD", p, mod);
1115: ferr(1, "pr_setof:internal error\n");
1116: }
1117: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1,
1118: NULL, (char **) 0, *parm + p->pe_ucode);
1119: break;
1120:
1121: default:
1122: if ((pe = pr_type(1, pe, parm, p, mod)) == NULLPE)
1123: return (NULLPE);
1124: break;
1125: /*
1126: ferrd(1, "pr_setof: unknown type %d\n", p->pe_type);
1127: */
1128: }
1129:
1130: #if 0
1131: /* fixup - we only delete in this function */
1132: if (ISDTYPE(p) && dflt == 0)
1133: set_del(head, pe->pe_class, pe->pe_id);
1134: #endif
1135: next:
1136: NEXT_TPE(p);
1137: }
1138: parm = (char **)(*parm + p->pe_ucode);
1139: p = start;
1140: }
1141:
1142: return (head);
1143:
1144: }
1145:
1146: /*
1147: * parse a choice field. This means find which choice is taken
1148: */
1149: PE
1150: pr_choice(head, parm, p, mod)
1151: PE head;
1152: PEPYPARM parm;
1153: tpe *p;
1154: modtyp *mod; /* Module it is from */
1155: {
1156: int *poffset;
1157: int cnt;
1158: PE pe;
1159:
1160: if (p->pe_type != CHOICE_START) {
1161: dmp_tpe("pr_choice:missing CHOICE_START", p, mod);
1162: ferrd(1, "pr_choice:illegal table entry %d\n", p->pe_type);
1163: }
1164:
1165: p++;
1166:
1167: if (p->pe_type == DFLT_B)
1168: p++;
1169:
1170: if (p->pe_type == MALLOC) {
1171: if ((*parm = (char *) calloc(1, p->pe_tag)) == NULL)
1172: return NULLPE;
1173: p++;
1174: }
1175: if (p->pe_type == SCTRL) {
1176: if ((poffset = (int *) (*parm + p->pe_ucode)) == NULL)
1177: return NULLPE;
1178: p++;
1179: }
1180:
1181: for (cnt = 1; p->pe_type != PE_END; NEXT_TPE(p), cnt++) {
1182: if (ISDTYPE(p) && ismatch(p, mod, head->pe_class, head->pe_id)) {
1183: pe = pr_etype(head, parm, p, mod);
1184: *poffset = cnt;
1185: return (pe);
1186: }
1187: }
1188: dmp_tpe("pr_choice: no choice taken", p, mod);
1189: return (NULLPE);
1190: }
1191:
1192: /*
1193: * Calculate the next tpe entry in the sequence. Count a sequence as one element
1194: */
1195: tpe *
1196: next_tpe(p)
1197: tpe *p;
1198: {
1199: int level;
1200:
1201:
1202:
1203: level = 0;
1204: if (p->pe_type == PE_END)
1205: ferr(1, "next_tpe:PE_END");
1206: do {
1207: again:
1208: switch (p->pe_type) {
1209: case SEQ_START:
1210: case SEQOF_START:
1211: case SET_START:
1212: case SETOF_START:
1213: case CHOICE_START:
1214: level++;
1215: break;
1216:
1217: case UCODE:
1218: case MALLOC:
1219: case SCTRL:
1220: case CH_ACT:
1221: case INTEGER:
1222: case BOOLEAN:
1223: case SANY:
1224: case SCONS_ANY:
1225: case ANY:
1226: case CONS_ANY:
1227: case T_NULL:
1228: case OBJECT:
1229: case SOBJECT:
1230: case BITSTRING:
1231: case SBITSTRING:
1232: case OCTETSTRING:
1233: case SOCTETSTRING:
1234: case OBJID:
1235: case SOBJID:
1236: case OPTL:
1237: case EXTMOD:
1238: case DFLT_B:
1239: break;
1240:
1241: case IMP_OBJ:
1242: case ETAG:
1243: case EXTOBJ:
1244: case SEXTOBJ:
1245: case DFLT_F:
1246: p++;
1247: goto again;
1248:
1249: case PE_END:
1250: level--;
1251: break;
1252:
1253: default:
1254: ferrd(1, "next_tpe: unknown type %d\n", p->pe_type);
1255: }
1256: p++;
1257: } while (level > 0 || p->pe_type == DFLT_B);
1258:
1259: return (p);
1260: }
1261:
1262: /*
1263: * check that pe is non null and that the tag and class match and return
1264: * zero if the don't
1265: */
1266: chktag(mod, p, pe)
1267: modtyp *mod; /* Module it is from */
1268: tpe *p;
1269: PE pe;
1270: {
1271: int cl, tag;
1272:
1273: if (pe == NULLPE)
1274: return (0);
1275: #if 0
1276: if (p->pe_type == OBJECT && skip_next_tag) /* first time we find skip */
1277: return (1);
1278: if (skip_next_tag) { /* 2nd time reset skip */
1279: skip_next_tag = 0;
1280: return (1);
1281: }
1282: #endif
1283: if (!findcltag(p, mod, &cl, &tag))
1284: return (0);
1285: if (pe->pe_id != tag || pe->pe_class != cl)
1286: return (0);
1287:
1288: return (1);
1289: }
1290:
1291: #if 0
1292: /*
1293: test if we need to check the tag associated with the tpe entry p
1294: */
1295: legal_tag(p)
1296: tpe *p;
1297: {
1298: int ret;
1299:
1300: switch (p->pe_type) {
1301:
1302: case MALLOC:
1303: case SCTRL:
1304: case CH_ACT:
1305: case ANY:
1306: case OBJECT:
1307: case CHOICE_START:
1308: case CONS_ANY:
1309: /* case ETAG: don't think we should have this here */
1310: ret = 0;
1311: break;
1312:
1313: default:
1314: #if 0
1315: if (skip_next_tag) {
1316: skip_next_tag = 0;
1317: ret = 0;
1318: }
1319: else
1320: #endif
1321: ret = 1;
1322: break;
1323: }
1324: return ret;
1325: }
1326: #endif
1327:
1328: /*
1329: * Parse a single type for explicit tag
1330: * If a basic type parse it, if a compound type call the appropriate
1331: * parsing routine
1332: */
1333: PE
1334: pr_etype(pe, parm, p, mod)
1335: PE pe;
1336: PEPYPARM parm;
1337: tpe *p;
1338: modtyp *mod; /* Module it is from */
1339: {
1340: switch (p->pe_type) {
1341: case PE_END:
1342: case PE_START:
1343: return (NULLPE);
1344:
1345: case UCODE:
1346: if ((*mod->md_ducode)(pe, parm, p, mod) != OK)
1347: return (NULLPE);
1348: break;
1349:
1350: case ETAG:
1351: switch (p->pe_ucode) {
1352:
1353: default:
1354: p++;
1355: if (pr_etype(pe->pe_cons, parm, p, mod) == NULLPE)
1356: return (NULLPE);
1357: }
1358: break;
1359:
1360: case MALLOC:
1361: if ((*(parm) = (char *) calloc(1, p->pe_tag)) == NULL)
1362: return NULLPE;
1363: break;
1364:
1365: case SEQ_START:
1366: if ((pe = pr_seq(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
1367: return (NULLPE);
1368: break;
1369:
1370: case SEQOF_START:
1371: if ((pe = pr_seqof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
1372: return (NULLPE);
1373: break;
1374:
1375: case SET_START:
1376: if ((pe = pr_set(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
1377: return (NULLPE);
1378: break;
1379:
1380: case SETOF_START:
1381: if ((pe = pr_setof(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
1382: return (NULLPE);
1383: break;
1384:
1385: case IMP_OBJ:
1386: p++;
1387: if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ) {
1388: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 0, NULL,
1389: (char **) 0, *parm + p->pe_ucode);
1390: } else {
1391: if (p->pe_type == SOBJECT) {
1392: if ((pe = pr_obj(0, pe, parm,
1393: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
1394: return (NULLPE);
1395: } else
1396: if ((pe = pr_obj(0, pe, *parm + p->pe_ucode,
1397: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
1398: return (NULLPE);
1399: }
1400: break;
1401:
1402: case SOBJECT:
1403: if ((pe = pr_obj(1, pe, parm,
1404: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
1405: return (NULLPE);
1406: break;
1407:
1408: case OBJECT:
1409: if ((pe = pr_obj(1, pe, *parm + p->pe_ucode,
1410: mod->md_dtab[p->pe_tag] + 1, mod)) == NULLPE)
1411: return (NULLPE);
1412: break;
1413:
1414: case CHOICE_START:
1415: if ((pe = pr_choice(pe, *parm + p->pe_ucode, p, mod)) == NULLPE)
1416: return (NULLPE);
1417: break;
1418:
1419: case SEXTOBJ:
1420: if (p[1].pe_type != EXTMOD) {
1421: dmp_tpe("pr_etype: missing EXTMOD", p, mod);
1422: ferr(1, "pr_etype:internal error\n");
1423: }
1424: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
1425: (char **) 0, parm);
1426: break;
1427:
1428: case EXTOBJ:
1429: if (p[1].pe_type != EXTMOD) {
1430: dmp_tpe("pr_etype: missing EXTMOD", p, mod);
1431: ferr(1, "pr_etype:internal error\n");
1432: }
1433: dec_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
1434: (char **) 0, *parm + p->pe_ucode);
1435: break;
1436:
1437: case INTEGER:
1438: if (pe != NULLPE) {
1439: if (_pverbose > 6) {
1440: printf("integer value is %d\n",prim2num(pe));
1441: }
1442: if (((*(int *)(*parm + p->pe_ucode)) = prim2num(pe))== NOTOK && pe->pe_errno != PE_ERR_NONE) {
1443: printf("pr_etype:bad integer %s",
1444: pe_error(pe->pe_errno));
1445: return (NULLPE);
1446: }
1447: }
1448: break;
1449:
1450: case BOOLEAN:
1451: if (pe != NULLPE) {
1452: if (_pverbose > 6) {
1453: printf("boolean value is %d\n",prim2flag(pe));
1454: }
1455: if (((* (char *)(*parm + p->pe_ucode)) = prim2flag(pe))==NOTOK && pe->pe_errno != PE_ERR_NONE) {
1456: printf("pr_etype:bad integer %s",
1457: pe_error(pe->pe_errno));
1458: return (NULLPE);
1459: }
1460: }
1461: break;
1462:
1463: case T_NULL:
1464: break;
1465:
1466: case ANY:
1467: case CONS_ANY:
1468: if (pe != NULLPE) {
1469: (* (PE *) (*parm + p->pe_ucode) = pe) ->pe_refcnt++;
1470: if (pe->pe_errno != PE_ERR_NONE) {
1471: printf("pr_etype:bad integer %s",
1472: pe_error(pe->pe_errno));
1473: return (NULLPE);
1474: }
1475: }
1476: break;
1477:
1478: case SANY:
1479: case SCONS_ANY:
1480: /* This could require changes when I find out what the CONS_ANY type
1481: * is really for
1482: */
1483: if (pe != NULLPE) {
1484: ((PE) (*parm ) = pe) ->pe_refcnt++;
1485: if (pe->pe_errno != PE_ERR_NONE) {
1486: printf("pr_etype:bad integer %s",
1487: pe_error(pe->pe_errno));
1488: return (NULLPE);
1489: }
1490: }
1491: break;
1492:
1493: case SOCTETSTRING:
1494: if (pe != NULLPE) {
1495: if ((*((struct qbuf **) parm)
1496: = prim2qb(pe)) == (struct qbuf *) NULL
1497: && pe->pe_errno != PE_ERR_NONE) {
1498: printf("pr_etype:bad octet string %s",
1499: pe_error(pe->pe_errno));
1500: return (NULLPE);
1501: }
1502: }
1503: break;
1504:
1505: case OCTETSTRING:
1506: if (pe != NULLPE) {
1507: if ((*((struct qbuf **) (*parm + p->pe_ucode))
1508: = prim2qb(pe)) == (struct qbuf *) NULL
1509: && pe->pe_errno != PE_ERR_NONE) {
1510: printf("pr_etype:bad octet string %s",
1511: pe_error(pe->pe_errno));
1512: return (NULLPE);
1513: }
1514: }
1515: break;
1516:
1517: case SBITSTRING:
1518: if (pe != NULLPE) {
1519: if (((*(PE *) parm) = pe_cpy(pe)) == NULLPE) {
1520: printf("pr_etype:out of memory");
1521: return (NULLPE);
1522: }
1523: }
1524: break;
1525:
1526: case BITSTRING:
1527: if (pe != NULLPE) {
1528: if ((*((PE *) (*parm + p->pe_ucode))= pe_cpy(pe)) == NULLPE) {
1529: printf("pr_etype:out of memory");
1530: return (NULLPE);
1531: }
1532: }
1533: break;
1534:
1535: case SOBJID:
1536: if ((*(OID *)parm = oid_cpy(prim2oid(pe))) == NULLOID) {
1537: printf("pr_etype:Object Identifier: out of memory");
1538: return (NULLPE);
1539: }
1540: break;
1541:
1542: case OBJID:
1543: if ((*(OID *)(*parm + p->pe_ucode) = oid_cpy(prim2oid(pe))) == NULLOID) {
1544: printf("en_etype:Object Identifier: out of memory");
1545: return (NULLPE);
1546: }
1547: break;
1548:
1549: default:
1550: ferrd(1, "pr_etype: %d not implemented\n", p->pe_type);
1551: break;
1552: }
1553:
1554: return (pe);
1555: }
1556:
1557: /*
1558: * determine what the class and tag must be of the given object
1559: */
1560: findcltag(p, mod, pcl, ptag)
1561: tpe *p;
1562: modtyp *mod; /* Module it is from */
1563: int *pcl, *ptag;
1564: {
1565: if (!ISDTYPE(p))
1566: return (0);
1567: if (p->pe_type != OBJECT) {
1568: *pcl = CLASS(p);
1569: *ptag = TAG(p);
1570: return (1);
1571: }
1572: p = mod->md_dtab[p->pe_tag] + 1;
1573: while (p->pe_type != PE_END) {
1574: if (ISDTYPE(p))
1575: return (findcltag(p, mod, pcl, ptag));
1576: }
1577: dmp_tpe("findcltag:warning:object with no data in it", p, mod);
1578: return (0);
1579: }
1580:
1581: /*
1582: * Is there a match at for this tag and class pair. Return 1 if yes 0 if no
1583: * We will search through contained objects and through choices
1584: */
1585: ismatch(p, mod, cl, tag)
1586: tpe *p;
1587: modtyp *mod; /* Module it is from */
1588: unsigned int cl, tag;
1589: {
1590: while (!ISDTYPE(p))
1591: p++;
1592:
1593: switch (p->pe_type) {
1594: case SOBJECT:
1595: case OBJECT:
1596: /* Needs to be changed for optional and default */
1597: return (ismatch(p = mod->md_dtab[p->pe_tag] + 1, mod, cl, tag));
1598:
1599: case SEXTOBJ:
1600: case EXTOBJ:
1601: if (p[1].pe_type != EXTMOD) {
1602: dmp_tpe("ismatch: missing EXTMOD", p, mod);
1603: ferr(1, "ismatch:internal error\n");
1604: }
1605: return(ismatch(((modtyp *)p[1].pe_ucode)->md_dtab[p->pe_tag] + 1,
1606: (modtyp *)p[1].pe_ucode, cl, tag));
1607:
1608: case CHOICE_START:
1609: for (p++; p->pe_type != PE_END; p = NEXT_TPE(p)) {
1610: if (!ISDTYPE(p))
1611: continue;
1612: if (ismatch(p, mod, cl, tag))
1613: return (1);
1614: }
1615: return (0);
1616:
1617: case SANY:
1618: case SCONS_ANY:
1619: return (1);
1620:
1621: case ANY:
1622: case CONS_ANY:
1623: if (TAG(p) == -1)
1624: return (1);
1625: /* else fall through - not sure if this is needed */
1626:
1627: default:
1628: return (tag == TAG(p) && cl == CLASS(p));
1629: }
1630: }
1631:
1632: /*
1633: * determine if the given field is present in the data
1634: * This is simple if the field is a simple type with an obvious tag but
1635: * in the case of an object or a CHOICE type the tag is not obvious. If the
1636: * object is a CHOICE there are more than one possible tag that could match
1637: * and in this case we must try to match each one of them.
1638: */
1639: PE
1640: setpresent(head, p, mod)
1641: PE head;
1642: tpe *p;
1643: modtyp *mod;
1644: {
1645: PE pe;
1646:
1647: if (!ISDTYPE(p))
1648: return (NULLPE);
1649: switch (p->pe_type) {
1650: case OBJECT:
1651: case SOBJECT:
1652: /* Needs to be changed for optional and default */
1653: return (setpresent(head, p = mod->md_dtab[p->pe_tag] + 1, mod));
1654:
1655: case CHOICE_START:
1656: for (p++; p->pe_type != PE_END; p = NEXT_TPE(p)) {
1657: if (!ISDTYPE(p))
1658: continue;
1659: if ((pe = setpresent(head, p, mod)))
1660: return (pe);
1661: }
1662: return (NULLPE);
1663:
1664: default:
1665: return (set_find(head, CLASS(p), TAG(p)));
1666: }
1667: }
1668:
1669: /*
1670: * set the default value to that value in the structure
1671: */
1672: setdval(typ, dflt, parm, mod)
1673: tpe *typ, *dflt;
1674: char **parm;
1675: modtyp *mod;
1676: {
1677:
1678: again:
1679: switch (typ->pe_type) {
1680: case MALLOC:
1681: if ((*(parm) = (char *) calloc(1, typ->pe_tag)) == NULL)
1682: ferrd(1, "setdval:calloc failed on %d\n", typ->pe_tag);
1683: typ++;
1684: goto again;
1685:
1686: case INTEGER:
1687: *(int *)(*parm + typ->pe_ucode) = IVAL(dflt);
1688: break;
1689:
1690: case BOOLEAN:
1691: *(char *)(*parm + typ->pe_ucode) = IVAL(dflt);
1692: break;
1693:
1694: case T_NULL:
1695: /* Only one value */
1696: break;
1697:
1698: case SBITSTRING:
1699: *(PE *)parm = strb2bitstr(PVAL(dflt), IVAL(dflt), 0, 0);
1700: break;
1701:
1702: case BITSTRING:
1703: *(PE *)(*parm + typ->pe_ucode) =
1704: strb2bitstr(PVAL(dflt), IVAL(dflt), 0, 0);
1705: break;
1706:
1707: case SOCTETSTRING:
1708: *(struct qbuf **)parm = str2qb(PVAL(dflt), IVAL(dflt), 1);
1709: break;
1710:
1711: case OCTETSTRING:
1712: *(struct qbuf **)(*parm + typ->pe_ucode) =
1713: str2qb(PVAL(dflt), IVAL(dflt), 1);
1714: break;
1715:
1716: case OBJECT:
1717: setdval(mod->md_dtab[typ->pe_tag] + 1, dflt,
1718: (char **) (*parm + typ->pe_ucode), mod);
1719: break;
1720:
1721: case SOBJECT:
1722: setdval(mod->md_dtab[typ->pe_tag] + 1, dflt, parm, mod);
1723: break;
1724:
1725: case IMP_OBJ:
1726: typ++;
1727:
1728: case SCONS_ANY:
1729: case ANY:
1730: case CONS_ANY:
1731: case SANY:
1732: case SEXTOBJ:
1733: case EXTOBJ:
1734: case OBJID:
1735: case SOBJID:
1736: case SEQ_START:
1737: case SET_START:
1738: case -1: /* Just use the pepy method of null pointers */
1739: /* This is the posy/pepy hack way of doing things at the moment */
1740: *(char **)(*parm + typ->pe_ucode) = NULL;
1741: break;
1742:
1743: default:
1744: /* dmp_tpe("setdval: type not implemented", typ, mod); - need mod*/
1745: ferrd(1, "setdval: %d not implemented\n", typ->pe_type);
1746: break;
1747: }
1748:
1749: }
1750: /*
1751: * fix up the allocation of memory. We have allocated memory for an optional
1752: * object that is not present. ISODE routines get upset if this is present
1753: * because it then believes the object is present and tries to process it ...
1754: */
1755: fix_mem(parm, p)
1756: char **parm;
1757: tpe *p;
1758: {
1759: if (p->pe_type != SOBJECT || p[-1].pe_type != MALLOC
1760: || p[1].pe_type != PE_END)
1761: ferr(1, "fix_mem:inconsistency\n");
1762: if (*parm)
1763: free(*parm);
1764: *parm = NULL;
1765: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.