Annotation of 43BSDReno/contrib/isode-beta/pepsy/dtabs.c, revision 1.1.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.