Annotation of 43BSDReno/contrib/isode-beta/pepsy/dec.c.org, revision 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.