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