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

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

unix.superglobalmegacorp.com

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