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

1.1     ! root        1: /* dtabs.c */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/pepsy/RCS/dtabs.c,v 7.2 90/07/27 08:49:09 mrose Exp $";
        !             5: #endif
        !             6: 
        !             7: /* 
        !             8:  * $Header: /f/osi/pepsy/RCS/dtabs.c,v 7.2 90/07/27 08:49:09 mrose Exp $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       dtabs.c,v $
        !            12:  * Revision 7.2  90/07/27  08:49:09  mrose
        !            13:  * update
        !            14:  * 
        !            15:  * Revision 7.1  90/07/09  14:52:25  mrose
        !            16:  * sync
        !            17:  * 
        !            18:  * Revision 7.0  90/07/01  19:54:15  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 "pepsydefs.h"
        !            36: #include "pass2.h"
        !            37: #include "mine.h"
        !            38: 
        !            39: 
        !            40: extern FILE *fptab;
        !            41: extern char *c_tag(), *c_class();
        !            42: extern char *ec_tag(), *ec_class();
        !            43: extern char *strip_last();
        !            44: extern char *str_yp_code[];
        !            45: extern char *get_val(), *get_comp(), *strp2name();
        !            46: extern s_table *lookup_list(), *get_offset();
        !            47: extern YP tdec_loop();
        !            48: 
        !            49: extern char *concat();
        !            50: extern char *my_strcat();
        !            51: 
        !            52: /* extern int explicit; */
        !            53: 
        !            54: static int cons_type = 0;
        !            55: 
        !            56: s_table *ptr;
        !            57: s_table *save_ptr;
        !            58: 
        !            59: #define WORDSIZE       20
        !            60: 
        !            61: /*
        !            62:  * table encode a type. generate tables for the encoding of a type
        !            63:  */
        !            64: tdec_typ(yp, id, type)
        !            65: YP      yp;
        !            66: char   *id;
        !            67: char   *type;
        !            68: {
        !            69:     char   *t, *f;
        !            70:     char   *p1;
        !            71:     char   *s1, *s2, *s3;
        !            72:     char   *s;
        !            73:     s_table *ptr1, *ptr2;
        !            74:     YP      y;
        !            75: 
        !            76:     if (yp->yp_code < 0 || yp->yp_code > YP_REAL)
        !            77:        ferrd(1, "tdec_typ: unimplemented type %d\n", yp->yp_code);
        !            78: 
        !            79:     if (yp == NULL) {
        !            80:        ferr(0, "tdec_typ:NULL arguement\n");
        !            81:        return;
        !            82:     }
        !            83:     /* explicit = 0; */
        !            84: 
        !            85:     if (yp->yp_flags & YP_TAG && !(yp->yp_flags & YP_IMPLICIT)) {
        !            86:        (void) fprintf(fptab, "\t{ ETAG, 0, ");
        !            87:        /* (void) fprintf(fptab, "%d, ", c_type(yp)); */
        !            88:        (void) fprintf(fptab, "%s, %s },\n", ec_tag(yp), ec_class(yp));
        !            89:        /* explicit++; */
        !            90:     }
        !            91:     if (type)
        !            92:        t = type;
        !            93:     else {
        !            94:        t = my_strcat("struct ", modsym(mymodule, id, "type"));
        !            95:        switch (yp->yp_code) {
        !            96:            /*
        !            97:             * These generate MALLOC entries inside *_START ..
        !            98:             * PE_END fields for historical reasons. One day we might
        !            99:             * fix this to be all done the same way.
        !           100:             */
        !           101:        case YP_SEQLIST:
        !           102:        case YP_SEQTYPE:
        !           103:        case YP_SETLIST:
        !           104:        case YP_SETTYPE:
        !           105:        case YP_CHOICE:
        !           106:            break;
        !           107: 
        !           108:        default:
        !           109:            if (yp->yp_varexp == NULL)
        !           110:                break;          /* S* type entry - doesn't need a
        !           111:                                 * malloc */
        !           112: 
        !           113:            (void) fprintf(fptab, "\t{ MALLOC, 0, sizeof (%s), 0 },\n", t);
        !           114:            break;
        !           115:        }
        !           116:     }
        !           117: 
        !           118:     f = yp->yp_varexp;
        !           119:     switch (yp->yp_code) {
        !           120: 
        !           121:     case YP_UNDF:
        !           122:        ferr(1, "tdec_typ:Undefined type\n");
        !           123: 
        !           124:     case YP_BOOL:
        !           125:        p1 = "BOOLEAN";
        !           126:        if (!yp->yp_varexp)
        !           127:            t = NULL;
        !           128:        break;
        !           129: 
        !           130:        /* This needs to be fixed up in the action generating area */
        !           131:     case YP_INTLIST:
        !           132: 
        !           133:     case YP_INT:
        !           134: 
        !           135:     case YP_ENUMLIST:
        !           136:        if (yp->yp_varexp) {
        !           137:            p1 = "INTEGER";
        !           138:            break;
        !           139:        }
        !           140:        t = NULL;
        !           141:        p1 = NULL;
        !           142:        (void) fprintf(fptab, "\t{ SINTEGER, 0, %s, %s },\n",
        !           143:                c_tag(yp), c_class(yp));
        !           144:        break;
        !           145: 
        !           146:     case YP_REAL:
        !           147:        if (yp->yp_varexp) {
        !           148:            p1 = "REALTYPE";
        !           149:            break;
        !           150:        }
        !           151:        t = NULL;
        !           152:        p1 = NULL;
        !           153:        (void) fprintf(fptab, "\t{ SREALTYPE, 0, %s, %s },\n",
        !           154:                c_tag(yp), c_class(yp));
        !           155:        break;
        !           156: 
        !           157: 
        !           158:     case YP_BIT:
        !           159:     case YP_BITLIST:
        !           160:        if (yp->yp_varexp) {
        !           161:            p1 = "BITSTRING";
        !           162:            break;
        !           163:        }
        !           164:        t = NULL;
        !           165:        p1 = NULL;
        !           166:        (void) fprintf(fptab, "\t{ SBITSTRING, 0, %s, %s },\n",
        !           167:                c_tag(yp), c_class(yp));
        !           168:        break;
        !           169: 
        !           170:     case YP_OCT:
        !           171:        if (yp->yp_varexp) {
        !           172:            p1 = "OCTETSTRING";
        !           173:            break;
        !           174:        }
        !           175:        t = NULL;
        !           176:        p1 = NULL;
        !           177:        (void) fprintf(fptab, "\t{ SOCTETSTRING, 0, %s, %s },\n",
        !           178:                c_tag(yp), c_class(yp));
        !           179:        break;
        !           180: 
        !           181:     case YP_OID:
        !           182:        if (yp->yp_varexp) {
        !           183:            p1 = "OBJID";
        !           184:            break;
        !           185:        }
        !           186:        t = NULL;
        !           187:        p1 = NULL;
        !           188:        (void) fprintf(fptab, "\t{ SOBJID, 0, %s, %s },\n",
        !           189:                c_tag(yp), c_class(yp));
        !           190:        break;
        !           191: 
        !           192:     case YP_SEQ:
        !           193:     case YP_SET:
        !           194:     case YP_ANY:
        !           195:        /*
        !           196:         * if (cons_type) p1 = "CONS_ANY"; else
        !           197:         */
        !           198:        if (yp->yp_varexp) {
        !           199:            p1 = "ANY";
        !           200:            break;
        !           201:        }
        !           202:        t = NULL;
        !           203:        p1 = NULL;
        !           204:        (void) fprintf(fptab, "\t{ SANY, 0, %s, %s },\n",
        !           205:                c_tag(yp), c_class(yp));
        !           206:        break;
        !           207: 
        !           208:     case YP_NULL:
        !           209:        p1 = "T_NULL";
        !           210:        t = NULL;
        !           211:        break;
        !           212: 
        !           213:     case YP_IDEFINED:
        !           214:        p1 = NULL;
        !           215:        {
        !           216:            /* Predefined Universal Type */
        !           217:            struct univ_typ *p, *univtyp();
        !           218: 
        !           219:            if ((p = univtyp(yp->yp_identifier))) {
        !           220:                if (p->univ_flags & UNF_EXTMOD) {
        !           221:                    yp->yp_module = p->univ_mod;
        !           222:                    goto do_obj;
        !           223:                }
        !           224:                if (f == NULL) {/* No offset type */
        !           225:                    if (yp->yp_flags & YP_TAG
        !           226:                        && yp->yp_flags & YP_IMPLICIT)
        !           227:                        (void) fprintf(fptab, "\t{ S%s, 0, %d, %s },\n",
        !           228:                                p->univ_tab,
        !           229:                                yp->yp_tag->yt_value->yv_number,
        !           230:                                c_flags(yp, yp->yp_tag->yt_class));
        !           231:                    else
        !           232:                        (void) fprintf(fptab, "\t{ S%s, 0, %d, %s },\n",
        !           233:                                p->univ_tab, p->univ_id,
        !           234:                                c_flags(yp, p->univ_class));
        !           235:                    goto out;
        !           236:                }
        !           237:                if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT)
        !           238:                    (void) fprintf(fptab, "\t{ %s, OFFSET(%s, %s), %d, %s },\n",
        !           239:                            p->univ_tab, t, f,
        !           240:                            yp->yp_tag->yt_value->yv_number,
        !           241:                            c_flags(yp, yp->yp_tag->yt_class));
        !           242:                else
        !           243:                    (void) fprintf(fptab, "\t{ %s, OFFSET(%s, %s), %d, %s },\n",
        !           244:                            p->univ_tab, t, f, p->univ_id,
        !           245:                            c_flags(yp, p->univ_class));
        !           246:                goto out;
        !           247:            }
        !           248:        }
        !           249: do_obj:
        !           250:        if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT)
        !           251:            (void) fprintf(fptab, "\t{ IMP_OBJ, 0, %s, %s },\n", c_tag(yp), c_class(yp));
        !           252:        if (yp->yp_parm) {
        !           253:            ferr(1, "tenc_typ:YP_IDEFINED:yp_parm found\n");
        !           254:        }
        !           255:        if (yp->yp_module == NULL
        !           256:            || strcmp(yp->yp_module, mymodule) == 0) {
        !           257:            if (f == NULL)
        !           258:                (void) fprintf(fptab, "\t{ SOBJECT, 0, _Z%s, %s },\n",
        !           259:                      proc_name(yp->yp_identifier, 0), c_class(yp));
        !           260:            else
        !           261:                (void) fprintf(fptab, "\t{ OBJECT, OFFSET(%s, %s), _Z%s, %s },\n",
        !           262:                t, f, proc_name(yp->yp_identifier, 0), c_class(yp));
        !           263:        } else {
        !           264:            if (f == NULL)
        !           265:                (void) fprintf(fptab, "\t{ SEXTOBJ, 0, _Z%s, %s },\n",
        !           266:                        strp2name(yp->yp_identifier, yp->yp_module),
        !           267:                        c_class(yp));
        !           268:            else
        !           269:                (void) fprintf(fptab, "\t{ EXTOBJ, OFFSET(%s, %s), _Z%s, %s },\n",
        !           270:                  t, f, strp2name(yp->yp_identifier, yp->yp_module),
        !           271:                        c_class(yp));
        !           272:            (void) fprintf(fptab, "\t{ EXTMOD, %d, 0, 0 },\n",
        !           273:                    gen_modref(yp->yp_module));
        !           274:        }
        !           275:     out:
        !           276:        if (yp->yp_flags & YP_DEFAULT)
        !           277:            gdflt(yp, G_DEC);
        !           278:        break;
        !           279: 
        !           280:     case YP_SEQLIST:
        !           281:        p1 = NULL;
        !           282:        /* support for -h flag */
        !           283: #if 0
        !           284:        if (hflag && (y = yp->yp_type) && !y->yp_next) {
        !           285:            tdec_typ(y, id, yp->yp_structname);
        !           286:            break;
        !           287:        }
        !           288: #endif
        !           289:        cons_type++;
        !           290:        save_ptr = ptr;
        !           291:        if (yp->yp_varexp == NULL && type != NULL)
        !           292:            ferr(1, "tdec_typ:YP_SEQLIST:NULL varexp pointer\n");
        !           293:        if (type != NULL)
        !           294:            (void) fprintf(fptab, "\t{ SEQ_START, OFFSET(%s, %s), %s, %s },\n",
        !           295:                    t, f, c_tag(yp), c_class(yp));
        !           296:        else
        !           297:            (void) fprintf(fptab, "\t{ SEQ_START, 0, %s, %s },\n",
        !           298:                    c_tag(yp), c_class(yp));
        !           299: 
        !           300:        if (yp->yp_flags & YP_DEFAULT)
        !           301:            gdflt(yp, G_DEC);
        !           302:        if (y = yp->yp_type) {
        !           303:            genmalloc(yp);
        !           304:            if (type) {
        !           305:                if (yp->yp_declexp == NULL)
        !           306:                    ferr(1, "tdec_typ:YP_SEQLIST:no declexp\n");
        !           307:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
        !           308:            } else
        !           309:                yp->yp_structname = t;
        !           310:            if (optfield(y)) {
        !           311:                (void) fprintf(fptab,
        !           312:                        "\t{ OPTL, OFFSET(%s, optionals), 0, 0 },\n",
        !           313:                        yp->yp_structname);
        !           314:            }
        !           315:            tdec_loop(y, id, yp->yp_structname);
        !           316:        }
        !           317:        (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
        !           318:        ptr = save_ptr;
        !           319:        cons_type--;
        !           320:        break;
        !           321: 
        !           322:     case YP_SETLIST:
        !           323:        p1 = NULL;
        !           324:        /* support for -h flag */
        !           325: #if 0
        !           326:        if (hflag && (y = yp->yp_type) && !y->yp_next) {
        !           327:            tdec_typ(y, id, yp->yp_structname);
        !           328:            break;
        !           329:        }
        !           330: #endif
        !           331:        p1 = NULL;
        !           332:        cons_type++;
        !           333:        if (yp->yp_varexp == NULL && type != NULL)
        !           334:            ferr(1, "tdec_typ:YP_SETLIST:NULL varexp pointer\n");
        !           335:        if (type != NULL)
        !           336:            (void) fprintf(fptab, "\t{ SET_START, OFFSET(%s, %s), %s, %s },\n",
        !           337:                    t, f, c_tag(yp), c_class(yp));
        !           338:        else
        !           339:            (void) fprintf(fptab, "\t{ SET_START, 0, %s, %s },\n",
        !           340:                    c_tag(yp), c_class(yp));
        !           341: 
        !           342:        if (yp->yp_flags & YP_DEFAULT)
        !           343:            gdflt(yp, G_DEC);
        !           344:        if (y = yp->yp_type) {
        !           345:            genmalloc(yp);
        !           346:            if (type) {
        !           347:                if (yp->yp_declexp == NULL)
        !           348:                    ferr(1, "tdec_typ:YP_SETLIST:no declexp\n");
        !           349:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
        !           350:            } else
        !           351:                yp->yp_structname = t;
        !           352:            if (optfield(y)) {
        !           353:                (void) fprintf(fptab,
        !           354:                        "\t{ OPTL, OFFSET(%s, optionals), 0, 0 },\n",
        !           355:                        yp->yp_structname);
        !           356:            }
        !           357:            tdec_loop(y, id, yp->yp_structname);
        !           358:        }
        !           359:        (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
        !           360:        ptr = save_ptr;
        !           361:        cons_type--;
        !           362:        break;
        !           363: 
        !           364:     case YP_SEQTYPE:           /* What is the difference ?? */
        !           365:        p1 = NULL;
        !           366:        cons_type++;
        !           367:        save_ptr = ptr;
        !           368:        if (type != NULL)
        !           369:            (void) fprintf(fptab, "\t{ SEQOF_START, OFFSET(%s, %s), %s, %s },\n",
        !           370:                    t, f, c_tag(yp), c_class(yp));
        !           371:        else
        !           372:            (void) fprintf(fptab, "\t{ SEQOF_START, 0, %s, %s },\n",
        !           373:                    c_tag(yp), c_class(yp));
        !           374:        if (yp->yp_flags & YP_DEFAULT)
        !           375:            gdflt(yp, G_DEC);
        !           376: 
        !           377:        if (y = yp->yp_type) {
        !           378:            genmalloc(yp);
        !           379:            if (type) {
        !           380:                if (yp->yp_declexp == NULL)
        !           381:                    ferr(1, "tdec_typ:YP_SEQTYPE:no declexp\n");
        !           382:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
        !           383:            } else
        !           384:                yp->yp_structname = t;
        !           385:            tdec_loop(y, id, yp->yp_structname);
        !           386:        }
        !           387:        if (yp->yp_structname != NULL)
        !           388:            (void) fprintf(fptab, "\t{ PE_END, OFFSET(%s, next), 0, 0 },\n",
        !           389:                    yp->yp_structname);
        !           390:        else
        !           391:            (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
        !           392:        ptr = save_ptr;
        !           393:        cons_type--;
        !           394:        break;
        !           395: 
        !           396:     case YP_SETTYPE:
        !           397:        p1 = NULL;
        !           398:        cons_type++;
        !           399:        save_ptr = ptr;
        !           400:        if (type != NULL)
        !           401:            (void) fprintf(fptab, "\t{ SETOF_START, OFFSET(%s, %s), %s, %s },\n",
        !           402:                    t, f, c_tag(yp), c_class(yp));
        !           403:        else
        !           404:            (void) fprintf(fptab, "\t{ SETOF_START, 0, %s, %s },\n",
        !           405:                    c_tag(yp), c_class(yp));
        !           406: 
        !           407:        if (yp->yp_flags & YP_DEFAULT)
        !           408:            gdflt(yp, G_DEC);
        !           409: 
        !           410:        if (y = yp->yp_type) {
        !           411:            genmalloc(yp);
        !           412:            if (type) {
        !           413:                if (yp->yp_declexp == NULL)
        !           414:                    ferr(1, "tdec_typ:YP_SETTYPE:no declexp\n");
        !           415:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
        !           416:            } else
        !           417:                yp->yp_structname = t;
        !           418:            tdec_loop(y, id, yp->yp_structname);
        !           419:        }
        !           420:        if (yp->yp_structname != NULL)
        !           421:            (void) fprintf(fptab, "\t{ PE_END, OFFSET(%s, next), 0, 0 },\n",
        !           422:                    yp->yp_structname);
        !           423:        else
        !           424:            (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
        !           425:        ptr = save_ptr;
        !           426:        cons_type--;
        !           427:        break;
        !           428: 
        !           429:     case YP_CHOICE:
        !           430:        p1 = NULL;
        !           431:        /* support for -h flag */
        !           432:        if (hflag && (y = yp->yp_type) && !y->yp_next) {
        !           433:            tdec_typ(y, id, yp->yp_structname);
        !           434:            break;
        !           435:        }
        !           436:        cons_type++;
        !           437:        save_ptr = ptr;
        !           438:        if (type != NULL)
        !           439:            (void) fprintf(fptab, "\t{ CHOICE_START, OFFSET(%s, %s), 0, %s },\n",
        !           440:                    t, f, c_class(yp));
        !           441:        else
        !           442:            (void) fprintf(fptab, "\t{ CHOICE_START, 0, 0, 0 },\n");
        !           443: 
        !           444:        if (yp->yp_flags & YP_DEFAULT)
        !           445:            gdflt(yp, G_DEC);
        !           446:        if (y = yp->yp_type) {
        !           447:            genmalloc(yp);
        !           448:            (void) fprintf(fptab, "\t{ SCTRL, OFFSET(%s, offset), 0, 0 },\n",
        !           449:                    yp->yp_structname);
        !           450:            if (type) {
        !           451:                if (yp->yp_declexp == NULL)
        !           452:                    ferr(1, "tdec_typ:YP_CHOICE:no declexp\n");
        !           453:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
        !           454:            } else
        !           455:                yp->yp_structname = t;
        !           456:            tdec_loop(y, id, yp->yp_structname);
        !           457:        }
        !           458:        (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
        !           459:        ptr = save_ptr;
        !           460:        cons_type--;
        !           461:        break;
        !           462: 
        !           463:     default:
        !           464:        ferrd(1, "tdec_typ: yp_code = %d  not implemented\n", yp->yp_code);
        !           465:     }
        !           466: 
        !           467:     if (p1 != NULL) {
        !           468:        if (t != NULL) {
        !           469:            (void) fprintf(fptab, "\t{ %s, OFFSET(%s, %s), %s, %s },\n", p1, t, f,
        !           470:                    c_tag(yp), c_class(yp));
        !           471:        } else {
        !           472:            (void) fprintf(fptab, "\t{ %s, 0, %s, %s },\n", p1, c_tag(yp),
        !           473:                    c_class(yp));
        !           474:        }
        !           475: 
        !           476:        if (yp->yp_flags & YP_DEFAULT)
        !           477:            gdflt(yp, G_DEC);
        !           478:     }
        !           479: }
        !           480: 
        !           481: static int fflags[] = {
        !           482:     0, 1, 2, 2, 3, 3, 4, 5, 16, 16, 16, 17, 17, 17,
        !           483: 0, -1, 7,};
        !           484: 
        !           485: /*
        !           486:  * generate tables for encoding a contructed type
        !           487:  */
        !           488: YP 
        !           489: tdec_loop(yp, id, type)
        !           490: YP      yp;
        !           491: char   *id;
        !           492: char   *type;
        !           493: {
        !           494:     for (; yp != NULL; yp = yp->yp_next) {
        !           495:        tdec_typ(yp, id, type);
        !           496:     }
        !           497: }
        !           498: /*
        !           499:  * Generate a malloc of for the given object
        !           500:  */
        !           501: genmalloc(yp)
        !           502: YP      yp;
        !           503: {
        !           504: 
        !           505:     (void) fprintf(fptab, "\t{ MALLOC, 0, sizeof (%s), 0 },\n", yp->yp_structname);
        !           506: }

unix.superglobalmegacorp.com

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