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