Annotation of 43BSDReno/contrib/isode-beta/pepsy/prnt.c, revision 1.1

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

unix.superglobalmegacorp.com

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