Annotation of 43BSDReno/contrib/isode-beta/pepsy/dec.c.org, revision 1.1.1.1

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) = 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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.