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

1.1     ! root        1: /* util.c */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/pepsy/RCS/util.c,v 7.1 90/07/09 14:53:23 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/pepsy/RCS/util.c,v 7.1 90/07/09 14:53:23 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       util.c,v $
        !            12:  * Revision 7.1  90/07/09  14:53:23  mrose
        !            13:  * sync
        !            14:  * 
        !            15:  * Revision 7.0  90/07/01  19:54:33  mrose
        !            16:  * *** empty log message ***
        !            17:  * 
        !            18:  */
        !            19: 
        !            20: /*
        !            21:  *                               NOTICE
        !            22:  *
        !            23:  *    Acquisition, use, and distribution of this module and related
        !            24:  *    materials are subject to the restrictions of a license agreement.
        !            25:  *    Consult the Preface in the User's Manual for the full terms of
        !            26:  *    this agreement.
        !            27:  *
        !            28:  */
        !            29: 
        !            30: 
        !            31: #include       <stdio.h>
        !            32: #include       "psap.h"
        !            33: #include       "pepsy.h"
        !            34: #include        <varargs.h>
        !            35: #include       "tailor.h"
        !            36: 
        !            37: #ifndef        PEPYPARM
        !            38: #define PEPYPARM       char *
        !            39: #endif
        !            40: 
        !            41: static char *pr_petype ();
        !            42: 
        !            43: #ifdef lint
        !            44: int    pepsylose (module, p, pe, str)
        !            45: modtyp *module;
        !            46: tpe    *p;
        !            47: char   *str;
        !            48: PE     pe;
        !            49: {
        !            50:        return pepsylose (type, module, pe, str);
        !            51: }
        !            52: 
        !            53: #else
        !            54: int    pepsylose (va_alist)
        !            55: va_dcl
        !            56: {
        !            57:        va_list ap;
        !            58:        int     type;
        !            59:        modtyp  *module;
        !            60:        tpe     *p;
        !            61:        char    *cp;
        !            62:        PE      pe;
        !            63:        char    buffer[BUFSIZ];
        !            64: 
        !            65:        va_start (ap);
        !            66: 
        !            67:        module = va_arg (ap, modtyp *);
        !            68:        p = va_arg (ap, tpe *);
        !            69:        pe = va_arg (ap, PE);
        !            70: 
        !            71:        _asprintf (buffer, NULLCP, ap);
        !            72:        (void) sprintf (PY_pepy, "%s: module %s",
        !            73:                        buffer, module ? module -> md_name : "<none>");
        !            74:        if (p) {
        !            75:            cp = PY_pepy + strlen (PY_pepy);
        !            76:            (void) sprintf (cp, " %s/class=%s/id=%d",
        !            77:                            pr_petype (p -> pe_type),
        !            78:                            pe_classlist[p -> pe_flags & FL_CLASS],
        !            79:                            p -> pe_tag);
        !            80:        }
        !            81:        if (pe) {
        !            82:            cp = PY_pepy + strlen (PY_pepy);
        !            83:            (void) sprintf (cp, " got %s/%d", pe_classlist[pe -> pe_class],
        !            84:                            pe -> pe_id);
        !            85:        }
        !            86: 
        !            87:        SLOG (psap_log, LLOG_EXCEPTIONS, NULLCP, ("%s", PY_pepy));
        !            88: 
        !            89:        va_end (ap);
        !            90:        return NOTOK;
        !            91: }
        !            92: #endif
        !            93: 
        !            94: /*
        !            95:  * Useful little routines
        !            96:  */
        !            97: /*
        !            98:  * print out the message and if the arguement is greater than 0
        !            99:  * terminate
        !           100:  */
        !           101: ferr(n, mesg)
        !           102: char   *mesg;
        !           103: {
        !           104:     (void) printf(mesg);
        !           105:     if (n > 0)
        !           106:        exit(n);
        !           107: }
        !           108: /*
        !           109:  * print out the message and number and if the arguement is greater
        !           110:  * than 0 terminate
        !           111:  */
        !           112: ferrd(n, mesg, d)
        !           113: char   *mesg;
        !           114: int     d;
        !           115: {
        !           116:     (void) printf(mesg, d);
        !           117:     if (n > 0)
        !           118:        exit(n);
        !           119: }
        !           120: 
        !           121: /*
        !           122:  * 0 = Encoding table, 1 = Decoding table, 2 = Printing table
        !           123:  */
        !           124: #define TYP_ENC                0
        !           125: #define TYP_DEC                1
        !           126: #define TYP_PRINT      2
        !           127: #define TYP_LAST       2
        !           128: 
        !           129: dmp_tpe(s, p, mod)
        !           130: char   *s;
        !           131: modtyp *mod;                   /* Module it is from */
        !           132: tpe    *p;
        !           133: {
        !           134:     int     typ, i, j;
        !           135:     tpe   **par, **prev;
        !           136:     char   *name;
        !           137: 
        !           138:     (void) printf("%s: (%s)", s, mod->md_name);
        !           139:     /*
        !           140:      * Calculate what table it is in - we assume they are in order of
        !           141:      * increasing address
        !           142:      */
        !           143: 
        !           144:     par = NULL;
        !           145:     for (typ = 0; typ <= TYP_LAST; typ++) {
        !           146:        switch (typ) {
        !           147:        case TYP_ENC:
        !           148:            if (mod->md_etab != NULL && mod->md_etab[0] < p) {
        !           149:                par = mod->md_etab;
        !           150:                name = "Encoding:";
        !           151:            }
        !           152:            break;
        !           153: 
        !           154:        case TYP_DEC:
        !           155:            if (mod->md_dtab != NULL && mod->md_dtab[0] < p) {
        !           156:                par = mod->md_dtab;
        !           157:                name = "Decoding:";
        !           158:            }
        !           159:            break;
        !           160: 
        !           161:        case TYP_PRINT:
        !           162:            if (mod->md_ptab != NULL && mod->md_ptab[0] < (ptpe *) p) {
        !           163:                (ptpe **) par = mod->md_ptab;
        !           164:                name = "Printing:";
        !           165:            }
        !           166:            break;
        !           167: 
        !           168:        default:
        !           169:            (void) pepsylose (mod, p, NULLPE, "dmp_tpe:typ = %d internal error\n",
        !           170:                typ);
        !           171:            return;
        !           172:        }
        !           173:     }
        !           174:     if (par == NULL) {
        !           175:        (void) printf("can't find entry 0x%x\n", p);
        !           176:        return;
        !           177:     }
        !           178:     prev = par;
        !           179:     for (i = mod->md_nentries; i > 0; i--) {
        !           180:        if (*par > p)
        !           181:            break;
        !           182:        par++;
        !           183:     }
        !           184:     if (par == prev)
        !           185:        (void) pepsylose (mod, p, NULLPE,
        !           186:            "dmp_tpe:par == prev == 0x%x internal error\n", (int) par);
        !           187:     par--;
        !           188:     j = p - *par;
        !           189: 
        !           190:     (void) printf("%s type %d + %d ", name, par - prev, j);
        !           191:     pr_entry(p);
        !           192: }
        !           193: #define NENTRY(x)      ((sizeof (x)/sizeof (x[0])))
        !           194: /*
        !           195:  * Print out a tpe entry
        !           196:  */
        !           197: static char    *ntypes[] = { "PE_START", "PE_END", "illegal 1", "illegal 2",
        !           198:     "XOBJECT", "illegal 4", "illegal 5", "UCODE", "MALLOC", "SCTRL", "CH_ACT",},
        !           199: 
        !           200:        *otypes[] = { "ANY", "INTEGER", "BOOLEAN", "OBJECT",
        !           201:     "BITSTRING", "OCTETSTRING", "SET_START", "SEQ_START", "SEQOF_START",
        !           202:     "SETOF_START", "CHOICE_START", "UNKNOWN", "T_NULL", "T_OID",
        !           203:     "ETAG", "IMP_OBJ",};
        !           204: 
        !           205: static char *pr_petype (type)
        !           206: int    type;
        !           207: {
        !           208:     static char nbuf[30];
        !           209: 
        !           210:     if (type >= PE_START && type < NENTRY(ntypes) - 1)
        !           211:        return ntypes[type + 1];
        !           212:     else if (type >= TYPE_DATA && type < NENTRY(otypes) + TYPE_DATA)
        !           213:        return otypes[type - TYPE_DATA];
        !           214:     (void) sprintf (nbuf, "%d", type);
        !           215:     return nbuf;
        !           216: }
        !           217: 
        !           218: pr_entry(p)
        !           219: tpe    *p;
        !           220: {
        !           221:     printf ("%s, ", pr_petype (p -> pe_type));
        !           222:     (void) printf("%d, %d, %d}\n", p->pe_ucode, p->pe_tag, p->pe_flags);
        !           223: }
        !           224: 
        !           225: p_pr_entry(p)
        !           226: ptpe    *p;
        !           227: {
        !           228:     if (p->pe_type >= PE_START && p->pe_type < NENTRY(ntypes) - 1)
        !           229:         (void) printf("{%s, ", ntypes[p->pe_type + 1]);
        !           230:     else if (p->pe_type >= TYPE_DATA && p->pe_type < NENTRY(otypes) + TYPE_DATA)
        !           231:         (void) printf("{%s, ", otypes[p->pe_type - TYPE_DATA]);
        !           232:     else
        !           233:         (void) printf("{%d, ", p->pe_type);
        !           234: 
        !           235:     (void) printf("%d, %d, %d}\n", p->pe_ucode, p->pe_tag, p->pe_flags);
        !           236: }
        !           237: 
        !           238: 
        !           239: #if 0
        !           240: pr_pe(pe)
        !           241: PE      pe;
        !           242: {
        !           243:     print_pe(pe, 1);
        !           244: }
        !           245: #endif
        !           246: /*
        !           247:  * null function for what evr purposes
        !           248:  */
        !           249: f_null()
        !           250: {
        !           251: }
        !           252: 
        !           253: /*
        !           254:  * compare a given number of bits pointed to by the two character
        !           255:  * pointers return 0 if they are the same non zero otherwise
        !           256:  */
        !           257: bitscmp(p1, p2, len)
        !           258: register char *p1, *p2;
        !           259: int     len;
        !           260: {
        !           261:     register int i;
        !           262:     register unsigned int mask;
        !           263: 
        !           264:     if (len >= 8 && bcmp(p1, p2, len / 8))
        !           265:        return (1);
        !           266: 
        !           267:     if (len % 8 == 0)
        !           268:        return (0);
        !           269:     /* Check those last few bits */
        !           270:     i = len / 8;
        !           271:     mask = (0xff00 >> len % 8) & 0xff;
        !           272:     if ((p1[i] & mask) != (p2[i] & mask))
        !           273:        return (1);
        !           274: 
        !           275:     return (0);
        !           276: }
        !           277: 
        !           278: #define MIN(a, b)      (a < b ? a : b)
        !           279: /*
        !           280:  * compare an octet string and a qb and return 0 if they are the same
        !           281:  * and non zero otherwise
        !           282:  */
        !           283: ostrcmp(p, len, qb)
        !           284: register char *p;
        !           285: register int len;
        !           286: register struct qbuf *qb;
        !           287: {
        !           288:     register struct qbuf *qp;
        !           289: 
        !           290:     if (len < 0 || qb == NULL || p == NULL)
        !           291:        return (1);
        !           292:     qp = qb;
        !           293:     do {
        !           294:        if (qp->qb_data != NULL) {
        !           295:            if (qp->qb_len < 0)
        !           296:                ferrd(1, "ostrcmp:qb_len %d < 0", qp->qb_len);
        !           297:            if (qp->qb_len > len)
        !           298:                return (1);
        !           299:            if (bcmp(qp->qb_data, p, qp->qb_len))
        !           300:                return (1);
        !           301:            if ((len -= qp->qb_len) == 0)
        !           302:                return (0);
        !           303:            p += qp->qb_len;
        !           304:        }
        !           305:        qp = qp->qb_forw;
        !           306:     } while (qp != qb);
        !           307: 
        !           308:     return (len);
        !           309: }
        !           310: 
        !           311: /*
        !           312:  * Is data present for the optional item? 1 for yes 0 for no
        !           313:  */
        !           314: hasdata(parm, p, mod, popt, optcnt)
        !           315: PEPYPARM parm;
        !           316: tpe    *p;
        !           317: modtyp *mod;                   /* Module it is from */
        !           318: int    *popt, optcnt;
        !           319: {
        !           320:     switch (p->pe_type) {
        !           321:     case INTEGER:
        !           322:     case REALTYPE:
        !           323:     case BOOLEAN:
        !           324:     case T_NULL:
        !           325:        if (DEFAULT(p)) {
        !           326:            /* Default's don't have bit map */
        !           327:            if (p[1].pe_type == DFLT_B && same(p, p + 1, parm, mod)
        !           328:            || p[-1].pe_type == DFLT_F && same(p, p - 1, parm, mod))
        !           329:                goto next;
        !           330:            break;
        !           331:        }
        !           332:        if (!TESTBIT(*popt, optcnt++))
        !           333:            goto next;          /* Missing so skip */
        !           334:        break;
        !           335: 
        !           336:     case ETAG:
        !           337:        if (!hasdata(parm, p + 1, mod, popt, optcnt))
        !           338:            goto next;
        !           339:        break;
        !           340: 
        !           341:     case IMP_OBJ:
        !           342:        if (p[1].pe_type == SOBJECT && parm == NULL
        !           343:            || *((char **) (parm + p[1].pe_ucode)) == NULL)
        !           344:            goto next;
        !           345:        break;
        !           346: 
        !           347:     default:
        !           348:        if (*((char **) (parm + p->pe_ucode)) == NULL)
        !           349:            goto next;
        !           350:        break;
        !           351:     }
        !           352:     return (1);
        !           353: 
        !           354: next:
        !           355:     return (0);
        !           356: }
        !           357: 
        !           358: /*
        !           359:  * determine if the default value is the same as the value in the
        !           360:  * structure and if so return greater than zero (meaning don't encode this
        !           361:  * item). On error return NOTOK
        !           362:  */
        !           363: same(typ, dflt, parm, mod)
        !           364: tpe    *typ, *dflt;
        !           365: char   *parm;
        !           366: modtyp *mod;                   /* Module it is from */
        !           367: {
        !           368:     int     val;
        !           369:     char   *p1;
        !           370:     PE      pe;
        !           371:     struct qbuf *qb;
        !           372: 
        !           373:     switch (typ->pe_type) {
        !           374:     case INTEGER:
        !           375:        val = IVAL(mod, dflt) == *(int *) (parm + typ->pe_ucode);
        !           376:        break;
        !           377: 
        !           378: #ifdef PEPSY_REALS
        !           379:     case REALTYPE:
        !           380:        val = RVAL(mod, dflt) == *(double *) (parm + typ->pe_ucode);
        !           381:        break;
        !           382: #endif
        !           383: 
        !           384:     case BOOLEAN:
        !           385:        val = IVAL(mod, dflt) == *(char *) (parm + typ->pe_ucode);
        !           386:        break;
        !           387: 
        !           388:     case T_NULL:
        !           389:        val = 1;                /* Only one value */
        !           390:        break;
        !           391: 
        !           392:     case SBITSTRING:
        !           393:        if ((pe = (PE) parm) == NULL) {
        !           394:            val = 1;
        !           395:            break;
        !           396:        }
        !           397:        goto bstring;
        !           398: 
        !           399:     case BITSTRING:
        !           400:        if ((pe = *(PE *) (parm + typ->pe_ucode)) == NULL) {
        !           401:            val = 1;
        !           402:            break;
        !           403:        }
        !           404: bstring:
        !           405:        if ((p1 = bitstr2strb(pe, &val)) == NULL) {
        !           406:            (void) pepsylose (mod, typ, pe, "same:bad bitstring\n");
        !           407:            return (NOTOK);
        !           408:            /* Should really abort encoding here but how can we comunicate this
        !           409:             * to the routine that calls us?
        !           410:             */
        !           411:        }
        !           412:        if (val != IVAL(mod, dflt) || bitscmp(PVAL(mod, dflt), p1, val))
        !           413:            val = 0;
        !           414:        else
        !           415:            val = 1;
        !           416:        free(p1);
        !           417:        break;
        !           418: 
        !           419:     case SOCTETSTRING:
        !           420:        if ((qb = (struct qbuf *) parm) == NULL) {
        !           421:            val = 1;
        !           422:            break;
        !           423:        }
        !           424:        goto ostring;
        !           425: 
        !           426:     case OCTETSTRING:
        !           427:        if ((qb = *(struct qbuf **) (parm + typ->pe_ucode)) == NULL) {
        !           428:            val = 1;
        !           429:            break;
        !           430:        }
        !           431: ostring:
        !           432:        if (ostrcmp(PVAL(mod, dflt), IVAL(mod, dflt), qb))
        !           433:            val = 0;
        !           434:        else
        !           435:            val = 1;
        !           436:        break;
        !           437: 
        !           438:     case OBJECT:
        !           439:        if (*(char **) (parm + typ->pe_ucode) == NULL) {
        !           440:            val = 1;            /* to conform with pepy's way of
        !           441:                                 * doing default */
        !           442:            break;
        !           443:        }
        !           444:        val = same(mod->md_etab[typ->pe_tag] + 1, dflt,
        !           445:                   *(char **) (parm + typ->pe_ucode), mod);
        !           446:        break;
        !           447: 
        !           448:     case SOBJECT:
        !           449:        if ((char *) parm == NULL) {
        !           450:            val = 1;            /* to conform with pepy's way of
        !           451:                                 * doing default */
        !           452:            break;
        !           453:        }
        !           454:        val = same(mod->md_etab[typ->pe_tag] + 1, dflt, parm, mod);
        !           455:        break;
        !           456: 
        !           457:     case IMP_OBJ:
        !           458:        typ++;                  /* fall through */
        !           459: 
        !           460:     case ANY:
        !           461:     case SANY:
        !           462:     case SEXTOBJ:
        !           463:     case EXTOBJ:
        !           464:     case OBJID:
        !           465:     case SOBJID:
        !           466:     case SEQ_START:
        !           467:     case SET_START:
        !           468:     case -1:                   /* Just use the pepy method of null
        !           469:                                 * pointers */
        !           470:        /*
        !           471:         * This is the posy/pepy hack way of doing things at the
        !           472:         * moment
        !           473:         */
        !           474:        val = *(char **) (parm + typ->pe_ucode) == NULL;
        !           475:        break;
        !           476: 
        !           477:     default:
        !           478:        (void) pepsylose (mod, typ, NULLPE, "same: %d not implemented\n",
        !           479:            typ->pe_type);
        !           480:        return (NOTOK);
        !           481:     }
        !           482: 
        !           483:     return (val);
        !           484: }
        !           485: 
        !           486: /*
        !           487:  * Calculate the next tpe entry in the sequence. Count a sequence as
        !           488:  * one element
        !           489:  */
        !           490: tpe    *
        !           491: next_tpe(p)
        !           492: tpe    *p;
        !           493: {
        !           494:     int     level;
        !           495: 
        !           496: 
        !           497: 
        !           498:     level = 0;
        !           499:     if (p->pe_type == PE_END) {
        !           500:        (void) pepsylose (NULLMODTYP, p, NULLPE,
        !           501:            "next_tpe:internal error: unexpected PE_END found");
        !           502:        return (p);
        !           503:     }
        !           504:     do {
        !           505: again:
        !           506:        switch (p->pe_type) {
        !           507:        case SEQ_START:
        !           508:        case SEQOF_START:
        !           509:        case SET_START:
        !           510:        case SETOF_START:
        !           511:        case CHOICE_START:
        !           512:            level++;
        !           513:            break;
        !           514: 
        !           515:        case UCODE:
        !           516:        case MALLOC:
        !           517:        case SCTRL:
        !           518:        case CH_ACT:
        !           519:        case INTEGER:
        !           520:        case REALTYPE:
        !           521:        case BOOLEAN:
        !           522:        case SANY:
        !           523:        case ANY:
        !           524:        case T_NULL:
        !           525:        case OBJECT:
        !           526:        case SOBJECT:
        !           527:        case BITSTRING:
        !           528:        case SBITSTRING:
        !           529:        case OCTETSTRING:
        !           530:        case SOCTETSTRING:
        !           531:        case OBJID:
        !           532:        case SOBJID:
        !           533:        case OPTL:
        !           534:        case EXTMOD:
        !           535:        case DFLT_B:
        !           536:            break;
        !           537: 
        !           538:        case IMP_OBJ:
        !           539:        case ETAG:
        !           540:        case EXTOBJ:
        !           541:        case SEXTOBJ:
        !           542:        case DFLT_F:
        !           543:            p++;
        !           544:            goto again;
        !           545: 
        !           546:        case PE_END:
        !           547:            level--;
        !           548:            break;
        !           549: 
        !           550:        default:
        !           551:            ferrd(1, "next_tpe: unknown type %d\n", p->pe_type);
        !           552:        }
        !           553:        p++;
        !           554:     } while (level > 0 || p->pe_type == DFLT_B);
        !           555: 
        !           556:     return (p);
        !           557: }
        !           558: 
        !           559: /*
        !           560:  * Is there a match at for this tag and class pair. Return 1 if yes 0
        !           561:  * if no We will search through contained objects and through choices
        !           562:  */
        !           563: ismatch(p, mod, cl, tag)
        !           564: tpe    *p;
        !           565: modtyp *mod;                   /* Module it is from */
        !           566: unsigned int cl, tag;
        !           567: {
        !           568:     while (!ISDTYPE(p))
        !           569:        p++;
        !           570: 
        !           571:     switch (p->pe_type) {
        !           572:     case SOBJECT:
        !           573:     case OBJECT:
        !           574:        /* Needs to be changed for optional and default */
        !           575:        return (ismatch(p = mod->md_dtab[p->pe_tag] + 1, mod, cl, tag));
        !           576: 
        !           577:     case SEXTOBJ:
        !           578:     case EXTOBJ:
        !           579:        if (p[1].pe_type != EXTMOD) {
        !           580:            dmp_tpe("ismatch: missing EXTMOD", p, mod);
        !           581:            ferr(1, "ismatch:internal error\n");
        !           582:        }
        !           583:        return (ismatch(EXT2MOD(mod, (p + 1))->md_dtab[p->pe_tag] + 1,
        !           584:                        EXT2MOD(mod, (p + 1)), cl, tag));
        !           585: 
        !           586:     case CHOICE_START:
        !           587:        for (p++; p->pe_type != PE_END; p = next_tpe (p)) {
        !           588:            if (!ISDTYPE(p))
        !           589:                continue;
        !           590:            if (ismatch(p, mod, cl, tag))
        !           591:                return (1);
        !           592:        }
        !           593:        return (0);
        !           594: 
        !           595:     case SANY:
        !           596:        return (1);
        !           597: 
        !           598:     case ANY:
        !           599:        if (STAG(p) == -1)
        !           600:            return (1);
        !           601:        /* else fall through - not sure if this is needed */
        !           602: 
        !           603:     default:
        !           604:        return (tag == TAG(p) && cl == CLASS(p));
        !           605:     }
        !           606: }

unix.superglobalmegacorp.com

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