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