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

1.1     ! root        1: /* fr.c */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/pepsy/RCS/fr.c,v 7.2 90/07/27 08:48:48 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/pepsy/RCS/fr.c,v 7.2 90/07/27 08:48:48 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       fr.c,v $
        !            12:  * Revision 7.2  90/07/27  08:48:48  mrose
        !            13:  * update
        !            14:  * 
        !            15:  * Revision 7.1  90/07/09  14:52:38  mrose
        !            16:  * sync
        !            17:  * 
        !            18:  * Revision 7.0  90/07/01  19:54:20  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: /*
        !            35:  * These routines are the driving routines for freeing of the data
        !            36:  */
        !            37: #include       <stdio.h>
        !            38: #include       "psap.h"
        !            39: #include       "pepsy.h"
        !            40: 
        !            41: 
        !            42: extern tpe *next_tpe();
        !            43: extern PE pepsylose ();
        !            44: #define NEXT_TPE(p)    p = next_tpe(p)
        !            45: #define CHKTAG(mod, p, pe)     ismatch(p, mod, pe->pe_class, pe->pe_id)
        !            46: 
        !            47: /*
        !            48:  * don't need this fre_f we just generate macros of the form
        !            49:  * fre_obj(parm, mod->md_dtab[CONST], mod)
        !            50:  */
        !            51: #if 0
        !            52: /*
        !            53:  * free the data of specified type of the specified module
        !            54:  */
        !            55: fre_f(typ, mod, pe, explicit, len, buf, parm)
        !            56: /* ARGSUSED */
        !            57: int     typ;                   /* which type it is */
        !            58: modtyp *mod;                   /* Module it is from */
        !            59: PE      pe;
        !            60: int     explicit;
        !            61: int    *len;
        !            62: char  **buf;
        !            63: char  **parm;
        !            64: {
        !            65:     tpe    *p;
        !            66: 
        !            67:     if (typ < 0 || typ >= mod->md_nentries) {
        !            68:        (void) pepsylose (mod, p, pe, "fre_f:Illegal type %d\n", typ);
        !            69:        return (NOTOK);
        !            70:     }
        !            71: 
        !            72:     if (parm == 0)
        !            73:        return (OK);
        !            74: 
        !            75:     p = mod->md_dtab[typ];
        !            76:     if (p->pe_type != PE_START) {
        !            77:        (void) pepsylose (mod, p, pe, "fre_f: missing PE_START\n");
        !            78:        return (NOTOK);
        !            79:     }
        !            80:     fre_obj(parm, p, mod)
        !            81: 
        !            82:     return (OK);
        !            83: }
        !            84: #endif
        !            85: 
        !            86: /*
        !            87:  * free an objects data. Basic algorithm is to walk through it twice
        !            88:  * first time freeing all the "children" of the data structure - then
        !            89:  * the second time free the structure itself
        !            90:  */
        !            91: fre_obj(parm, p, mod)
        !            92: modtyp *mod;
        !            93: tpe    *p;
        !            94: char   *parm;
        !            95: {
        !            96:     char   *malptr = NULL;     /* Have we seen a malloc */
        !            97: 
        !            98:     if (parm == 0)
        !            99:        return (OK);
        !           100: 
        !           101:     if (p->pe_type != PE_START) {
        !           102:        (void) pepsylose (mod, p, NULLPE, "fre_obj: missing PE_START\n");
        !           103:        return (NOTOK);
        !           104:     }
        !           105: 
        !           106:     for (p++; p->pe_type != PE_END; NEXT_TPE(p)) {
        !           107: 
        !           108: again:
        !           109:        switch (p->pe_type) {
        !           110:        case MALLOC:
        !           111:            malptr = parm;
        !           112:            break;
        !           113: 
        !           114:        case SET_START:
        !           115:        case SEQ_START:
        !           116:            fre_seq(parm, p, mod);
        !           117:            break;
        !           118: 
        !           119:        case SETOF_START:
        !           120:        case SEQOF_START:
        !           121:            fre_seqof(parm, p, mod);
        !           122:            break;
        !           123: 
        !           124:        case CHOICE_START:
        !           125:            fre_choice(parm, p, mod);
        !           126:            break;
        !           127: 
        !           128:        case OBJECT:
        !           129:        case SOBJECT:
        !           130:            fre_obj(parm, mod->md_dtab[p->pe_tag], mod);
        !           131:            break;
        !           132: 
        !           133:        case SEXTOBJ:
        !           134:        case EXTOBJ:
        !           135:            if (p[1].pe_type != EXTMOD) {
        !           136:                (void) pepsylose (mod, p, NULLPE, "fre_obj: missing EXTMOD");
        !           137:                return (NOTOK);
        !           138:            }
        !           139:            fre_obj(parm, EXT2MOD(mod, (p + 1))->md_dtab[p->pe_tag],
        !           140:                    EXT2MOD(mod, (p + 1)));
        !           141:            break;
        !           142: 
        !           143:        case IMP_OBJ:
        !           144:            p++;
        !           145:            if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ) {
        !           146:                fre_obj(parm, EXT2MOD(mod, (p + 1))->md_dtab[p->pe_tag],
        !           147:                        EXT2MOD(mod, (p + 1)));
        !           148:            } else {
        !           149:                if (p->pe_type == SOBJECT) {
        !           150:                    fre_obj(parm, mod->md_dtab[p->pe_tag], mod);
        !           151:                } else
        !           152:                    fre_obj(parm, mod->md_dtab[p->pe_tag], mod);
        !           153:            }
        !           154:            break;
        !           155: 
        !           156:        case INTEGER:
        !           157:        case BOOLEAN:
        !           158:        case UCODE:
        !           159:        case REALTYPE:
        !           160:            break;
        !           161: 
        !           162:        case ETAG:
        !           163:            p++;
        !           164:            goto again;
        !           165: 
        !           166:        default:
        !           167:            fre_type(parm, p, mod);
        !           168:            break;
        !           169:        }
        !           170:     }
        !           171: 
        !           172:     if (malptr)                        /* If we saw a malloc free item */
        !           173:        free(malptr);
        !           174: 
        !           175:     return (OK);
        !           176: }
        !           177: 
        !           178: /*
        !           179:  * Handle freeing of single type field. All the more general routines
        !           180:  * fall back to this so we can put the code to free something just
        !           181:  * here once and it will handle all the cases else where
        !           182:  */
        !           183: static fre_type(parm, p, mod)
        !           184: char   *parm;
        !           185: tpe    *p;
        !           186: modtyp *mod;                   /* Module it is from */
        !           187: {
        !           188: 
        !           189:     if (parm == 0)
        !           190:        return;
        !           191: 
        !           192: again:
        !           193:     switch (p->pe_type) {
        !           194:     case MALLOC:
        !           195:        break;
        !           196: 
        !           197:     case PE_END:
        !           198:     case PE_START:
        !           199:     case UCODE:
        !           200:        break;
        !           201: 
        !           202:     case DFLT_F:
        !           203:        p++;
        !           204:        goto again;
        !           205: 
        !           206:     case ETAG:
        !           207:        switch (p->pe_ucode) {
        !           208: 
        !           209:        default:
        !           210:            p++;
        !           211:            fre_type(parm, p, mod);
        !           212:        }
        !           213:        break;
        !           214: 
        !           215:     case SEQ_START:
        !           216:     case SET_START:
        !           217:        fre_seq(*(char **) (parm + p->pe_ucode), p, mod);
        !           218:        break;
        !           219: 
        !           220:     case SEQOF_START:
        !           221:     case SETOF_START:
        !           222:        fre_seqof(*(char **) (parm + p->pe_ucode), p, mod);
        !           223:        break;
        !           224: 
        !           225:     case IMP_OBJ:
        !           226:        p++;
        !           227:        if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ)
        !           228:            fre_obj(*(char **) (parm + p->pe_ucode),
        !           229:                    (EXT2MOD(mod, (p + 1)))->md_dtab[p->pe_tag],
        !           230:                    EXT2MOD(mod, (p + 1)));
        !           231:        else if (p->pe_type == SOBJECT) {
        !           232:            fre_obj((char *) parm, mod->md_dtab[p->pe_tag], mod);
        !           233:        } else
        !           234:            fre_obj(*(char **) (parm + p->pe_ucode),
        !           235:                    mod->md_dtab[p->pe_tag], mod);
        !           236:        break;
        !           237: 
        !           238:     case SOBJECT:
        !           239:        fre_obj((char *) parm, mod->md_dtab[p->pe_tag], mod);
        !           240:        break;
        !           241: 
        !           242:     case OBJECT:
        !           243:        fre_obj(*(char **) (parm + p->pe_ucode),
        !           244:                mod->md_dtab[p->pe_tag], mod);
        !           245:        break;
        !           246: 
        !           247:     case CHOICE_START:
        !           248:        fre_choice(*(char **) (parm + p->pe_ucode), p, mod);
        !           249:        break;
        !           250: 
        !           251:     case SEXTOBJ:
        !           252:        if (p[1].pe_type != EXTMOD) {
        !           253:            (void) pepsylose (mod, p, NULLPE, "fre_type:missing EXTMOD");
        !           254:            return (NOTOK);
        !           255:        }
        !           256:        fre_obj(parm, (EXT2MOD(mod, (p + 1)))->md_dtab[p->pe_tag],
        !           257:                EXT2MOD(mod, (p + 1)));
        !           258:        break;
        !           259: 
        !           260:     case EXTOBJ:
        !           261:        if (p[1].pe_type != EXTMOD) {
        !           262:            (void) pepsylose (mod, p, NULLPE, "fre_type:missing EXTMOD");
        !           263:            return (NOTOK);
        !           264:        }
        !           265:        fre_obj(*(char **) (parm + p->pe_ucode),
        !           266:                (EXT2MOD(mod, (p + 1)))->md_dtab[p->pe_tag],
        !           267:                EXT2MOD(mod, (p + 1)));
        !           268:        break;
        !           269: 
        !           270:     case INTEGER:
        !           271:     case BOOLEAN:
        !           272:     case T_NULL:
        !           273:     case REALTYPE:
        !           274:        break;
        !           275: 
        !           276:     case SANY:
        !           277:        /*
        !           278:         * These tests of the pointer don't appear necessary from the
        !           279:         * definition of encoding and decoding but ISODE generates
        !           280:         * freeing code that does these checks and ISODE's ps layer
        !           281:         * definitely requires it
        !           282:         */
        !           283:        if (parm != NULL)
        !           284:            pe_free((PE) parm);
        !           285:        break;
        !           286: 
        !           287:     case ANY:
        !           288:        if (*(char **) (parm + p->pe_ucode) != NULL)
        !           289:            pe_free(*(PE *) (parm + p->pe_ucode));
        !           290:        break;
        !           291: 
        !           292:     case SOCTETSTRING:
        !           293:        if (parm != NULL)
        !           294:            qb_free((struct qbuf *) parm);
        !           295:        break;
        !           296: 
        !           297:     case OCTETSTRING:
        !           298:        if (*(char **) (parm + p->pe_ucode) != NULL)
        !           299:            qb_free(*(struct qbuf **) (parm + p->pe_ucode));
        !           300:        break;
        !           301: 
        !           302:     case SBITSTRING:
        !           303:        if (parm != NULL)
        !           304:            pe_free((PE) parm);
        !           305:        break;
        !           306: 
        !           307:     case BITSTRING:
        !           308:        if (*(char **) (parm + p->pe_ucode) != NULL)
        !           309:            pe_free(*(PE *) (parm + p->pe_ucode));
        !           310:        break;
        !           311: 
        !           312:     case SOBJID:
        !           313:        if (parm != NULL)
        !           314:            oid_free((OID) parm);
        !           315:        break;
        !           316: 
        !           317:     case OBJID:
        !           318:        if (*(char **) (parm + p->pe_ucode) != NULL)
        !           319:            oid_free(*(OID *) (parm + p->pe_ucode));
        !           320:        break;
        !           321: 
        !           322:     default:
        !           323:        (void) pepsylose (mod, p, NULLPE, "fre_type: %d not implemented\n",
        !           324:            p->pe_type);
        !           325:        return (NOTOK);
        !           326:     }
        !           327: 
        !           328:     return (OK);
        !           329: }
        !           330: 
        !           331: /*
        !           332:  * free elements of a sequential type. e.g. sequence or set
        !           333:  */
        !           334: static fre_seq(parm, p, mod)
        !           335: char   *parm;
        !           336: tpe    *p;
        !           337: modtyp *mod;                   /* Module it is from */
        !           338: {
        !           339:     int    *popt = NULL;       /* Pointer to optional field */
        !           340:     int     optcnt = 0;                /* Number of optionals bits so far */
        !           341:     char   *malptr = NULL;     /* Have we seen a malloc */
        !           342: 
        !           343: 
        !           344:     if (parm == 0)
        !           345:        return;
        !           346: 
        !           347:     if (p->pe_type != SEQ_START && p->pe_type != SET_START) {
        !           348:        (void) pepsylose (mod, p, NULLPE, "fre_seq: bad starting item %d\n",
        !           349:            p->pe_type);
        !           350:        return (NOTOK);
        !           351:     }
        !           352:     p++;
        !           353: 
        !           354:     if (p->pe_type == DFLT_B)
        !           355:        p++;
        !           356: 
        !           357:     while (p->pe_type != PE_END) {
        !           358: 
        !           359:        if (ISDTYPE(p) && (OPTIONAL(p) || DEFAULT(p))) {
        !           360:            switch (p->pe_type) {
        !           361:            case INTEGER:
        !           362:            case BOOLEAN:
        !           363:            case T_NULL:
        !           364:            case REALTYPE:
        !           365:                if (DEFAULT(p)) {
        !           366:                    /* ISODE doesn't use bit map for defaults */
        !           367:                    if (p[1].pe_type == DFLT_B && same(p, p + 1, parm, mod)
        !           368:                        || p[-1].pe_type == DFLT_F && same(p, p - 1, parm, mod))
        !           369:                        goto next;
        !           370:                    break;
        !           371:                }
        !           372:                if (popt == NULL) {
        !           373:                    (void) pepsylose (mod, p, NULLPE,
        !           374:                        "fre_seq:illegal table: no bitmap for optionals\n");
        !           375:                    return (NOTOK);
        !           376:                }
        !           377:                if (!TESTBIT(*popt, optcnt++))
        !           378:                    goto next;  /* Missing so skip */
        !           379:                break;
        !           380: 
        !           381:            case ETAG:
        !           382:                if (!hasdata(parm, p + 1, mod, popt, optcnt))
        !           383:                    goto next;
        !           384:                break;
        !           385: 
        !           386:            case IMP_OBJ:
        !           387:                if (p[1].pe_type == SOBJECT && parm == NULL
        !           388:                    || *((char **) (parm + p[1].pe_ucode)) == NULL)
        !           389:                    goto next;
        !           390:                break;
        !           391: 
        !           392:            case SOBJECT:
        !           393:                if (((char *) parm) == NULL)
        !           394:                    goto next;
        !           395:                break;
        !           396: 
        !           397:            default:
        !           398:                if (*((char **) (parm + p->pe_ucode)) == NULL)
        !           399:                    goto next;
        !           400:                break;
        !           401:            }
        !           402:        }
        !           403:        switch (p->pe_type) {
        !           404:        case MALLOC:
        !           405:            malptr = parm;
        !           406:            break;
        !           407: 
        !           408:        case OPTL:
        !           409:            popt = (int *) (parm + p->pe_ucode);
        !           410:            break;
        !           411: 
        !           412:        case ETAG:
        !           413:            p++;
        !           414:            continue;
        !           415: 
        !           416:        case UCODE:
        !           417:            break;
        !           418: 
        !           419:        case SET_START:
        !           420:        case SEQ_START:
        !           421:            fre_seq(*(char **) (parm + p->pe_ucode), p, mod);
        !           422:            break;
        !           423: 
        !           424:        case SETOF_START:
        !           425:        case SEQOF_START:
        !           426:            fre_seqof(*(char **) (parm + p->pe_ucode), p, mod);
        !           427:            break;
        !           428: 
        !           429:        case IMP_OBJ:
        !           430:            p++;
        !           431:            if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ)
        !           432:                fre_obj(*(char **) (parm + p->pe_ucode),
        !           433:                     (EXT2MOD(mod, (p + 1)))->md_dtab[p->pe_tag],
        !           434:                        EXT2MOD(mod, (p + 1)));
        !           435: 
        !           436:            else if (p->pe_type == SOBJECT) {
        !           437:                fre_obj((char *) parm, mod->md_dtab[p->pe_tag],
        !           438:                        mod);
        !           439:            } else
        !           440:                fre_obj(*(char **) (parm + p->pe_ucode),
        !           441:                        mod->md_dtab[p->pe_tag], mod);
        !           442:            break;
        !           443: 
        !           444:        case SOBJECT:
        !           445:            fre_obj((char *) parm, mod->md_dtab[p->pe_tag], mod);
        !           446:            break;
        !           447: 
        !           448:        case OBJECT:
        !           449:            fre_obj(*(char **) (parm + p->pe_ucode),
        !           450:                    mod->md_dtab[p->pe_tag], mod);
        !           451:            break;
        !           452: 
        !           453:        case CHOICE_START:
        !           454:            fre_choice(*(char **) (parm + p->pe_ucode), p, mod);
        !           455:            break;
        !           456: 
        !           457:        case SEXTOBJ:
        !           458:            if (p[1].pe_type != EXTMOD) {
        !           459:                (void) pepsylose (mod, p, NULLPE, "fre_seq:missing EXTMOD");
        !           460:                return (NOTOK);
        !           461:            }
        !           462:            fre_obj(parm, (EXT2MOD(mod, (p + 1)))->md_dtab[p->pe_tag],
        !           463:                    EXT2MOD(mod, (p + 1)));
        !           464:            break;
        !           465: 
        !           466:        case EXTOBJ:
        !           467:            if (p[1].pe_type != EXTMOD) {
        !           468:                (void) pepsylose (mod, p, NULLPE, "fre_seq:missing EXTMOD");
        !           469:                return (NOTOK);
        !           470:            }
        !           471:            fre_obj(*(char **) (parm + p->pe_ucode),
        !           472:                    (EXT2MOD(mod, (p + 1)))->md_dtab[p->pe_tag],
        !           473:                    EXT2MOD(mod, (p + 1)));
        !           474:            break;
        !           475: 
        !           476:        default:
        !           477:            fre_type(parm, p, mod);
        !           478:            break;
        !           479:        }
        !           480: 
        !           481: next:
        !           482:        NEXT_TPE(p);
        !           483:     }
        !           484:     if (malptr)                        /* If we saw a malloc free item */
        !           485:        free(malptr);
        !           486:     
        !           487:     return (OK);
        !           488: 
        !           489: }
        !           490: 
        !           491: /*
        !           492:  * free all the fields in a SET OF/SEQUENCE OF type structure. We
        !           493:  * must follow the linked list until the end
        !           494:  */
        !           495: static fre_seqof(parm, p, mod)
        !           496: char   *parm;
        !           497: tpe    *p;
        !           498: modtyp *mod;                   /* Module it is from */
        !           499: {
        !           500:     tpe    *start;             /* first entry in list */
        !           501:     char   *oparm;
        !           502: 
        !           503:     if (parm == 0)
        !           504:        return;
        !           505: 
        !           506:     if (p->pe_type != SEQOF_START && p->pe_type != SETOF_START) {
        !           507:        (void) pepsylose (mod, p, NULLPE, "fre_seqof: illegal field");
        !           508:        return (NOTOK);
        !           509:     }
        !           510:     for (start = p; (char *) parm != NULL; p = start) {
        !           511:        p++;
        !           512: 
        !           513:        if (p->pe_type == DFLT_B)
        !           514:            p++;
        !           515: 
        !           516:        while (p->pe_type != PE_END) {
        !           517: 
        !           518:            switch (p->pe_type) {
        !           519:            case ETAG:
        !           520:                p++;
        !           521:                continue;
        !           522: 
        !           523:            case UCODE:
        !           524:                break;
        !           525: 
        !           526:            case SEQ_START:
        !           527:            case SET_START:
        !           528:                fre_seq(*(char **) (parm + p->pe_ucode), p, mod);
        !           529:                break;
        !           530: 
        !           531:            case SEQOF_START:
        !           532:            case SETOF_START:
        !           533:                fre_seqof(*(char **) (parm + p->pe_ucode), p, mod);
        !           534:                break;
        !           535: 
        !           536:            case IMP_OBJ:
        !           537:                p++;
        !           538:                if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ)
        !           539:                    fre_obj(*(char **) (parm + p->pe_ucode),
        !           540:                     (EXT2MOD(mod, (p + 1)))->md_dtab[p->pe_tag],
        !           541:                            EXT2MOD(mod, (p + 1)));
        !           542: 
        !           543:                else if (p->pe_type == SOBJECT) {
        !           544:                    fre_obj((char *) parm, mod->md_dtab[p->pe_tag], mod);
        !           545:                } else
        !           546:                    fre_obj(*(char **) (parm + p->pe_ucode),
        !           547:                            mod->md_dtab[p->pe_tag], mod);
        !           548:                break;
        !           549: 
        !           550:            case SOBJECT:
        !           551:                fre_obj(parm, mod->md_dtab[p->pe_tag], mod);
        !           552:                break;
        !           553: 
        !           554:            case OBJECT:
        !           555:                fre_obj(*(char **) (parm + p->pe_ucode),
        !           556:                        mod->md_dtab[p->pe_tag], mod);
        !           557:                break;
        !           558: 
        !           559:            case CHOICE_START:
        !           560:                fre_choice(*(char **) (parm + p->pe_ucode), p, mod);
        !           561:                break;
        !           562: 
        !           563:            case SEXTOBJ:
        !           564:                if (p[1].pe_type != EXTMOD) {
        !           565:                    (void) pepsylose (mod, p, NULLPE,
        !           566:                        "fre_seqof: missing EXTMOD");
        !           567:                    return (NOTOK);
        !           568:                }
        !           569:                fre_obj(parm, (EXT2MOD(mod, (p + 1)))->md_dtab[p->pe_tag],
        !           570:                        EXT2MOD(mod, (p + 1)));
        !           571:                break;
        !           572: 
        !           573:            case EXTOBJ:
        !           574:                if (p[1].pe_type != EXTMOD) {
        !           575:                    (void) pepsylose (mod, p, NULLPE,
        !           576:                        "fre_seqof: missing EXTMOD");
        !           577:                    return (NOTOK);
        !           578:                }
        !           579:                fre_obj(*(char **) (parm + p->pe_ucode),
        !           580:                     (EXT2MOD(mod, (p + 1)))->md_dtab[p->pe_tag],
        !           581:                        EXT2MOD(mod, (p + 1)));
        !           582:                break;
        !           583: 
        !           584:            default:
        !           585:                fre_type(parm, p, mod);
        !           586:                break;
        !           587:            }
        !           588: 
        !           589:            NEXT_TPE(p);
        !           590:        }
        !           591:        oparm = parm;
        !           592:        parm = *(char **) (parm + p->pe_ucode); /* Any more ? */
        !           593:        free(oparm);
        !           594:     }
        !           595: 
        !           596: }
        !           597: 
        !           598: /*
        !           599:  * free the item of the choice. Use the SCTRL field to determine
        !           600:  * which item is present and then call the appropriate routine to
        !           601:  * free it
        !           602:  */
        !           603: static fre_choice(parm, p, mod)
        !           604: char   *parm;
        !           605: tpe    *p;
        !           606: modtyp *mod;                   /* Module it is from */
        !           607: {
        !           608:     int     cnt;
        !           609:     char   *malptr = NULL;     /* Have we seen a malloc */
        !           610: 
        !           611:     if (parm == 0)
        !           612:        return;
        !           613: 
        !           614:     if (p->pe_type != CHOICE_START) {
        !           615:        (void) pepsylose (mod, p, NULLPE,
        !           616:            "fre_choice:CHOICE_START missing found %d\n", p->pe_type);
        !           617:     }
        !           618:     p++;
        !           619: 
        !           620:     if (p->pe_type == DFLT_B)
        !           621:        p++;
        !           622: 
        !           623:     if (p->pe_type == MALLOC) {
        !           624:        malptr = parm;
        !           625:        p++;
        !           626:     }
        !           627:     if (p->pe_type != SCTRL) {
        !           628:        (void) pepsylose (mod, p, NULLPE,
        !           629:            "fre_choice: missing SCTRL information\n");
        !           630:        return (NOTOK);
        !           631:     }
        !           632:     cnt = *(int *) (parm + p->pe_ucode);
        !           633:     if (cnt != 0)
        !           634:        cnt--;
        !           635:     if (cnt < 0) {
        !           636:        (void) pepsylose (mod, p, NULLPE,"fre_choice:offset negative %d", cnt);
        !           637:        return (NOTOK);
        !           638:     }
        !           639:     for (p++; p->pe_type != PE_END; NEXT_TPE(p)) {
        !           640:        if (ISDTYPE(p)) {
        !           641:            if (cnt == 0) {
        !           642:                fre_type(parm, p, mod);
        !           643:                if (malptr)     /* If we saw a malloc free item */
        !           644:                    free(malptr);
        !           645:                return;
        !           646:            }
        !           647:            cnt--;
        !           648:        }
        !           649:     }
        !           650: 
        !           651:     (void) pepsylose (mod, p, NULLPE, "fre_choice: no choice taken");
        !           652:     return (NOTOK);
        !           653: }

unix.superglobalmegacorp.com

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