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