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

1.1       root        1: /* etabs.c */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/pepsy/RCS/etabs.c,v 7.2 90/07/27 08:49:15 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/pepsy/RCS/etabs.c,v 7.2 90/07/27 08:49:15 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       etabs.c,v $
                     12:  * Revision 7.2  90/07/27  08:49:15  mrose
                     13:  * update
                     14:  * 
                     15:  * Revision 7.1  90/07/09  14:52:33  mrose
                     16:  * sync
                     17:  * 
                     18:  * Revision 7.0  90/07/01  19:54:18  mrose
                     19:  * *** empty log message ***
                     20:  * 
                     21:  */
                     22: 
                     23: /*
                     24:  *                               NOTICE
                     25:  *
                     26:  *    Acquisition, use, and distribution of this module and related
                     27:  *    materials are subject to the restrictions of a license agreement.
                     28:  *    Consult the Preface in the User's Manual for the full terms of
                     29:  *    this agreement.
                     30:  *
                     31:  */
                     32: 
                     33: 
                     34: #include <stdio.h>
                     35: #include <ctype.h>
                     36: #include "pepsydefs.h"
                     37: #include "sym.h"
                     38: #include "pass2.h"
                     39: #include "mine.h"
                     40: 
                     41: s_table *head;
                     42: 
                     43: extern s_table *lookup_list(), *proc_def();
                     44: 
                     45: extern FILE *fptab;
                     46: extern char *c_tag(), *c_class();
                     47: extern char *ec_tag(), *ec_class();
                     48: extern char *strip_last();
                     49: extern char *get_val(), *get_comp(), *get_string();
                     50: extern s_table *get_offset();
                     51: extern char *my_strcat(), *strp2name();
                     52: extern char *my_new_str();
                     53: extern char *mymodule;
                     54: extern char *modsym();
                     55: extern char *concat();
                     56: extern char *genlabel();
                     57: extern char *notidtoid();
                     58: extern YV calc_yv();
                     59: extern SY syfind();
                     60: static s_table *en_ptr;
                     61: extern s_table *ptr;
                     62: 
                     63: static int cons_type = 0;
                     64: /* int     explicit; */
                     65: 
                     66: s_table *save_ptr;
                     67: 
                     68: #define WORDSIZE       20
                     69: #define MAXNAME                256     /* maximum size of a identifier */
                     70: 
                     71: #ifdef DEBUG
                     72: char   *str_yp_code[] = {
                     73:     "Undefined", "Boolean", "Integer", "Named number list", "Bitstring",
                     74:     "Named Bitstring list", "Octet String", "Null", "Sequence",
                     75:     "Sequence of", "Sequence list", "Set", "Set of", "Set list",
                     76:     "Choice", "Any", "Object Identifier",
                     77:     "", "", "", "", "", "", "", "",
                     78:     "", "", "", "", "", "", "", "Identifier",
                     79: 
                     80: };
                     81: 
                     82: #endif
                     83: 
                     84: /*
                     85:  * table encode a type. generate tables for the encoding of a type
                     86:  */
                     87: tenc_typ(yp, id, type)
                     88: YP      yp;
                     89: char   *id;
                     90: char   *type;
                     91: {
                     92: 
                     93:     char   *t, *f;
                     94:     char   *p1;
                     95:     char   *s1, *s2, *s3;
                     96:     char   *s;
                     97:     s_table *ptr1, *ptr2;
                     98:     YP      y;
                     99: 
                    100: 
                    101:     if (yp->yp_code < 0 || yp->yp_code > YP_REAL)
                    102:        ferrd(1, "tdec_typ: unimplemented type %d\n", yp->yp_code);
                    103: 
                    104:     if (yp == NULL) {
                    105:        ferr(0, "tenc_typ:NULL argument\n");
                    106:        return;
                    107:     }
                    108:     if (yp->yp_flags & YP_DEFAULT)
                    109:        gdflt(yp, G_ENC);
                    110: 
                    111:     if (yp->yp_flags & YP_TAG && !(yp->yp_flags & YP_IMPLICIT)) {
                    112:        (void) fprintf(fptab, "\t{ ETAG, 0, ");
                    113:        (void) fprintf(fptab, "%s, %s },\n", ec_tag(yp), ec_class(yp));
                    114:     }
                    115:     /* Preserve the type of the containing object */
                    116:     if (type)
                    117:        t = type;
                    118:     else
                    119:        t = my_strcat("struct ", modsym(mymodule, id, "type"));
                    120:     f = yp->yp_varexp;
                    121:     switch (yp->yp_code) {
                    122: 
                    123:     case YP_UNDF:
                    124:        ferr(1, "tenc_typ:Undefined type\n");
                    125: 
                    126:     case YP_BOOL:
                    127:        p1 = "BOOLEAN";
                    128:        if (yp->yp_varexp) {
                    129:        } else
                    130:            t = NULL;
                    131:        break;
                    132: 
                    133:     case YP_INTLIST:
                    134: 
                    135:     case YP_INT:
                    136: 
                    137:     case YP_ENUMLIST:
                    138:        if (yp->yp_varexp) {
                    139:            p1 = "INTEGER";
                    140:            break;
                    141:        }
                    142:        t = NULL;
                    143:        p1 = NULL;
                    144:        (void) fprintf(fptab, "\t{ SINTEGER, 0, %s, %s },\n",
                    145:                c_tag(yp), c_class(yp));
                    146:        break;
                    147: 
                    148:     case YP_REAL:
                    149:        if (yp->yp_varexp) {
                    150:            p1 = "REALTYPE";
                    151:            break;
                    152:        }
                    153:        t = NULL;
                    154:        p1 = NULL;
                    155:        (void) fprintf(fptab, "\t{ SREALTYPE, 0, %s, %s },\n",
                    156:                c_tag(yp), c_class(yp));
                    157:        break;
                    158: 
                    159:     case YP_BIT:
                    160:     case YP_BITLIST:
                    161:        if (yp->yp_varexp) {
                    162:            p1 = "BITSTRING";
                    163:            break;
                    164:        }
                    165:        t = NULL;
                    166:        p1 = NULL;
                    167:        (void) fprintf(fptab, "\t{ SBITSTRING, 0, %s, %s },\n",
                    168:                c_tag(yp), c_class(yp));
                    169:        break;
                    170: 
                    171:     case YP_OCT:
                    172:        if (yp->yp_varexp) {
                    173:            p1 = "OCTETSTRING";
                    174:            break;
                    175:        }
                    176:        t = NULL;
                    177:        p1 = NULL;
                    178:        (void) fprintf(fptab, "\t{ SOCTETSTRING, 0, %s, %s },\n",
                    179:                c_tag(yp), c_class(yp));
                    180:        break;
                    181: 
                    182:     case YP_OID:
                    183:        if (yp->yp_varexp) {
                    184:            p1 = "OBJID";
                    185:            break;
                    186:        }
                    187:        t = NULL;
                    188:        p1 = NULL;
                    189:        (void) fprintf(fptab, "\t{ SOBJID, 0, %s, %s },\n",
                    190:                c_tag(yp), c_class(yp));
                    191:        break;
                    192: 
                    193: 
                    194:     case YP_SEQ:
                    195:     case YP_SET:
                    196:     case YP_ANY:
                    197:        if (yp->yp_varexp) {
                    198:            p1 = "ANY";
                    199:            break;
                    200:        }
                    201:        t = NULL;
                    202:        p1 = NULL;
                    203:        (void) fprintf(fptab, "\t{ SANY, 0, %s, %s },\n",
                    204:                c_tag(yp), c_class(yp));
                    205:        break;
                    206: 
                    207:     case YP_NULL:
                    208:        p1 = "T_NULL";
                    209:        t = NULL;
                    210:        break;
                    211: 
                    212:     case YP_IDEFINED:
                    213:        p1 = NULL;
                    214:        {
                    215:            /* Predefined Universal Type */
                    216:            struct univ_typ *p, *univtyp();
                    217: 
                    218:            if ((p = univtyp(yp->yp_identifier))) {
                    219:                if (p->univ_flags & UNF_EXTMOD) {
                    220:                    yp->yp_module = p->univ_mod;
                    221:                    goto do_obj;
                    222:                }
                    223:                if (f == NULL) {/* No offset type */
                    224:                    if (yp->yp_flags & YP_TAG
                    225:                        && yp->yp_flags & YP_IMPLICIT)
                    226:                        (void) fprintf(fptab, "\t{ S%s, 0, %d, %s },\n",
                    227:                                p->univ_tab,
                    228:                                yp->yp_tag->yt_value->yv_number,
                    229:                                c_flags(yp, yp->yp_tag->yt_class));
                    230:                    else
                    231:                        (void) fprintf(fptab, "\t{ S%s, 0, %d, %s },\n",
                    232:                                p->univ_tab, p->univ_id,
                    233:                                c_flags(yp, p->univ_class));
                    234:                    break;
                    235:                }
                    236:                if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT)
                    237:                    (void) fprintf(fptab, "\t{ %s, OFFSET(%s, %s), %d, %s },\n",
                    238:                            p->univ_tab, t, f,
                    239:                            yp->yp_tag->yt_value->yv_number,
                    240:                            c_flags(yp, yp->yp_tag->yt_class));
                    241:                else
                    242:                    (void) fprintf(fptab, "\t{ %s, OFFSET(%s, %s), %d, %s },\n",
                    243:                            p->univ_tab, t, f, p->univ_id,
                    244:                            c_flags(yp, p->univ_class));
                    245:                break;
                    246:            }
                    247:        }
                    248: do_obj:
                    249:        if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT)
                    250:            (void) fprintf(fptab, "\t{ IMP_OBJ, 0, %s, %s },\n", c_tag(yp), c_class(yp));
                    251:        if (yp->yp_parm) {
                    252:            ferr(1, "tenc_typ:YP_IDEFINED:yp_parm found\n");
                    253:        }
                    254:        if (yp->yp_module == NULL
                    255:            || strcmp(yp->yp_module, mymodule) == 0) {
                    256:            if (f == NULL) {    /* No offset type */
                    257:                (void) fprintf(fptab, "\t{ SOBJECT, 0, _Z%s, %s },\n",
                    258:                      proc_name(yp->yp_identifier, 0), c_class(yp));
                    259:            } else
                    260:                (void) fprintf(fptab,
                    261:                        "\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) {    /* No offset type */
                    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,
                    270:                        "\t{ EXTOBJ, OFFSET(%s, %s), _Z%s, %s },\n",
                    271:                  t, f, strp2name(yp->yp_identifier, yp->yp_module),
                    272:                        c_class(yp));
                    273: 
                    274:            (void) fprintf(fptab, "\t{ EXTMOD, %d, 0, 0 },\n",
                    275:                    gen_modref(yp->yp_module));
                    276:        }
                    277:        break;
                    278: 
                    279:     case YP_SEQLIST:
                    280:        p1 = NULL;
                    281:        /* support for -h flag */
                    282: #if 0
                    283:        if (hflag && (y = yp->yp_type) && !y->yp_next) {
                    284:            tenc_typ(y, id, yp->yp_structname);
                    285:            break;
                    286:        }
                    287: #endif
                    288:        cons_type++;
                    289:        save_ptr = en_ptr;
                    290:        if (yp->yp_varexp == NULL && type != NULL)
                    291:            ferr(1, "tenc_typ:YP_SEQLIST:NULL varexp pointer\n");
                    292:        if (type != NULL)
                    293:            (void) fprintf(fptab, "\t{ SEQ_START, OFFSET(%s, %s), %s, %s },\n",
                    294:                    t, f, c_tag(yp), c_class(yp));
                    295:        else
                    296:            (void) fprintf(fptab, "\t{ SEQ_START, 0, %s, %s },\n",
                    297:                    c_tag(yp), c_class(yp));
                    298:        if (y = yp->yp_type) {
                    299:            if (type) {
                    300:                if (yp->yp_declexp == NULL)
                    301:                    ferr(1, "tenc_typ:YP_SEQLIST:no declexp\n");
                    302:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
                    303:            } else
                    304:                yp->yp_structname = t;
                    305:            if (optfield(y)) {
                    306:                (void) fprintf(fptab,
                    307:                        "\t{ OPTL, OFFSET(%s, optionals), 0, 0 },\n",
                    308:                        yp->yp_structname);
                    309:            }
                    310:            tenc_loop(y, id, yp->yp_structname);
                    311:        }
                    312:        (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
                    313:        en_ptr = save_ptr;
                    314:        cons_type--;
                    315:        break;
                    316: 
                    317:     case YP_SETLIST:
                    318:        p1 = NULL;
                    319:        /* support for -h flag */
                    320: #if 0
                    321:        if (hflag && (y = yp->yp_type) && !y->yp_next) {
                    322:            tenc_typ(y, id, yp->yp_structname);
                    323:            break;
                    324:        }
                    325: #endif
                    326:        cons_type++;
                    327:        if (yp->yp_varexp == NULL && type != NULL)
                    328:            ferr(1, "tenc_typ:YP_SETLIST:NULL varexp pointer\n");
                    329:        if (type != NULL)
                    330:            (void) fprintf(fptab, "\t{ SET_START, OFFSET(%s, %s), %s, %s },\n",
                    331:                    t, f, c_tag(yp), c_class(yp));
                    332:        else
                    333:            (void) fprintf(fptab, "\t{ SET_START, 0, %s, %s },\n",
                    334:                    c_tag(yp), c_class(yp));
                    335:        if (y = yp->yp_type) {
                    336:            if (type) {
                    337:                if (yp->yp_declexp == NULL)
                    338:                    ferr(1, "tenc_typ:YP_SETLIST:no declexp\n");
                    339:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
                    340:            } else
                    341:                yp->yp_structname = t;
                    342:            if (optfield(y)) {
                    343:                (void) fprintf(fptab,
                    344:                        "\t{ OPTL, OFFSET(%s, optionals), 0, 0 },\n",
                    345:                        yp->yp_structname);
                    346:            }
                    347:            tenc_loop(y, id, yp->yp_structname);
                    348:        }
                    349:        (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
                    350:        en_ptr = save_ptr;
                    351:        cons_type--;
                    352:        break;
                    353: 
                    354:     case YP_SEQTYPE:
                    355:        p1 = NULL;
                    356:        cons_type++;
                    357:        save_ptr = en_ptr;
                    358:        if (type != NULL)
                    359:            (void) fprintf(fptab, "\t{ SEQOF_START, OFFSET(%s, %s), %s, %s },\n",
                    360:                    t, f, c_tag(yp), c_class(yp));
                    361:        else
                    362:            (void) fprintf(fptab, "\t{ SEQOF_START, 0, %s, %s },\n",
                    363:                    c_tag(yp), c_class(yp));
                    364:        if (y = yp->yp_type) {
                    365:            if (type) {
                    366:                if (yp->yp_declexp == NULL)
                    367:                    ferr(1, "tenc_typ:YP_SEQTYPE:no declexp\n");
                    368:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
                    369:            } else
                    370:                yp->yp_structname = t;
                    371:            tenc_loop(y, id, yp->yp_structname);
                    372:        }
                    373:        if (yp->yp_structname != NULL)
                    374:            (void) fprintf(fptab, "\t{ PE_END, OFFSET(%s, next), 0, 0 },\n",
                    375:                    yp->yp_structname);
                    376:        else
                    377:            (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
                    378:        en_ptr = save_ptr;
                    379:        cons_type--;
                    380:        break;
                    381: 
                    382:     case YP_SETTYPE:
                    383:        p1 = NULL;
                    384:        cons_type++;
                    385:        save_ptr = en_ptr;
                    386:        if (type != NULL)
                    387:            (void) fprintf(fptab, "\t{ SETOF_START, OFFSET(%s, %s), %s, %s },\n",
                    388:                    t, f, c_tag(yp), c_class(yp));
                    389:        else
                    390:            (void) fprintf(fptab, "\t{ SETOF_START, 0, %s, %s },\n",
                    391:                    c_tag(yp), c_class(yp));
                    392: 
                    393:        if (y = yp->yp_type) {
                    394:            if (type) {
                    395:                if (yp->yp_declexp == NULL)
                    396:                    ferr(1, "tenc_typ:YP_SETTYPE:no declexp\n");
                    397:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
                    398:            } else
                    399:                yp->yp_structname = t;
                    400:            tenc_loop(y, id, yp->yp_structname);
                    401:        }
                    402:        if (yp->yp_structname != NULL)
                    403:            (void) fprintf(fptab, "\t{ PE_END, OFFSET(%s, next), 0, 0 },\n",
                    404:                    yp->yp_structname);
                    405:        else
                    406:            (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
                    407:        en_ptr = save_ptr;
                    408:        cons_type--;
                    409:        break;
                    410: 
                    411:     case YP_CHOICE:
                    412:        p1 = NULL;
                    413:        /* support for -h flag */
                    414:        if (hflag && (y = yp->yp_type) && !y->yp_next) {
                    415:            tenc_typ(y, id, yp->yp_structname);
                    416:            break;
                    417:        }
                    418:        cons_type++;
                    419:        save_ptr = en_ptr;
                    420:        if (type != NULL)
                    421:            (void) fprintf(fptab, "\t{ CHOICE_START, OFFSET(%s, %s), 0, %s },\n",
                    422:                    t, f, c_class(yp));
                    423:        else
                    424:            (void) fprintf(fptab, "\t{ CHOICE_START, 0, 0, 0 },\n");
                    425:        if (y = yp->yp_type) {
                    426:            if (type) {
                    427:                if (yp->yp_declexp == NULL)
                    428:                    ferr(1, "tenc_typ:YP_CHOICE:no declexp\n");
                    429:                yp->yp_structname = my_strcat("struct ", yp->yp_declexp);
                    430:            } else
                    431:                yp->yp_structname = t;
                    432:            (void) fprintf(fptab, "\t{ SCTRL, OFFSET(%s, offset), 0, 0 },\n",
                    433:                    yp->yp_structname);
                    434:            tenc_loop(y, id, yp->yp_structname);
                    435:        }
                    436:        (void) fprintf(fptab, "\t{ PE_END, 0, 0, 0 },\n");
                    437:        en_ptr = save_ptr;
                    438:        cons_type--;
                    439:        break;
                    440: 
                    441:     default:
                    442:        ferrd(1, "tenc_typ: yp_code = %d  not implemented\n", yp->yp_code);
                    443:     }
                    444: 
                    445:     if (p1 != NULL)
                    446:        if (t != NULL)
                    447:            (void) fprintf(fptab, "\t{ %s, OFFSET(%s, %s), %s, %s },\n",
                    448:                    p1, t, f, c_tag(yp), c_class(yp));
                    449:        else
                    450:            (void) fprintf(fptab, "\t{ %s, 0, %s, %s },\n",
                    451:                    p1, c_tag(yp), c_class(yp));
                    452: }
                    453: 
                    454: static int fflags[] = {
                    455:     0, 1, 2, 2, 3, 3, 4, 5, 16, 16, 16, 17, 17, 17,
                    456: 0, -1, 6, 0, 10, 9};
                    457: 
                    458: /*
                    459:  * calculate the tag string of the given type and return it
                    460:  */
                    461: char   *
                    462: c_tag(yp)
                    463: YP      yp;
                    464: {
                    465:     static char buf[WORDSIZE];
                    466:     int     i;
                    467: 
                    468:     if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) {
                    469:        i = yp->yp_tag->yt_value->yv_number;
                    470:     } else {
                    471:        if (yp->yp_code < 0 || yp->yp_code > YP_REAL
                    472:            || yp->yp_code == YP_CHOICE)
                    473:            i = 0;
                    474:        else
                    475:            i = fflags[yp->yp_code];
                    476:        /* Choice now legal argument - to allow prte_* routines to work */
                    477:        if (i == 0 && yp->yp_code != YP_CHOICE)
                    478:            ferrd (1, "c_tag:Unknown Tag %d", yp->yp_code);
                    479:     }
                    480: 
                    481:     (void) sprintf(buf, "%d", i);
                    482: 
                    483:     return (buf);
                    484: }
                    485: 
                    486: /*
                    487:  * calculate the tag string of the explicit tag and return it
                    488:  */
                    489: char   *
                    490: ec_tag(yp)
                    491: YP      yp;
                    492: {
                    493:     static char buf[WORDSIZE];
                    494:     int     i;
                    495: 
                    496:     if (!(yp->yp_flags & YP_TAG) || yp->yp_flags & YP_IMPLICIT)
                    497:        ferr(1, "ec_tag:internal error:called with out explicit tag\n");
                    498: 
                    499:     i = yp->yp_tag->yt_value->yv_number;
                    500: 
                    501:     (void) sprintf(buf, "%d", i);
                    502: 
                    503:     return (buf);
                    504: }
                    505: 
                    506: /*
                    507:  * produce a string that represents the class/flags field for a given
                    508:  * yp entry taking the class to be that given in cl
                    509:  */
                    510: char   *
                    511: c_flags(yp, cl)
                    512: YP      yp;
                    513: int     cl;
                    514: {
                    515:     char   *p1;
                    516:     static char buf[STRSIZE];
                    517: 
                    518:     switch (yp->yp_code) {
                    519:     case YP_IDEFINED:
                    520:     case YP_CHOICE:
                    521:        if (yp->yp_flags & YP_TAG)
                    522:            break;
                    523:        if (yp->yp_flags & YP_OPTIONAL) {
                    524:            p1 = "FL_OPTIONAL";
                    525:        } else if (yp->yp_flags & YP_DEFAULT) {
                    526:            p1 = "FL_DEFAULT";
                    527:        } else
                    528:            p1 = "0";
                    529:        return (p1);
                    530: 
                    531:     default:
                    532:        break;
                    533:     }
                    534:     switch (cl) {
                    535:     case PE_CLASS_UNIV:
                    536:        p1 = "FL_UNIVERSAL";
                    537:        break;
                    538: 
                    539:     case PE_CLASS_APPL:
                    540:        p1 = "FL_APPLICATION";
                    541:        break;
                    542: 
                    543:     case PE_CLASS_PRIV:
                    544:        p1 = "FL_PRIVATE";
                    545:        break;
                    546: 
                    547:     case PE_CLASS_CONT:
                    548:        p1 = "FL_CONTEXT";
                    549:        break;
                    550: 
                    551:     default:
                    552:        ferrd(1, "c_flags: illegal class found %d\n", cl);
                    553: 
                    554:     }
                    555:     if (yp->yp_flags & YP_OPTIONAL) {
                    556:        strncpy(buf, p1, STRSIZE);
                    557:        p1 = strncat(buf, "|FL_OPTIONAL", STRSIZE);
                    558:     } else if (yp->yp_flags & YP_DEFAULT) {
                    559:        strncpy(buf, p1, STRSIZE);
                    560:        p1 = strncat(buf, "|FL_DEFAULT", STRSIZE);
                    561:     }
                    562:     return (p1);
                    563: }
                    564: /*
                    565:  * calculate a string specifying the class for the given type and
                    566:  * return it
                    567:  */
                    568: char   *
                    569: c_class(yp)
                    570: YP      yp;
                    571: {
                    572:     int     i;
                    573: 
                    574:     if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) {
                    575:        i = yp->yp_tag->yt_class;
                    576:     } else {
                    577:        i = PE_CLASS_UNIV;
                    578:     }
                    579:     return (c_flags(yp, i));
                    580: 
                    581: }
                    582: /*
                    583:  * calculate a string specifying the class for the explicit tag and
                    584:  * return it
                    585:  */
                    586: char   *
                    587: ec_class(yp)
                    588: YP      yp;
                    589: {
                    590:     int     i;
                    591:     char   *p1;
                    592:     static char buf[STRSIZE];
                    593: 
                    594:     if (!(yp->yp_flags & YP_TAG) || yp->yp_flags & YP_IMPLICIT)
                    595:        ferr(1, "ec_class:internal error:called with out explicit tag\n");
                    596:     switch (yp->yp_code) {
                    597:     case YP_IDEFINED:
                    598:     case YP_CHOICE:
                    599:        if (yp->yp_flags & YP_TAG)
                    600:            break;
                    601:        if (yp->yp_flags & YP_OPTIONAL) {
                    602:            p1 = "FL_OPTIONAL";
                    603:        } else if (yp->yp_flags & YP_DEFAULT) {
                    604:            p1 = "FL_DEFAULT";
                    605:        } else
                    606:            p1 = "0";
                    607:        return (p1);
                    608: 
                    609:     default:
                    610:        break;
                    611:     }
                    612: 
                    613:     i = yp->yp_tag->yt_class;
                    614: 
                    615:     switch (i) {
                    616:     case PE_CLASS_UNIV:
                    617:        p1 = "FL_UNIVERSAL";
                    618:        break;
                    619: 
                    620:     case PE_CLASS_APPL:
                    621:        p1 = "FL_APPLICATION";
                    622:        break;
                    623: 
                    624:     case PE_CLASS_PRIV:
                    625:        p1 = "FL_PRIVATE";
                    626:        break;
                    627: 
                    628:     case PE_CLASS_CONT:
                    629:        p1 = "FL_CONTEXT";
                    630:        break;
                    631: 
                    632:     default:
                    633:        ferrd(1, "c_class: illegal class found %d\n", i);
                    634: 
                    635:     }
                    636:     if (yp->yp_flags & YP_OPTIONAL) {
                    637:        strncpy(buf, p1, STRSIZE);
                    638:        p1 = strncat(buf, "|FL_OPTIONAL", STRSIZE);
                    639:     } else if (yp->yp_flags & YP_DEFAULT) {
                    640:        strncpy(buf, p1, STRSIZE);
                    641:        p1 = strncat(buf, "|FL_DEFAULT", STRSIZE);
                    642:     }
                    643:     return (p1);
                    644: }
                    645: 
                    646: /*
                    647:  * generate tables for encoding a contructed type
                    648:  */
                    649: tenc_loop(yp, id, type)
                    650: YP      yp;
                    651: char   *id;
                    652: char   *type;
                    653: {
                    654:     for (; yp != NULL; yp = yp->yp_next) {
                    655:        tenc_typ(yp, id, type);
                    656:     }
                    657: }
                    658: 
                    659: /*
                    660:  * Print the string and exit if argument greater than zero
                    661:  */
                    662: ferr(i, s)
                    663: int     i;
                    664: char   *s;
                    665: {
                    666:     (void) fprintf(stderr, "%s", s);
                    667:     if (i > 0)
                    668:        exit(i);
                    669: }
                    670: 
                    671: /*
                    672:  * Print the integer and exit if argument greater than zero
                    673:  */
                    674: ferrd(i, s, d)
                    675: int     i;
                    676: char   *s;
                    677: int     d;
                    678: {
                    679:     (void) fprintf(stderr, s, d);
                    680:     if (i > 0)
                    681:        exit(i);
                    682: }
                    683: 
                    684: /*
                    685:  * Print the string and exit if argument greater than zero
                    686:  */
                    687: ferrs(i, s, d)
                    688: int     i;
                    689: char   *s;
                    690: char   *d;
                    691: {
                    692:     (void) fprintf(stderr, s, d);
                    693:     if (i > 0)
                    694:        exit(i);
                    695: }
                    696: 
                    697: /*
                    698:  * return a copy of the string s minus its last character
                    699:  */
                    700: char   *
                    701: strip_last(s)
                    702: char   *s;
                    703: {
                    704:     char   *t, *r;
                    705: 
                    706:     if (s) {
                    707:        t = new_string(s);
                    708:        for (r = t; *r != '\0'; r++);
                    709:        ;
                    710:        *--r = '\0';
                    711:        return t;
                    712:     } else
                    713:        return NULL;
                    714: }
                    715: 
                    716: /*
                    717:  * add the declaration specified by the strings type and id to the
                    718:  * start of the declaration list
                    719:  */
                    720: add_list(type, id)
                    721: char   *type, *id;
                    722: {
                    723: 
                    724:     s_table *prev;
                    725: 
                    726:     if ((prev = (s_table *) malloc(sizeof(s_table))) == NULL)
                    727:        ferr(1, "add_list: Out of memory\n");
                    728:     prev->type = type;
                    729:     prev->name = id;
                    730:     prev->parent = NULL;
                    731:     prev->defined = 0;
                    732:     prev->next = head;
                    733:     head = prev;
                    734: }
                    735: 
                    736: #if 0
                    737: /*
                    738:  * return the element in the declaration list whose name field is id
                    739:  */
                    740: s_table *
                    741: lookup_list(id)
                    742: char   *id;
                    743: {
                    744:     s_table *prev;
                    745: 
                    746:     for (prev = head; prev != NULL; prev = prev->next)
                    747:        if (!strcmp(prev->name, id))
                    748:            return prev;
                    749:     return (NULL);
                    750:     /* ferrs(1, "lookup_list: the id %s is not present\n",id); */
                    751: }
                    752: #endif
                    753: 
                    754: /*
                    755:  * print the declaration list
                    756:  */
                    757: print_list()
                    758: {
                    759:     s_table *prev;
                    760: 
                    761:     for (prev = head; prev != NULL; prev = prev->next) {
                    762:        (void) printf("type is %s\n", prev->type);
                    763:        (void) printf("name is %s\n", prev->name);
                    764:        (void) printf("\n");
                    765:     }
                    766: }
                    767: 
                    768: /*
                    769:  * parse the declaration in the string s returning the type in v1 and
                    770:  * the name in v2
                    771:  */
                    772: parse_decl(s, v1, v2)
                    773: char  **s, **v1, **v2;
                    774: {
                    775:     char   *t;
                    776: 
                    777:     for (t = *s; *t != '\0' && !(isalnum(*t) || *t == '_'); t++);
                    778: 
                    779:     *s = t;
                    780:     if (*t != '\0') {
                    781:        for (; *t != '*'; t++);
                    782:        *t = '\0';
                    783:        *v1 = my_strcat(*s, "*");
                    784:        Printf(3, ("the type is %s\n", *v1));
                    785:        if (*++t == '*')
                    786:            t++;
                    787:        for (*s = t; isalnum(*t) || *t == '_'; t++);
                    788:        if (*t != '\0') {
                    789:            *t = '\0';
                    790:            t++;
                    791:        }
                    792:        *v2 = new_string(*s);   /* don't really need new_string */
                    793:        Printf(2, ("the name is %s\n", *v2));
                    794:        *s = t;
                    795:     }
                    796: }
                    797: 
                    798: /*
                    799:  * return the next identifier in the string s
                    800:  */
                    801: char   *
                    802: get_val(s)
                    803: char  **s;
                    804: {
                    805:     char   *t, *r;
                    806: 
                    807:     for (t = *s; *t != '\0' && !(isalnum(*t) || *t == '_' || *t == '.'); t++);
                    808: 
                    809:     if (*t != '\0') {
                    810:        for (*s = t; isalnum(*t) || *t == '_' || *t == '.'; t++);
                    811:        *t = '\0';
                    812:        r = *s;
                    813:        Printf(3, ("arg is |%s|\n", r));
                    814:        *s = ++t;
                    815:        return r;
                    816:     } else
                    817:        return NULL;
                    818: }
                    819: 
                    820: #if 0
                    821: /*
                    822:  * add the definition contained in s to the start of the declaration
                    823:  * list
                    824:  */
                    825: s_table *
                    826: proc_def(s)
                    827: char   *s;
                    828: {
                    829:     char   *s1, *s2, *s3;
                    830:     s_table *ptr1, *ptr2;
                    831: 
                    832:     s1 = get_val(&s);
                    833:     ptr1 = lookup_list(s1);
                    834:     if (!ptr1->defined) {
                    835:        s2 = get_val(&s);
                    836:        ptr2 = lookup_list(s2);
                    837:        ptr1->parent = ptr2;
                    838:        s3 = get_val(&s);
                    839:        ptr1->field = s3;
                    840:        ptr1->defined++;
                    841:     }
                    842:     return ptr1;
                    843: }
                    844: #endif
                    845: 
                    846: /*
                    847:  * return the next component (sequence of characters up to the next
                    848:  * ';' or '\0') of the string s
                    849:  */
                    850: char   *
                    851: get_comp(s)
                    852: char  **s;
                    853: {
                    854:     char   *t, *r;
                    855: 
                    856:     for (t = *s; *t != '\0' && !(isalnum(*t) || *t == '_' || *t == ';'); t++);
                    857: 
                    858:     if (*t != '\0') {
                    859:        for (*s = t; *t != '\0' && *t != ';'; t++);
                    860:        *t = '\0';
                    861:        r = *s;
                    862:        Printf(3, ("component is |%s|\n", r));
                    863:        *s = ++t;
                    864:        return r;
                    865:     } else
                    866:        return NULL;
                    867: }
                    868: 
                    869: #if 0
                    870: /*
                    871:  * work out what the offset for the type yp should be and return a
                    872:  * pointer to the element in the declaration list which can be used
                    873:  * to calculate the offset
                    874:  */
                    875: s_table *
                    876: get_offset(yp, level)
                    877: YP      yp;
                    878: int     level;
                    879: {
                    880:     char   *s, *s1;
                    881:     s_table *ptr1;
                    882: 
                    883:     switch (yp->yp_code) {
                    884: 
                    885:     case YP_UNDF:
                    886:        ferr(1, "get_offset: Undefined type\n");
                    887:        break;
                    888: 
                    889:     case YP_BOOL:
                    890:     case YP_INT:
                    891:     case YP_INTLIST:
                    892:     case YP_NULL:
                    893:        if (yp->yp_varexp) {
                    894:            s = new_string(yp->yp_intexp);
                    895:            s1 = get_val(&s);
                    896:            ptr1 = lookup_list(s1);
                    897:            return ptr1;
                    898:        } else {
                    899:            ferr(0, "get_offset: No intexp\n");
                    900:            return NULL;
                    901:        }
                    902:        break;
                    903: 
                    904:     case YP_BIT:
                    905:     case YP_BITLIST:
                    906:        if (yp->yp_direction & YP_DECODER)
                    907:            if (yp->yp_action2) {
                    908:                s = new_string(yp->yp_action2);
                    909:                s1 = get_val(&s);
                    910:                if (strcmp(s1, "if"))
                    911:                    ferrs(1, "get_offset: What to do, action2 = %s\n", yp->yp_action2);
                    912:                else {
                    913:                    s1 = get_val(&s);
                    914:                    ptr1 = lookup_list(s1);
                    915:                    return ptr1;
                    916:                }
                    917:            } else
                    918:                return NULL;
                    919:        else if (yp->yp_varexp) {
                    920:            s = new_string(yp->yp_varexp);
                    921:            s1 = get_val(&s);
                    922:            s1 = get_val(&s);
                    923:            ptr1 = lookup_list(s1);
                    924:            return ptr1;
                    925:        } else {
                    926:            ferr(0, "get_offset: No strexp (BIT)\n");
                    927:            return NULL;
                    928:        }
                    929:        break;
                    930:     case YP_OCT:
                    931:     case YP_OID:
                    932:     case YP_SEQ:
                    933:     case YP_SET:
                    934:     case YP_ANY:
                    935:        if (yp->yp_varexp) {
                    936:            s = new_string(yp->yp_varexp);
                    937:            s1 = get_val(&s);
                    938:            ptr1 = lookup_list(s1);
                    939:            return ptr1;
                    940:        } else {
                    941:            ferr(0, "get_offset: No strexp\n");
                    942:            return NULL;
                    943:        }
                    944:        break;
                    945: 
                    946:     case YP_IDEFINED:
                    947:        if (yp->yp_parm) {
                    948:            s = new_string(yp->yp_parm);
                    949:            s1 = get_val(&s);
                    950:            ptr1 = lookup_list(s1);
                    951:            return ptr1;
                    952:        } else {
                    953:            ferr(0, "get_offset: No parm\n");
                    954:            return NULL;
                    955:        }
                    956:        break;
                    957: 
                    958:     case YP_SEQLIST:
                    959:     case YP_SETLIST:
                    960:     case YP_CHOICE:
                    961:        if (yp->yp_action1) {
                    962:            s = get_string(yp->yp_action1, yp->yp_direction);
                    963:            while ((s1 = get_comp(&s)) != NULL)
                    964:                (void) proc_def(s1);
                    965:        }
                    966:        if (yp->yp_type == NULL) {
                    967:            if (level > 0)
                    968:                ferr(0, "get_offset: There exists an embeded empty SEQUENCE/SET/CHOICE\n");
                    969:            return (yp->yp_direction & YP_ENCODER ? en_ptr : ptr);
                    970:        }
                    971:        if ((ptr1 = get_offset(yp->yp_type, level + 1)) != NULL)
                    972:            if (ptr1->parent != NULL && level > 0)
                    973:                return ptr1->parent;
                    974:            else
                    975:                return ptr1;
                    976:        else {
                    977:            ferr(0, "get_offset: returning NULL (SEQLIST/SETLIST/CHOICE)\n");
                    978:            return NULL;
                    979:        }
                    980:        break;
                    981: 
                    982:     case YP_SEQTYPE:
                    983:     case YP_SETTYPE:
                    984:        if (yp->yp_action3) {
                    985:            s = get_string(yp->yp_action3, yp->yp_direction);
                    986:            while ((s1 = get_comp(&s)) != NULL)
                    987:                (void) proc_def(s1);
                    988:        }
                    989:        if ((ptr1 = get_offset(yp->yp_type, level + 1)) != NULL)
                    990:            if (ptr1->parent != NULL && level > 0)
                    991:                return ptr1->parent;
                    992:            else
                    993:                return ptr1;
                    994:        else {
                    995:            ferr(0, "get_offset: returning NULL (SEQTYPE/SETTYPE)\n");
                    996:            return NULL;
                    997:        }
                    998:        break;
                    999: 
                   1000:     default:
                   1001:        ferrd(1, "get_offset: yp_code = %d  not implemented\n", yp->yp_code);
                   1002:        return NULL;
                   1003:        break;
                   1004:     }
                   1005: }
                   1006: #endif
                   1007: 
                   1008: /*
                   1009:  * return a copy of that part of the string s which may contain
                   1010:  * definitions for the variables generated by posy
                   1011:  */
                   1012: char   *
                   1013: get_string(s, direction)
                   1014: char   *s;
                   1015: int     direction;
                   1016: {
                   1017:     char   *t, *t1;
                   1018: 
                   1019:     if (direction & YP_ENCODER)
                   1020:        return new_string(s);
                   1021:     if (direction & YP_DECODER) {
                   1022:        t = new_string(s);
                   1023:        for (t1 = t; !(isalnum(*t1) || *t1 == '_'); t1++);
                   1024:        if (*t1 == 'i' && *++t1 == 'f' && *++t1 == ' ') {       /* MALLOC code */
                   1025:            for (; *t1 != '}'; t1++)    /* skip MALLOC code */
                   1026:                ;
                   1027:            t1++;
                   1028:            Printf(4, ("returning the string %s\n", t1));
                   1029:            return t1;
                   1030:        } else
                   1031:            return t;
                   1032:     }
                   1033: }
                   1034: 
                   1035: #if 0
                   1036: c_type(yp)
                   1037: YP      yp;
                   1038: {
                   1039:     switch (yp->yp_code) {
                   1040: 
                   1041:     case YP_IDEFINED:
                   1042:        return T_OBJ;
                   1043:        break;
                   1044: 
                   1045: 
                   1046:     default:
                   1047:        return T_PRIM;
                   1048:        break;
                   1049:     }
                   1050: }
                   1051: 
                   1052: #endif
                   1053: /*
                   1054:  * Determine wether this list contains any items that will generate
                   1055:  * an optional field. If so return non zero
                   1056:  */
                   1057: optfield(yp)
                   1058: YP      yp;
                   1059: {
                   1060:     for (; yp; yp = yp->yp_next) {
                   1061:        if (yp->yp_flags & YP_OPTIONAL)
                   1062:            switch (yp->yp_code) {
                   1063:            case YP_BOOL:
                   1064:            case YP_INT:
                   1065:            case YP_INTLIST:
                   1066:            case YP_ENUMLIST:
                   1067:            case YP_NULL:
                   1068:                return (1);
                   1069:            }
                   1070:     }
                   1071:     return (0);
                   1072: }
                   1073: 
                   1074: gen_dflts(yp, type)
                   1075: YP      yp;
                   1076: char   *type;
                   1077: {
                   1078:     YP      y;
                   1079: 
                   1080:     if (yp == NULL)
                   1081:        return;
                   1082:     switch (yp->yp_code) {
                   1083:     case YP_IDEFINED:
                   1084: #if 0
                   1085:        if (yp->yp_module == NULL
                   1086:            || strcmp(yp->yp_module, mymodule) == 0)
                   1087:            break;
                   1088:        if (lookup_list(yp->yp_module))
                   1089:            break;              /* already done */
                   1090:        /* Got an external reference */
                   1091:        (void) fprintf(fptab, "#include \"%s%s\"\n", yp->yp_module, HFILE2);
                   1092:        add_list("module", yp->yp_module);
                   1093: #endif
                   1094:        break;
                   1095: 
                   1096:     case YP_CHOICE:
                   1097:     case YP_SEQTYPE:
                   1098:     case YP_SETTYPE:
                   1099:     case YP_SEQLIST:
                   1100:     case YP_SETLIST:
                   1101:        for (y = yp->yp_type; y != NULL; y = y->yp_next) {
                   1102:            gen_dflts(y, type);
                   1103:        }
                   1104:        break;
                   1105: 
                   1106:     default:
                   1107:        break;
                   1108:     }
                   1109:     /* Output definitions for default entries */
                   1110:     if (yp->yp_flags & YP_DEFAULT)
                   1111:        defdflt(yp, type);
                   1112: }
                   1113: /*
                   1114:  * Compute the concatenation into a temporary buffer of two strings
                   1115:  * after having run notid on them first
                   1116:  */
                   1117: char   *
                   1118: strp2name(s1, s2)
                   1119: char   *s1, *s2;
                   1120: {
                   1121:     char   *p;
                   1122:     static char buf[STRSIZE * 2 + 5];
                   1123: 
                   1124:     if (strlen(s1) > STRSIZE || strlen(s2) > STRSIZE)
                   1125:        ferr(1, "strp2name:string to big\n");
                   1126:     strcpy(buf, p = notidtoid(s1));
                   1127:     free(p);
                   1128:     strcat(buf, p = notidtoid(s2));
                   1129:     free(p);
                   1130: 
                   1131:     return (buf);
                   1132: }
                   1133: 
                   1134: /*
                   1135:  * Output the definitions for default entries and initialise the yp's
                   1136:  * to have pointers which reference these definitions for use by
                   1137:  * gdflt routine.
                   1138:  */
                   1139: defdflt(yp, name)
                   1140: YP      yp;
                   1141: char   *name;
                   1142: {
                   1143:     YV      yv;
                   1144:     YV      yv1;
                   1145:     SY      sy;
                   1146:     YP      yp1;
                   1147:     int     size, i;
                   1148:     char   *str;
                   1149:     char   *label;
                   1150:     struct univ_typ    *p;
                   1151:     int                code;
                   1152: 
                   1153:     if ((yp->yp_flags & YP_DEFAULT) == 0)
                   1154:        ferrd(1, "defdflt:called with out a default code = %d\n", yp->yp_code);
                   1155:     yv = yp->yp_default;
                   1156: 
                   1157:     yp1 = yp;
                   1158: 
                   1159:     /* Find the bottom definition */
                   1160:     code = yp1->yp_code;
                   1161:     while (code == YP_IDEFINED) {
                   1162:        if ((sy = syfind(yp1->yp_identifier)) == NULL) {
                   1163:            if ((p = univtyp(yp1->yp_identifier)) == NULL
                   1164:               || p->univ_type <= YP_UNDF)
                   1165:                ferrs(1,
                   1166:                    "defdflt:IDEFINED:cannot find definition of symbol %s\n",
                   1167:                    yp1->yp_identifier);
                   1168:            code = p->univ_type;
                   1169:            break;
                   1170:                
                   1171:        }
                   1172:        yp1 = sy->sy_type;
                   1173:        code = yp1->yp_code;
                   1174:     }
                   1175: 
                   1176:     switch (code) {
                   1177:     case YP_BOOL:
                   1178:     case YP_INT:
                   1179:     case YP_INTLIST:
                   1180:     case YP_ENUMLIST:
                   1181:        switch (yv->yv_code) {
                   1182:        case YV_NUMBER:
                   1183:        case YV_BOOL:
                   1184:            /* None needed */
                   1185:            break;
                   1186: 
                   1187:        case YV_IDEFINED:
                   1188:            if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) {
                   1189:                ferrs(1, "defdflt:BOOL/INT:cannot find definition of %s\n",
                   1190:                      yv->yv_identifier);
                   1191:            }
                   1192:            /* None Needed */
                   1193:            break;
                   1194: 
                   1195:        default:
                   1196:            ferrd(1, "defdflt:INT/BOOL:unimplemented value code = %d\n",
                   1197:                  yv->yv_code);
                   1198:        }
                   1199:        break;
                   1200: 
                   1201:     case YP_REAL:
                   1202:        switch (yv->yv_code) {
                   1203:        case YV_REAL:
                   1204:             yv1 = yv;
                   1205:             goto dumpdef3;
                   1206: 
                   1207:        case YV_IDEFINED:
                   1208:            if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) {
                   1209:                ferrs(1, "defdflt:REAL:cannot find definition of %s\n",
                   1210:                      yv->yv_identifier);
                   1211:            }
                   1212:            goto dumpdef3;
                   1213:            break;
                   1214: 
                   1215:        default:
                   1216:            ferrd(1, "defdflt:REAL:unimplemented value code = %d\n",
                   1217:                  yv->yv_code);
                   1218:        }
                   1219:        break;
                   1220: 
                   1221:     case YP_BIT:
                   1222:     case YP_BITLIST:
                   1223:        switch (yv->yv_code) {
                   1224:            /*
                   1225:             * This is an illegal value for a bit string ! - BUT ACSE
                   1226:             * uses it !
                   1227:             */
                   1228:            /* gdflt also patched to support it */
                   1229:        case YV_IDEFINED:
                   1230:            ferrs(0,
                   1231:                  "warning:bitstring default specified illegally with identifier %s\n",
                   1232:                  yv->yv_identifier);
                   1233:            if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) {
                   1234:                ferrs(1, "defdflt:BIT:cannot find definition of %s\n",
                   1235:                      yv->yv_identifier);
                   1236:            }
                   1237:            /* doesn't work fix posy-yacc.y */
                   1238:            size = numtobstr(yv1, &str);
                   1239:            goto dumpdef1;
                   1240: 
                   1241:        case YV_NUMBER:
                   1242:            /* doesn't work fix posy-yacc.y */
                   1243:            size = numtobstr(yv, &str);
                   1244:            goto dumpdef1;
                   1245: 
                   1246:        case YV_VALIST:
                   1247:            if ((size = valisttobs(yp1, yv, &str)) < 0) {
                   1248:                ferrs(1, "defdflt:bad default value for bistring %s\n",
                   1249:                      yp->yp_flags & YP_ID ? yp->yp_identifier : "");
                   1250:            }
                   1251:            goto dumpdef1;
                   1252: 
                   1253:        default:
                   1254:            /* Could be a syntax error */
                   1255:            ferrd(1, "defdflt:BIT:illegal value code = %d\n", yv->yv_code);
                   1256:        }
                   1257:        break;
                   1258: 
                   1259:     case YP_IDEFINED:
                   1260:        ferrs(1, "defdflt:IDEFINED:internal error on symbol %s\n",
                   1261:              yp1->yp_identifier);
                   1262:        break;
                   1263: 
                   1264:     case YP_OCT:
                   1265:        switch (yv->yv_code) {
                   1266:        case YV_NUMBER:
                   1267:            /* doesn't work fix posy-yacc.y */
                   1268:            size = numtobstr(yv, &str);
                   1269:            goto dumpdef2;
                   1270: 
                   1271:        case YV_STRING:
                   1272:            str = yv->yv_string;
                   1273:            size = strlen(str);
                   1274:            goto dumpdef2;
                   1275: 
                   1276:        default:
                   1277:            /* Could be a syntax error */
                   1278:            ferrd(1, "defdflt:OCT:illegal value code = %d\n", yv->yv_code);
                   1279:        }
                   1280:        break;
                   1281: 
                   1282:     case YP_NULL:
                   1283:     case YP_SEQ:
                   1284:     case YP_SEQTYPE:
                   1285:     case YP_SEQLIST:
                   1286:     case YP_SET:
                   1287:     case YP_SETTYPE:
                   1288:     case YP_SETLIST:
                   1289:     case YP_CHOICE:
                   1290:     case YP_ANY:
                   1291:     case YP_OID:
                   1292:        /* None yet */
                   1293:        break;
                   1294: 
                   1295:     default:
                   1296:        ferrd(1, "defdflt:unknown type %d\n", code);
                   1297:     }
                   1298: 
                   1299:     return;
                   1300: 
                   1301: dumpdef1:      /* Bitstrings */
                   1302:     label = genlabel(name, yp);
                   1303:     yp->yp_action0 = label;
                   1304:     yp->yp_act0_lineno = size;
                   1305:     i = (size + NBPC - 1) / NBPC;
                   1306:     (void) fprintf(fptab, "\nstatic char %s[] = ", label);
                   1307:     if (printable(str, i))
                   1308:        prstr(fptab, str, i);
                   1309:     else
                   1310:        prhstr(fptab, str, i);
                   1311:     (void) fprintf(fptab, ";\n");
                   1312:     return;
                   1313: 
                   1314: dumpdef2:      /* Octet strings (and aliases) */
                   1315:     label = genlabel(name, yp);
                   1316:     yp->yp_action0 = label;
                   1317:     yp->yp_act0_lineno = size;
                   1318:     (void) fprintf(fptab, "\nstatic char %s[] = ", label);
                   1319:     if (printable(str, size))
                   1320:        prstr(fptab, str, size);
                   1321:     else
                   1322:        prhstr(fptab, str, size);
                   1323:     (void) fprintf(fptab, ";\n");
                   1324:     return;
                   1325: 
                   1326: dumpdef3:      /* Reals */
                   1327:     label = genlabel(name, yp);
                   1328:     yp->yp_action0 = label;
                   1329:     (void) fprintf(fptab, "\nstatic double %s = %f;\n", label, yv1->yv_real);
                   1330:     return;
                   1331: 
                   1332: }
                   1333: /*
                   1334:  * generate the default entry for encoding/decoding fields. This
                   1335:  * should contain the default value which the encoder will know means
                   1336:  * default encoding
                   1337:  */
                   1338: gdflt(yp, which)
                   1339: YP      yp;
                   1340: int     which;                 /* Which type of entries to generate
                   1341:                                 * G_ENC encode G_DEC decode */
                   1342: {
                   1343:     YV      yv;
                   1344:     YV      yv1;
                   1345:     SY      sy;
                   1346:     YP      yp1;
                   1347:     int     size;
                   1348:     char   *str;
                   1349: 
                   1350:     char   *ndflt;
                   1351:     struct univ_typ     *p;
                   1352:     int         code;
                   1353: 
                   1354: 
                   1355:     if (which == G_ENC)
                   1356:        ndflt = "DFLT_F";
                   1357:     else
                   1358:        ndflt = "DFLT_B";
                   1359: 
                   1360:     if ((yp->yp_flags & YP_DEFAULT) == 0)
                   1361:        ferrd(1, "gdflt:called with out a default code = %d\n", yp->yp_code);
                   1362:     yv = yp->yp_default;
                   1363: 
                   1364:     yp1 = yp;
                   1365: 
                   1366:     /* Find the bottom definition */
                   1367:     code = yp1->yp_code;
                   1368:     while (code == YP_IDEFINED) {
                   1369:        if ((sy = syfind(yp1->yp_identifier)) == NULL) {
                   1370:              if ((p = univtyp(yp1->yp_identifier)) == NULL
                   1371:                || p->univ_type <= YP_UNDF)
                   1372:                    ferrs(1,
                   1373:                        "gdflt:IDEFINED:cannot find definition of symbol %s\n",
                   1374:                        yp1->yp_identifier);
                   1375:             code = p->univ_type;
                   1376:             break;
                   1377: 
                   1378:        }
                   1379:        yp1 = sy->sy_type;
                   1380:        code = yp1->yp_code;
                   1381:     }
                   1382: 
                   1383:     switch (code) {
                   1384:     case YP_BOOL:
                   1385:     case YP_INT:
                   1386:     case YP_INTLIST:
                   1387:     case YP_ENUMLIST:
                   1388:        switch (yv->yv_code) {
                   1389:        case YV_NUMBER:
                   1390:        case YV_BOOL:
                   1391:            (void) fprintf(fptab, "\t{ %s,      %d,     0,      0 },\n", ndflt,
                   1392:                    yp->yp_default->yv_number);
                   1393:            break;
                   1394: 
                   1395:        case YV_IDEFINED:
                   1396:            if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) {
                   1397:                ferrs(1, "gdflt:BOOL/INT:cannot find definition of %s\n",
                   1398:                      yv->yv_identifier);
                   1399:            }
                   1400:            (void) fprintf(fptab, "\t{ %s,      %d,     0,      0 },\n", ndflt,
                   1401:                    yv1->yv_number);
                   1402:            break;
                   1403: 
                   1404:        default:
                   1405:            ferrd(1, "gdflt:INT/BOOL:unimplemented value code = %d\n",
                   1406:                  yv->yv_code);
                   1407:        }
                   1408:        break;
                   1409: 
                   1410:     case YP_BIT:
                   1411:     case YP_BITLIST:
                   1412:        switch (yv->yv_code) {
                   1413: #ifdef ILLEGAL_DEFAULTS
                   1414:        case YV_IDEFINED:       /* supporting illegal default
                   1415:                                 * specification */
                   1416: #endif
                   1417:        case YV_NUMBER:
                   1418:        case YV_VALIST:
                   1419:            (void) fprintf(fptab, "\t{ %s,      %d,     %d,     0 },\n", ndflt,
                   1420:                    yp->yp_act0_lineno, addptr(yp->yp_action0));
                   1421:            break;
                   1422: 
                   1423:        default:
                   1424:            /* Could be a syntax error */
                   1425:            ferrd(1, "gdflt:BIT:illegal value code = %d\n", yv->yv_code);
                   1426:        }
                   1427:        break;
                   1428: 
                   1429:     case YP_IDEFINED:
                   1430:        ferrs(1, "gdflt:IDEFINED:internal error on symbol %s\n",
                   1431:              yp1->yp_identifier);
                   1432:        break;
                   1433: 
                   1434:     case YP_REAL:
                   1435:        switch (yv->yv_code) {
                   1436: #ifdef ILLEGAL_DEFAULTS
                   1437:        case YV_IDEFINED:       /* Illegal according to ASN.1 but we can do it
                   1438:                                 * so why not support it
                   1439:                                 */
                   1440: #endif
                   1441:        case YV_REAL:
                   1442:            (void) fprintf(fptab, "\t{ %s,      0,      %d,     0 },\n", ndflt,
                   1443:                    addptr(concat("&", yp->yp_action0)));
                   1444:            break;
                   1445: 
                   1446:        default:
                   1447:            /* Could be a syntax error */
                   1448:            ferrd(1, "gdflt:REAL:illegal value code = %d\n", yv->yv_code);
                   1449:        }
                   1450:        break;
                   1451: 
                   1452:     case YP_OCT:
                   1453:        switch (yv->yv_code) {
                   1454:        case YV_NUMBER:
                   1455:        case YV_STRING:
                   1456:            (void) fprintf(fptab, "\t{ %s,      %d,     %d,     0 },\n", ndflt,
                   1457:                    yp->yp_act0_lineno, addptr(yp->yp_action0));
                   1458:            break;
                   1459: 
                   1460:        default:
                   1461:            /* Could be a syntax error */
                   1462:            ferrd(1, "gdflt:OCT:illegal value code = %d\n", yv->yv_code);
                   1463:        }
                   1464:        break;
                   1465: 
                   1466:     case YP_NULL:
                   1467:     case YP_SEQ:
                   1468:     case YP_SEQTYPE:
                   1469:     case YP_SEQLIST:
                   1470:     case YP_SET:
                   1471:     case YP_SETTYPE:
                   1472:     case YP_SETLIST:
                   1473:     case YP_CHOICE:
                   1474:     case YP_ANY:
                   1475:     case YP_OID:
                   1476:        (void) fprintf(fptab, "\t{ %s,  0,      0,      0 },\n", ndflt);
                   1477:        break;
                   1478: 
                   1479:     default:
                   1480:        ferrd(1, "gdflt:unknown type %d\n", yp->yp_code);
                   1481:     }
                   1482: 
                   1483: }
                   1484: /*
                   1485:  * Calculate the value associated with the given identifier id by
                   1486:  * looking at the value definitions associated with type definition
                   1487:  * yp. Returns the value definition if found or NULL if not.
                   1488:  */
                   1489: YV
                   1490: calc_yv(yp, id)
                   1491: YP      yp;
                   1492: char   *id;
                   1493: {
                   1494:     YV      yv;
                   1495: 
                   1496:     for (yv = yp->yp_value; yv != NULL; yv = yv->yv_next) {
                   1497:        if (yv->yv_flags & YV_NAMED && strcmp(yv->yv_named, id) == 0)
                   1498:            return (yv);
                   1499:     }
                   1500: 
                   1501:     return (NULL);
                   1502: }
                   1503: 
                   1504: /*
                   1505:  * ******* This does not work. posy needs to be fixed for case of
                   1506:  * '01'b ***** Turn a Literal number value in yv into a bistring
                   1507:  * initialisation. Return the length of the bit string or less than
                   1508:  * zero on error. Set the (char *) pointer, whose address is in
                   1509:  * ppstr, to point to a string containing the a reference to a
                   1510:  * character array which contains the bits.
                   1511:  */
                   1512: 
                   1513: numtobstr(yv, ppstr)
                   1514: YV      yv;
                   1515: char  **ppstr;
                   1516: {
                   1517: 
                   1518:     int     ibits, lastb, i;
                   1519:     char   *buf;
                   1520: 
                   1521:     buf = malloc(NBPI / NBPC + 1);
                   1522:     bzero(buf, NBPI / NBPC + 1);
                   1523:     lastb = -1;
                   1524:     ibits = yv->yv_number;
                   1525:     for (i = 0; i < NBPI; i++) {
                   1526:        if ((1 << i) & ibits) {
                   1527:            buf[i / NBPC] |= 1 << (NBPC - 1 - (i % NBPC));
                   1528:            lastb = i;
                   1529:        }
                   1530:     }
                   1531: 
                   1532:     *ppstr = buf;
                   1533:     return (lastb + 1);
                   1534: }
                   1535: #define ROUNDUP                10
                   1536: /*
                   1537:  * Take a list of Values (YV_VALIST) which should contain a list of
                   1538:  * bits and convert them into a bitstring initialisation. As in
                   1539:  * numtobstr return the size of the bit string or a negative number
                   1540:  * if there is an error. Put a reference to a character array which
                   1541:  * contains the definition of the bits in the character pointer whose
                   1542:  * address is in ppstr. yp is the definition of the type which
                   1543:  * contains the names of all the defined bits.
                   1544:  */
                   1545: valisttobs(yp, yv, ppstr)
                   1546: YP      yp;
                   1547: YV      yv;
                   1548: char  **ppstr;
                   1549: {
                   1550: 
                   1551:     YV      yv1, yv2;
                   1552:     int     lastb, val, nsize, size;
                   1553:     char   *buf;
                   1554: 
                   1555:     lastb = -1;
                   1556:     size = ROUNDUP;
                   1557:     if ((buf = malloc(size)) == NULL) {
                   1558:        ferrd(1, "valisttobs:malloc:failed on %d\n", size);
                   1559:     }
                   1560:     bzero(buf, size);
                   1561:     for (yv1 = yv->yv_idlist; yv1 != NULL; yv1 = yv1->yv_next) {
                   1562:        if ((yv2 = calc_yv(yp, yv1->yv_identifier)) == NULL) {
                   1563:            return (-1);
                   1564:        }
                   1565:        val = yv2->yv_number;
                   1566:        /* Bug here probably */
                   1567:        if (size < val / NBPC) {
                   1568:            nsize = val / NBPC + ROUNDUP;
                   1569:            if ((buf = realloc(buf, nsize)) == NULL) {
                   1570:                ferrd(1, "valisttobs:realloc:failed on %d\n", nsize);
                   1571:            }
                   1572:            bzero(buf + size, nsize - size);
                   1573:            size = nsize;
                   1574:        }
                   1575:        buf[val / NBPC] |= 1 << (NBPC - 1 - (val % NBPC));
                   1576:        if (val > lastb)
                   1577:            lastb = val;
                   1578:     }
                   1579:     *ppstr = buf;
                   1580:     return (lastb + 1);
                   1581: }
                   1582: /*
                   1583:  * Print the string out in a format acceptable as a quoted string in
                   1584:  * a C program including the quotes. Using \ escapes for unprintable
                   1585:  * characters
                   1586:  */
                   1587: prstr(fp, str, len)
                   1588: FILE   *fp;
                   1589: char   *str;
                   1590: int     len;
                   1591: {
                   1592:     (void) fputc('"', fp);
                   1593:     while (len-- > 0) {
                   1594:        if (isprint(*str & 0xff)) {
                   1595:            (void) fputc(*str & 0xff, fptab);
                   1596:            str++;
                   1597:            continue;
                   1598:        }
                   1599:        (void) fprintf(fptab, "\\%0o", *str);
                   1600:     }
                   1601:     (void) fputc('"', fp);
                   1602: #define MAXPLINE       16
                   1603: }
                   1604: /*
                   1605:  * output a initialisation for a character array as unsigned hex
                   1606:  * numbers
                   1607:  */
                   1608: prhstr(fptab, str, len)
                   1609: FILE   *fptab;
                   1610: char   *str;
                   1611: int     len;
                   1612: {
                   1613:     int     npline;            /* number on this line */
                   1614: 
                   1615:     (void) fprintf(fptab, "{\n");
                   1616:     npline = 0;
                   1617:     while (len > 0) {
                   1618:        if (npline >= MAXPLINE) {
                   1619:            (void) fputc('\n', fptab);
                   1620:            npline = 0;
                   1621:        }
                   1622:        npline++;
                   1623:        (void) fprintf(fptab, " 0x%02x,", *str++ & 0xff);
                   1624:        len--;
                   1625:     }
                   1626:     (void) fprintf(fptab, "}");
                   1627: }
                   1628: /*
                   1629:  * determine if the string is printable i.e. only sensible to be read
                   1630:  * as a character string. 1 (true) if it is 0, if it isn't
                   1631:  */
                   1632: printable(str, i)
                   1633: char   *str;
                   1634: int     i;
                   1635: {
                   1636:     while (i-- > 0) {
                   1637:        if (!isprint(*str & 0xff))
                   1638:            return (0);         /* look for the first non printable
                   1639:                                 * character */
                   1640:     }
                   1641:     return (1);
                   1642: }
                   1643: /*
                   1644:  * generate a unique identifier  using the name given and the name if
                   1645:  * present in yp. Return a pointer to it in a space malloc'ed out
                   1646:  */
                   1647: char   *
                   1648: genlabel(name, yp)
                   1649: char   *name;
                   1650: YP      yp;
                   1651: {
                   1652:     char    buf[MAXNAME];
                   1653:     static int cnt;
                   1654:     char   *p1, *p2;
                   1655: 
                   1656:     p1 = notidtoid(name);
                   1657:     if (yp->yp_flags & YP_ID) {
                   1658:        p2 = notidtoid(yp->yp_id);
                   1659:        (void) sprintf(buf, "L%s_%s_%d", p1, p2, cnt++);
                   1660:        free(p2);
                   1661:     } else
                   1662:        (void) sprintf(buf, "L%s_X_%d", p1, cnt++);
                   1663:     free(p1);
                   1664: 
                   1665:     return (my_new_str(buf));
                   1666: }
                   1667: /*
                   1668:  * generate a ptr table reference for the given module table entry
                   1669:  */
                   1670: gen_modref(mod)
                   1671: char   *mod;
                   1672: {
                   1673:     char       buf[BUFSIZ];
                   1674:     char       *p1;
                   1675:     int                ind;
                   1676: 
                   1677:     p1 = notidtoid(mod);
                   1678:     (void) sprintf(buf, "&%s%s%s", PREFIX, p1, MODTYP_SUFFIX);
                   1679:     ind = addptr(buf);
                   1680:     free(p1);
                   1681: 
                   1682:     return (ind);
                   1683: }

unix.superglobalmegacorp.com

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