Annotation of 43BSDReno/contrib/isode-beta/pepy/pepy_undo.c, revision 1.1.1.1

1.1       root        1: /* pepy_undo.c - PE parser (yacc-based) building routines */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/pepy/RCS/pepy_undo.c,v 7.0 89/11/23 22:11:55 mrose Rel $";
                      5: #endif
                      6: 
                      7: /*
                      8:  * $Header: /f/osi/pepy/RCS/pepy_undo.c,v 7.0 89/11/23 22:11:55 mrose Rel $
                      9:  *
                     10:  *
                     11:  * $Log:       pepy_undo.c,v $
                     12:  * Revision 7.0  89/11/23  22:11:55  mrose
                     13:  * Release 6.0
                     14:  * 
                     15:  */
                     16: 
                     17: /*
                     18:  *                               NOTICE
                     19:  *
                     20:  *    Acquisition, use, and distribution of this module and related
                     21:  *    materials are subject to the restrictions of a license agreement.
                     22:  *    Consult the Preface in the User's Manual for the full terms of
                     23:  *    this agreement.
                     24:  *
                     25:  */
                     26: 
                     27: #include <stdio.h>
                     28: #include <ctype.h>
                     29: #include "pepy.h"
                     30: 
                     31: extern struct tuple tuples[];
                     32: extern int     rflag, hflag;
                     33: 
                     34: char   *gensym (), *modsym ();
                     35: 
                     36: YP     lookup_type (), lookup_binding ();
                     37: YT     lookup_tag ();
                     38: char   *add_point ();
                     39: 
                     40: /*  */
                     41: 
                     42: undo_type (yp, level, id, arg, Vflag)
                     43: register YP    yp;
                     44: register int   level;
                     45: register char  *id,
                     46:               *arg;
                     47: int    Vflag;
                     48: {
                     49:     register int    i,
                     50:                    j;
                     51:     register char  *narg;
                     52:     register struct tuple *t;
                     53:     register YP            y;
                     54:     register YV            yv;
                     55: 
                     56:     if (yp -> yp_flags & YP_COMPONENTS) {
                     57:        yyerror_aux ("oops, I shouldn't be here!");
                     58:         print_type (yp, 0);
                     59:         return;
                     60:     }
                     61: 
                     62:     if (level == 1) {
                     63:        printf ("(pe, explicit, len, buffer, parm)\n");
                     64:        printf ("%sPE\tpe;\nint\texplicit;\n",
                     65:                yp -> yp_code != YP_ANY
                     66:                    && yp -> yp_code != YP_NULL
                     67:                    && (yp -> yp_code != YP_CHOICE
                     68:                        || (yp -> yp_flags & YP_CONTROLLED))
                     69:                ? "register " : "");
                     70:        printf ("integer    *len;\nchar  **buffer;\n%s parm;\n{\n",
                     71:                yp -> yp_param_type ? yp -> yp_param_type : "PEPYPARM");
                     72: 
                     73:        if (yp -> yp_action0) {
                     74:            if (!Pflag && *sysin)
                     75:                printf ("# line %d \"%s\"\n", yp -> yp_act0_lineno, sysin);
                     76:            printf ("%*s%s\n", level * 4, "", yp -> yp_action0);
                     77:        }
                     78:     }
                     79: 
                     80:     switch (yp -> yp_code) {
                     81:        case YP_BOOL:
                     82:        case YP_INT:
                     83:            if (!Vflag && (dflag || !((level == 1) || yp -> yp_action2
                     84:                                                   || yp -> yp_intexp)))
                     85:                break;          /* else fall */
                     86:        case YP_INTLIST:
                     87:        case YP_ENUMLIST:
                     88:            printf ("%*sregister integer %s;\n\n", level * 4, "",
                     89:                    narg = gensym ());
                     90:            break;
                     91: 
                     92:        case YP_BIT:
                     93:            if (!Vflag && (dflag || !((level == 1) || yp -> yp_action2
                     94:                                                   || yp -> yp_strexp)))
                     95:                break;          /* else fall */
                     96:        case YP_BITLIST:
                     97:            printf ("%*sregister PE %s;\n\n", level * 4, "",
                     98:                    narg = gensym ());
                     99:            break;
                    100: 
                    101:        case YP_OCT:
                    102:            if (!dflag && ((level == 1) || yp -> yp_action2
                    103:                                        || yp -> yp_strexp)) {
                    104:                narg = gensym ();
                    105:                if (!Vflag && yp -> yp_prfexp == 'q')
                    106:                    printf ("%*sregister struct qbuf *%s;\n\n",
                    107:                            level * 4, "", narg);
                    108:                else
                    109:                    printf ("%*sregister char *%s;\n%*sint %s_len;\n\n",
                    110:                            level * 4, "", narg, level * 4, "", narg);
                    111:            }
                    112:            break;
                    113: 
                    114:        case YP_REAL:
                    115:            if (!dflag && ((level == 1) || yp -> yp_action2
                    116:                          || yp -> yp_strexp)) {
                    117:                narg = gensym ();
                    118:                printf ("%*sregister double %s;\n\n", level * 4, "", narg);
                    119:            }
                    120:            break;
                    121: 
                    122:        case YP_NULL:
                    123:        case YP_CHOICE:
                    124:        case YP_ANY:
                    125:        case YP_IDEFINED:
                    126:            narg = NULL;
                    127:            break;
                    128: 
                    129:        case YP_OID:
                    130:            if (!Vflag && (dflag || (!yp -> yp_action2 && !yp -> yp_strexp
                    131:                                     && level != 1)))
                    132:                break;          /* else fall */
                    133:            printf ("%*sregister OID %s;\n\n", level * 4, "",
                    134:                    narg = gensym ());
                    135:            break;
                    136: 
                    137:        case YP_SEQ:
                    138:        case YP_SEQTYPE:
                    139:        case YP_SEQLIST:
                    140:        case YP_SET:
                    141:        case YP_SETTYPE:
                    142:        case YP_SETLIST:
                    143:            narg = gensym ();
                    144:            if (yp -> yp_code == YP_SETLIST)
                    145:                printf ("%*sint %s_count = 0;\n", level * 4, "", narg);
                    146:            printf ("%*sregister PE %s;\n\n", level * 4, "", narg);
                    147:            break;
                    148: 
                    149:        default:
                    150:            myyerror ("unknown type: %d", yp -> yp_code);
                    151:     }
                    152: 
                    153:     if (!Vflag) {
                    154:        printf ("#ifdef DEBUG\n%*s(void) testdebug (%s, \"",
                    155:                level * 4, "", arg);
                    156:        if (level == 1)
                    157:            printf ("%s.", mymodule);
                    158:        printf ("%s\");\n#endif\n\n", id);
                    159:     }
                    160: 
                    161:     if (level == 1 && (yp -> yp_flags & YP_TAG)) {
                    162:        printf ("%*sif (explicit\n%*s&& PE_ID (%s -> pe_class, %s -> pe_id)\n",
                    163:                level * 4, "", (level + 2) * 4, "", arg, arg);
                    164:        printf ("%*s!= PE_ID (PE_CLASS_%s, %d)) {\n",
                    165:                (level + 4) * 4, "", pe_classlist[yp -> yp_tag -> yt_class],
                    166:                val2int (yp -> yp_tag -> yt_value));
                    167:        printf ("%*sadvise (NULLCP, \"%s %%s%%s/0x%%x\", PEPY_ERR_BAD_CLASS,\n",
                    168:                (level + 1) * 4, "", id);
                    169:        printf ("%*spe_classlist[%s -> pe_class], %s -> pe_id);\n",
                    170:                (level + 3) * 4, "", arg, arg);
                    171:        printf ("%*sreturn NOTOK;\n%*s}\n",
                    172:                (level + 1) * 4, "", (level * 4), "");
                    173:     }
                    174:     else
                    175:        if (!(yp -> yp_flags & YP_IMPLICIT)) {
                    176:            for (t = tuples; t -> t_type != YP_UNDF; t++)
                    177:                if (t -> t_type == yp -> yp_code) {
                    178:                    check_type (id, level, t -> t_class, t -> t_form,
                    179:                            t -> t_id, arg);
                    180:                    break;
                    181:                }
                    182:        }
                    183: 
                    184:     if (level == 1 && yp -> yp_code != YP_CHOICE &&
                    185:        (yp -> yp_flags & YP_TAG) == YP_TAG) {
                    186:        if ((yp -> yp_flags & YP_IMPLICIT) == 0 ||
                    187:            is_nonimplicit_type (yp))
                    188:            tag_pullup (yp, level, arg, "element");
                    189:     }
                    190: 
                    191:     if (Vflag) {
                    192:        if (yp -> yp_flags & YP_ID)
                    193:            printf ("%*svname (\"%s\");\n", level * 4, "", yp -> yp_id);
                    194:        else {
                    195:            if (hflag && yp -> yp_code == YP_IDEFINED)
                    196:                printf ("%*svname (\"%s\");\n", level * 4, "",
                    197:                        yp -> yp_identifier);
                    198:            else
                    199:                if ((yp -> yp_flags & YP_TAG)
                    200:                        && (yp -> yp_flags & (YP_OPTIONAL | YP_DEFAULT)))
                    201:                    printf ("%*svtag (%d, %d);\n", level * 4, "",
                    202:                            yp -> yp_tag -> yt_class,
                    203:                            val2int (yp -> yp_tag -> yt_value));
                    204:        }
                    205:     }
                    206:     if (!dflag && yp -> yp_action05)
                    207:        do_action (yp -> yp_action05, level, arg, yp -> yp_act05_lineno);
                    208:     if (!dflag && yp -> yp_action1)
                    209:        do_action (yp -> yp_action1, level, arg, yp -> yp_act1_lineno);
                    210: 
                    211:     switch (yp -> yp_code) {
                    212:        case YP_BOOL:
                    213:            if (Vflag || (!dflag && ((level == 1) || yp -> yp_action2
                    214:                                                  || yp -> yp_intexp)))
                    215:                printf ("%*sif ((%s = prim2flag (%s)) == NOTOK) {\n",
                    216:                        level * 4, "", narg, arg);
                    217:            else
                    218:                printf ("%*sif (prim2flag (%s) == NOTOK) {\n",
                    219:                        level * 4, "", arg);
                    220:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_BOOLEAN,\n",
                    221:                    (level + 1) * 4, "", id);
                    222:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    223:                    arg);
                    224:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    225:                    level * 4, "");
                    226:            if (!dflag && yp -> yp_intexp)
                    227:                printf ("%*s%s = %s;\n", level * 4, "", yp -> yp_intexp, narg);
                    228:            if (!dflag && (level == 1))
                    229:                printf ("%*sif (len)\n%*s*len = %s;\n", level * 4, "",
                    230:                        (level + 1) * 4, "", narg);
                    231:            if (Vflag)
                    232:                printf ("%*svprint (%s ? \"TRUE\" : \"FALSE\");\n",
                    233:                        level * 4, "", narg);
                    234:            break;
                    235: 
                    236:        case YP_INT:
                    237:            if (Vflag || (!dflag && ((level == 1) || yp -> yp_action2
                    238:                                                  || yp -> yp_intexp)))
                    239:                printf ("%*sif ((%s = prim2num (%s)) == NOTOK\n",
                    240:                        level * 4, "", narg, arg);
                    241:            else
                    242:                printf ("%*sif (prim2num (%s) == NOTOK\n",
                    243:                        level * 4, "", arg);
                    244:            printf ("%*s&& %s -> pe_errno != PE_ERR_NONE) {\n",
                    245:                    (level + 2) * 4, "", arg);
                    246:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_INTEGER,\n",
                    247:                    (level + 1) * 4, "", id);
                    248:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    249:                    arg);
                    250:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    251:                    level * 4, "");
                    252:            if (!dflag && yp -> yp_intexp)
                    253:                printf ("%*s%s = %s;\n", level * 4, "", yp -> yp_intexp, narg);
                    254:            if (!dflag && (level == 1))
                    255:                printf ("%*sif (len)\n%*s*len = %s;\n", level * 4, "",
                    256:                        (level + 1) * 4, "", narg);
                    257:            if (Vflag)
                    258:                printf ("%*svprint (\"%%d\", %s);\n", level * 4, "", narg);
                    259:            break;
                    260: 
                    261:        case YP_REAL:
                    262:            if (Vflag || (!dflag && ((level == 1) || yp -> yp_action2
                    263:                                                  || yp -> yp_strexp)))
                    264:                printf ("%*sif ((%s = prim2real (%s)) == NOTOK\n",
                    265:                        level * 4, "", narg, arg);
                    266:            else
                    267:                printf ("%*sif (prim2real (%s) == NOTOK\n",
                    268:                        level * 4, "", arg);
                    269:            printf ("%*s&& %s -> pe_errno != PE_ERR_NONE) {\n",
                    270:                    (level + 2) * 4, "", arg);
                    271:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_REAL,\n",
                    272:                    (level + 1) * 4, "", id);
                    273:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    274:                    arg);
                    275:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    276:                    level * 4, "");
                    277:            if (!dflag && yp -> yp_strexp)
                    278:                    printf ("%*s%s = %s;\n", level * 4, "",
                    279:                            yp -> yp_strexp, narg);
                    280:            if (Vflag)
                    281:                printf ("%*svprint (\"%%g\", %s);\n", level * 4, "", narg);
                    282:            break;
                    283: 
                    284:        case YP_INTLIST:
                    285:        case YP_ENUMLIST:
                    286:            printf ("%*sif ((%s = prim2%snum (%s)) == NOTOK\n",
                    287:                    level * 4, "", narg,
                    288:                    yp->yp_code == YP_ENUMLIST ? "e" : "",
                    289:                    arg);
                    290:            printf ("%*s&& %s -> pe_errno != PE_ERR_NONE) {\n",
                    291:                    (level + 2) * 4, "", arg);
                    292:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_INTEGER,\n",
                    293:                    (level + 1) * 4, "", id);
                    294:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    295:                    arg);
                    296:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    297:                    level * 4, "");
                    298:            if (!dflag && yp -> yp_intexp)
                    299:                printf ("%*s%s = %s;\n", level * 4, "", yp -> yp_intexp, narg);
                    300:            if (!dflag && (level == 1))
                    301:                printf ("%*sif (len)\n%*s*len = %s;\n", level * 4, "",
                    302:                        (level + 1) * 4, "", narg);
                    303:            uniqint (yp -> yp_value);
                    304:            printf ("%*sswitch (%s) {\n", level * 4, "", narg);
                    305:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
                    306:                printf ("%*scase %d:", (level + 1) * 4, "", val2int (yv));
                    307:                if (yv -> yv_flags & YV_NAMED)
                    308:                    printf ("\t/* %s */", yv -> yv_named);
                    309:                printf ("\n");
                    310:                if (Vflag) {
                    311:                    if (yv -> yv_flags & YV_NAMED)
                    312:                        printf ("%*svprint (\"%s\");\n", (level + 2) * 4, "",
                    313:                                yv -> yv_named);
                    314:                    else
                    315:                        printf ("%*svprint (\"%%d\", %s);\n", (level + 2) * 4,
                    316:                                "", narg);
                    317:                }
                    318:                if (!dflag && yv -> yv_action)
                    319:                    do_action (yv -> yv_action, level + 2, narg,
                    320:                                yv -> yv_act_lineno);
                    321:                printf ("%*sbreak;\n", (level + 2) * 4, "");
                    322:            }
                    323:            if (!rflag && yp -> yp_code == YP_ENUMLIST) {
                    324:                printf ("%*sdefault:\n", (level + 1) * 4, "");
                    325:                printf ("%*sadvise (NULLCP, \"%s %%s%%d\", PEPY_ERR_UNK_COMP, %s);\n",
                    326:                        (level + 2) * 4, "", id, narg);
                    327:                printf ("%*sreturn NOTOK;\n", (level + 2) * 4, "");
                    328:            }
                    329:            else
                    330:                if (Vflag) {
                    331:                    printf ("%*sdefault:\n", (level + 1) * 4, "");
                    332:                    printf ("%*svprint (\"%%d\", %s);\n", (level + 2) * 4, "",
                    333:                            narg);
                    334:                    printf ("%*sbreak;\n", (level + 2) * 4, "");
                    335:                }
                    336:            printf ("%*s}\n", level * 4, "");
                    337:            break;
                    338: 
                    339:        case YP_BIT:
                    340:            if (Vflag || (!dflag && ((level == 1) || yp -> yp_action2
                    341:                                                  || yp -> yp_strexp)))
                    342:                printf ("%*sif ((%s = prim2bit (%s)) == NULLPE) {\n",
                    343:                        level * 4, "", narg, arg);
                    344:            else
                    345:                printf ("%*sif (prim2bit (%s) == NULLPE) {\n",
                    346:                        level * 4, "", arg);
                    347:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_BITS,\n",
                    348:                    (level + 1) * 4, "", id);
                    349:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    350:                    arg);
                    351:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    352:                    level * 4, "");
                    353:            if (!dflag && yp -> yp_strexp)
                    354:                printf ("%*s%s = bitstr2strb (%s, &(%s));\n",
                    355:                        level * 4, "", yp -> yp_strexp, arg, yp -> yp_intexp);
                    356:            if (!dflag && (level == 1)) {
                    357:                printf ("%*sif (buffer && len)\n", level * 4, "");
                    358:                if (yp -> yp_strexp)
                    359:                    printf ("%*s*buffer = %s, *len = %s;\n",
                    360:                        (level + 1) * 4, "", yp -> yp_strexp, yp -> yp_intexp);
                    361:                else
                    362:                    printf ("%*s*buffer = bitstr2strb (%s, len);\n",
                    363:                        (level + 1) * 4, "", arg);
                    364:            }
                    365:            if (Vflag)
                    366:                printf ("%*svprint (\"%%s\", bit2str (%s, \"\\020\"));\n",
                    367:                        level * 4, "", narg);
                    368:            break;
                    369: 
                    370:        case YP_BITLIST:
                    371:            printf ("%*sif ((%s = prim2bit (%s)) == NULLPE) {\n",
                    372:                    level * 4, "", narg, arg);
                    373:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_BITS,\n",
                    374:                    (level + 1) * 4, "", id);
                    375:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    376:                    arg);
                    377:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    378:                    level * 4, "");
                    379:            if (!dflag && yp -> yp_strexp)
                    380:                printf ("%*s%s = bitstr2strb (%s, &(%s));\n",
                    381:                        level * 4, "", yp -> yp_strexp, arg, yp -> yp_intexp);
                    382:            if (!dflag && (level == 1)) {
                    383:                printf ("%*sif (buffer && len)\n", level * 4, "");
                    384:                if (yp -> yp_strexp)
                    385:                    printf ("%*s*buffer = %s, *len = %s;\n",
                    386:                        (level + 1) * 4, "", yp -> yp_strexp, yp -> yp_intexp);
                    387:                else
                    388:                    printf ("%*s*buffer = bitstr2strb (%s, len);\n",
                    389:                        (level + 1) * 4, "", arg);
                    390:            }
                    391: #ifdef notdef
                    392:            if (!rflag) {
                    393:                register int    j;
                    394: 
                    395:                for (yv = yp -> yp_value, i = 0; yv; yv = yv -> yv_next)
                    396:                    if ((j = val2int (yv)) > i)
                    397:                        i = j;
                    398:                i++;
                    399:                printf ("%*sif (%s -> pe_nbits > %d) {\n",
                    400:                        level * 4, "", narg, i);
                    401:                printf ("%*sadvise (NULLCP, \"%s %%s(%d): %%d\", PEPY_ERR_TOO_MANY_BITS,\n",
                    402:                        (level + 1) * 4, "", id, i);
                    403:                printf ("%*s%s -> pe_nbits);\n", (level + 3) * 4, "", narg);
                    404:                printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    405:                        level * 4, "");
                    406:            }
                    407: #endif
                    408:            i = -1;
                    409:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
                    410:                if ((j = val2int (yv)) < 0)
                    411:                    pyyerror (yp, "invalid bit number in BIT STRING");
                    412:                else
                    413:                    if (j > i)
                    414:                        i = j;
                    415:            printf ("#define\tBITS\t\"\\020");
                    416:            if (i < sizeof (int) * 8) {         /* NBBY */
                    417:                for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
                    418:                    if (yv -> yv_flags & YV_NAMED)
                    419:                        printf ("\\0%o%s", val2int (yv) + 1, yv -> yv_named);
                    420:                    else
                    421:                        printf ("\\0%oBIT%d", val2int (yv) + 1, val2int (yv));
                    422:            }
                    423:            printf ("\"\n");
                    424:            uniqint (yp -> yp_value);
                    425:            if (!dflag)
                    426:                for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
                    427:                    if (!yv -> yv_action)
                    428:                        continue;
                    429:                    printf ("%*sif (bit_test (%s, %d) > OK) {",
                    430:                            level * 4, "", narg, val2int (yv));
                    431:                    if (yv -> yv_flags & YV_NAMED)
                    432:                        printf ("\t/* %s */", yv -> yv_named);
                    433:                    printf ("\n");
                    434:                    do_action (yv -> yv_action, level + 1, narg,
                    435:                               yv -> yv_act_lineno);
                    436:                    printf ("%*s}\n", level * 4, "");
                    437:                }
                    438:            if (Vflag)
                    439:                printf ("%*svprint (\"%%s\", bit2str (%s, BITS));\n",
                    440:                        level * 4, "", narg);
                    441:            break;
                    442: 
                    443:        case YP_OCT:
                    444:            if (!dflag && ((level == 1) || yp -> yp_action2
                    445:                                        || yp -> yp_strexp)) {
                    446:                printf ("%*sif ((%s = ", level * 4, "", narg);
                    447:                if (!Vflag && yp -> yp_prfexp == 'q')
                    448:                    printf ("prim2qb (%s)) == (struct qbuf *)0) {\n", arg);
                    449:                else
                    450:                    printf ("prim2str (%s, &%s_len)) == NULLCP) {\n",
                    451:                            arg, narg);
                    452:                printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_OCTET,\n",
                    453:                        (level + 1) * 4, "", id);
                    454:                printf ("%*spe_error (%s -> pe_errno));\n",
                    455:                        (level + 3) * 4, "", arg);
                    456:                printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    457:                        level * 4, "");
                    458:            }
                    459:            if (!dflag && yp -> yp_strexp) {
                    460:                if (! (yp -> yp_prfexp == 'q' && Vflag))
                    461:                    printf ("%*s%s = %s;\n",
                    462:                            level * 4, "", yp -> yp_strexp, narg);
                    463:            }
                    464:            if (!dflag && yp -> yp_intexp && yp -> yp_prfexp != 'q')
                    465:                printf ("%*s%s = %s_len;\n",
                    466:                        level * 4, "", yp -> yp_intexp, narg);
                    467:            if (Vflag)
                    468:                printf ("%*svstring (%s);\n", level * 4, "", arg);
                    469:            break;
                    470: 
                    471:        case YP_ANY:
                    472:            if (!dflag && yp -> yp_strexp)
                    473:                printf ("%*s(%s = %s) -> pe_refcnt++;\n",
                    474:                        level * 4, "", yp -> yp_strexp, arg);
                    475:            if (Vflag)
                    476:                printf ("%*svunknown (%s);\n", level * 4, "", arg);
                    477:            break;
                    478: 
                    479:        case YP_NULL:
                    480:            if (Vflag)
                    481:                printf ("%*svprint (\"NULL\");\n", level * 4, "");
                    482:            break;
                    483: 
                    484:        case YP_OID:
                    485:            if (Vflag || (!dflag && (yp -> yp_action2 || yp -> yp_strexp
                    486:                                     || level == 1)))
                    487:                printf ("%*sif ((%s = prim2oid (%s)) == NULLOID) {\n",
                    488:                        level * 4, "", narg, arg);
                    489:            else
                    490:                printf ("%*sif (prim2oid (%s) == NULLOID) {\n",
                    491:                        level * 4, "", arg);
                    492:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_OID,\n",
                    493:                    (level + 1) * 4, "", id);
                    494:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    495:                    arg);
                    496:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    497:                    level * 4, "");
                    498:            if (!dflag && level == 1) {
                    499:                printf ("%*sif (buffer)\n", level * 4, "");
                    500:                printf ("%*s*buffer = sprintoid (%s);\n",
                    501:                        (level + 1) * 4, "", narg);
                    502:            }
                    503:            if(!dflag && yp -> yp_strexp)
                    504:                printf ("%*s%s = oid_cpy (%s);\n", level * 4, "",
                    505:                        yp -> yp_strexp, narg);
                    506:            if (Vflag)
                    507:                printf ("%*svprint (\"%%s\", oid2ode (%s));\n", level * 4,
                    508:                    "", narg);
                    509:            break;
                    510: 
                    511:        case YP_SEQ:
                    512:            printf ("%*sif ((%s = prim2seq (%s)) == NULLPE) {\n",
                    513:                    level * 4, "", narg, arg);
                    514:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SEQ,\n",
                    515:                    (level + 1) * 4, "", id);
                    516:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    517:                    arg);
                    518:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    519:                    level * 4, "");
                    520:            printf ("%*s%s = %s;\n\n", level * 4, "", arg, narg);
                    521:            if (!dflag && yp -> yp_strexp)
                    522:                printf ("%*s(%s = %s) -> pe_refcnt++;\n",
                    523:                        level * 4, "", yp -> yp_strexp, narg);
                    524:            if (Vflag)
                    525:                printf ("%*svunknown (%s);\n", level * 4, "", narg);
                    526:            break;
                    527: 
                    528:        case YP_SEQTYPE:
                    529:            printf ("%*sif ((%s = prim2seq (%s)) == NULLPE) {\n",
                    530:                    level * 4, "", narg, arg);
                    531:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SEQ,\n",
                    532:                    (level + 1) * 4, "", id);
                    533:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    534:                    arg);
                    535:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    536:                    level * 4, "");
                    537:            printf ("%*s%s = %s;\n\n", level * 4, "", arg, narg);
                    538:            if (Vflag)
                    539:                printf ("%*svpush ();\n", level * 4, "");
                    540:            if (yp -> yp_type) {
                    541:                printf ("%*sfor (%s = first_member (%s); %s; %s = next_member (%s, %s)) {\n",
                    542:                        level * 4, "", narg, arg, narg, narg, arg, narg);
                    543:                if (!dflag && yp -> yp_action3) {
                    544:                    do_action (yp -> yp_action3, ++level, arg,
                    545:                                yp -> yp_act3_lineno);
                    546:                    printf ("%*s{\n", level * 4, "");
                    547:                }
                    548:                undo_type (yp -> yp_type, level + 1, "element", narg, Vflag);
                    549:                if (!dflag && yp -> yp_action3)
                    550:                    printf ("%*s}\n", level-- * 4, "");
                    551:                printf ("%*s}\n", level * 4, "");
                    552:            }
                    553:            if (Vflag)
                    554:                printf ("%*svpop ();\n", level * 4, "");
                    555:            break;
                    556: 
                    557:        case YP_SEQLIST:
                    558:            printf ("%*sif ((%s = prim2seq (%s)) == NULLPE) {\n",
                    559:                    level * 4, "", narg, arg);
                    560:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SEQ,\n",
                    561:                    (level + 1) * 4, "", id);
                    562:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    563:                    arg);
                    564:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    565:                    level * 4, "");
                    566:            printf ("%*s%s = %s;\n\n", level * 4, "", arg, narg);
                    567:            if (Vflag)
                    568:                printf ("%*svpush ();\n", level * 4, "");
                    569:            for (y = yp -> yp_type, i = 0; y; y = y -> yp_next)
                    570:                if (y -> yp_flags & YP_COMPONENTS)
                    571:                    i += undo_components_seq (y, level, y == yp -> yp_type,
                    572:                        y -> yp_next == NULLYP, id, arg, narg, Vflag);
                    573:                else {
                    574:                    undo_type_element (y, level, y == yp -> yp_type,
                    575:                        y -> yp_next == NULLYP, id, arg, narg, Vflag);
                    576:                    i++;
                    577:                }
                    578:            if (Vflag)
                    579:                printf ("%*svpop ();\n", level * 4, "");
                    580:            for (y = yp -> yp_type; y; y = y -> yp_next) {
                    581:                register YP     z;
                    582: 
                    583:                if (!(y -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
                    584:                        || lookup_tag (y) == NULLYT)
                    585:                    continue;
                    586:                for (z = y -> yp_next; z; z = z -> yp_next)
                    587:                    if (!(z -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
                    588:                            || lookup_tag (z) == NULLYT)
                    589:                        break;
                    590:                uniqtag (y, z);
                    591:                if (z == NULLYP)
                    592:                    break;
                    593:                y = z;
                    594:            }
                    595:            if (!rflag) {
                    596:                printf ("\n%*sif (%s -> pe_cardinal > %d) {\n",
                    597:                        level * 4, "", arg, i);
                    598:                printf ("%*sadvise (NULLCP, \"%s %%s(%d): %%d\", PEPY_ERR_TOO_MANY_ELEMENTS,\n",
                    599:                        (level + 1) * 4, "", id, i);
                    600:                printf ("%*s%s -> pe_cardinal);\n", (level + 3) * 4, "", arg);
                    601:                printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    602:                        level * 4, "");
                    603:            }
                    604:            break;
                    605: 
                    606:        case YP_SET:
                    607:            printf ("%*sif ((%s = prim2set (%s)) == NULLPE) {\n",
                    608:                    level * 4, "", narg, arg);
                    609:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SET,\n",
                    610:                    (level + 1) * 4, "", id);
                    611:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    612:                    arg);
                    613:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    614:                    level * 4, "");
                    615:            printf ("%*s%s = %s;\n\n", level * 4, "", arg, narg);
                    616:            if (!dflag && yp -> yp_strexp)
                    617:                printf ("%*s(%s = %s) -> pe_refcnt++;\n",
                    618:                        level * 4, "", yp -> yp_strexp, narg);
                    619:            if (Vflag)
                    620:                printf ("%*svunknown (%s);\n", level * 4, "", narg);
                    621:            break;
                    622: 
                    623:        case YP_SETTYPE:
                    624:            printf ("%*sif ((%s = prim2set (%s)) == NULLPE) {\n",
                    625:                    level * 4, "", narg, arg);
                    626:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SET,\n",
                    627:                    (level + 1) * 4, "", id);
                    628:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    629:                    arg);
                    630:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    631:                    level * 4, "");
                    632:            printf ("%*s%s = %s;\n\n", level * 4, "", arg, narg);
                    633:            if (Vflag)
                    634:                printf ("%*svpush ();\n", level * 4, "");
                    635:            if (yp -> yp_type) {
                    636:                printf ("%*sfor (%s = first_member (%s); %s; %s = next_member (%s, %s)) {\n",
                    637:                        level * 4, "", narg, arg, narg, narg, arg, narg);
                    638:                if (!dflag && yp -> yp_action3) {
                    639:                    do_action (yp -> yp_action3, ++level, arg,
                    640:                                yp -> yp_act3_lineno);
                    641:                    printf ("%*s{\n", level * 4, "");
                    642:                }
                    643:                undo_type (yp -> yp_type, level + 1, "member", narg, Vflag);
                    644:                if (!dflag && yp -> yp_action3)
                    645:                    printf ("%*s}\n", level-- * 4, "");
                    646:                printf ("%*s}\n", level * 4, "");
                    647:            }
                    648:            if (Vflag)
                    649:                printf ("%*svpop ();\n", level * 4, "");
                    650:            break;
                    651: 
                    652:        case YP_SETLIST:
                    653:            printf ("%*sif ((%s = prim2set (%s)) == NULLPE) {\n",
                    654:                    level * 4, "", narg, arg);
                    655:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SET,\n",
                    656:                    (level + 1) * 4, "", id);
                    657:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 3) * 4, "",
                    658:                    arg);
                    659:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
                    660:                    level * 4, "");
                    661:            printf ("%*s%s = %s;\n\n", level * 4, "", arg, narg);
                    662:            if (Vflag)
                    663:                printf ("%*svpush ();\n", level * 4, "");
                    664:            if (yp -> yp_type) {
                    665:                for (y = yp -> yp_type; y; y = y -> yp_next)
                    666:                    if (y -> yp_flags & YP_COMPONENTS)
                    667:                        undo_components_set (y, level, arg, narg, Vflag);
                    668:                    else
                    669:                        undo_type_member (y, level, arg, narg, Vflag);
                    670:                choice_pullup (y = copy_type (yp), CH_FULLY);
                    671:                uniqtag (y -> yp_type, NULLYP);
                    672:                if (!rflag) {
                    673:                    printf ("%*sif (%s_count != %s -> pe_cardinal)\n",
                    674:                            level * 4, "", narg, arg);
                    675:                    printf ("%*sadvise (NULLCP, \"%%s\", PEPY_ERR_EXTRA_MEMBERS);\n",
                    676:                            (level + 1) * 4, "");
                    677:                }
                    678:            }
                    679:            if (Vflag)
                    680:                printf ("%*svpop ();\n", level * 4, "");
                    681:            break;
                    682: 
                    683:        case YP_CHOICE:
                    684:            if (Vflag)
                    685:                printf ("%*svpush ();\n", level * 4, "");
                    686:            if (yp -> yp_type) {
                    687:                int     didefault;
                    688:                
                    689:                if ((yp -> yp_flags & YP_TAG)
                    690:                        && !(yp -> yp_flags & YP_PULLEDUP))
                    691:                    tag_pullup (yp, level, arg, "choice");
                    692:                printf ("%*sswitch (PE_ID (%s -> pe_class, %s -> pe_id)) {\n",
                    693:                        level * 4, "", arg, arg);
                    694:                choice_pullup (yp, CH_PARTIAL);
                    695:                didefault = 0;
                    696:                for (y = yp -> yp_type; y; y = y -> yp_next)
                    697:                    didefault += undo_type_choice (y, level + 1, arg, Vflag);
                    698:                if (didefault > 1)
                    699:                    yyerror_aux ("multiple non-tagged ANYs in CHOICE");
                    700:                uniqtag (yp -> yp_type, NULLYP);
                    701:                if (!didefault && !rflag) {
                    702:                    printf ("\n%*sdefault:\n", (level + 1) * 4, "");
                    703:                    printf ("%*sadvise (NULLCP, \"%s %%s%%s/%%d/0x%%x\", PEPY_ERR_UNKNOWN_CHOICE,\n",
                    704:                            (level + 2) * 4, "", id);
                    705:                    printf ("%*spe_classlist[%s -> pe_class], %s -> pe_form, %s -> pe_id);\n",
                    706:                            (level + 4) * 4, "", arg, arg, arg);
                    707:                    printf ("%*sreturn NOTOK;\n", (level + 2) * 4, "");
                    708:                }
                    709:                printf ("%*s}\n", level * 4, "");
                    710:            }
                    711:            if (Vflag)
                    712:                printf ("%*svpop ();\n", level * 4, "");
                    713:            break;
                    714: 
                    715:        case YP_IDEFINED:
                    716:            printf ("%*sif (%s (", level * 4, "", modsym (yp -> yp_module,
                    717:                    yp -> yp_identifier, Vflag ? YP_PRINTER : YP_DECODER));
                    718:            printf ("%s, ", arg);
                    719:            if (level != 1 || (yp -> yp_flags & YP_IMPLICIT))
                    720:                printf ("%d, ", (yp -> yp_flags & YP_IMPLICIT) ? 0 : 1);
                    721:            else
                    722:                printf ("explicit, ");
                    723:            if (yp -> yp_intexp)
                    724:                printf ("&(%s), ", yp -> yp_intexp);
                    725:            else if (level == 1)
                    726:                printf ("len, ");
                    727:            else
                    728:                printf ("NULLINTP, ");
                    729:            if (yp -> yp_strexp)
                    730:                printf ("&(%s)", yp -> yp_strexp);
                    731:            else if (level == 1)
                    732:                printf ("buffer");
                    733:            else
                    734:                printf ("NULLVP");
                    735:            if (yp -> yp_flags & YP_PARMVAL)
                    736:                printf (", %s", yp -> yp_parm);
                    737:            else
                    738:                printf (", NullParm");
                    739:            printf (") == NOTOK)\n%*sreturn NOTOK;\n", (level + 1) * 4, "");
                    740:            break;
                    741: 
                    742:        default:
                    743:            myyerror ("unknown type: %d", yp -> yp_code);
                    744:     }
                    745: 
                    746:     if (!dflag && yp -> yp_action2)
                    747:        do_action (yp -> yp_action2, level, narg ? narg : arg,
                    748:                                yp -> yp_act2_lineno);
                    749: 
                    750:     switch (yp -> yp_code) {
                    751:        case YP_BITLIST:
                    752:            printf ("#undef\tBITS\n");
                    753:            break;
                    754: 
                    755:        case YP_OCT:
                    756:            if (!dflag && yp -> yp_prfexp != 'q' &&
                    757:                ((level == 1) || yp -> yp_action2)) {
                    758:                if (level == 1) {
                    759:                    printf ("%*sif (len)\n", level * 4, "");
                    760:                    printf ("%*s*len = %s_len;\n", (level + 1) * 4, "", narg);
                    761:                    printf ("%*sif (buffer)\n", level * 4, "");
                    762:                    printf ("%*s*buffer = %s;\n", (level + 1) * 4, "", narg);
                    763:                    printf ("%*selse\n", level * 4, "");
                    764:                }
                    765:                printf ("%*s", (level + 1) * 4, "");
                    766:                if (yp -> yp_strexp)
                    767:                    printf ("/* do nothing */;\n");
                    768:                else
                    769:                    printf ("if (%s)\n%*sfree (%s);\n", narg, (level + 2) * 4,
                    770:                            "", narg);
                    771:            }
                    772:            break;
                    773: 
                    774:        default:
                    775:            break;
                    776:     }
                    777: }
                    778: 
                    779: /*  */
                    780: 
                    781: static undo_type_element (yp, level, first, last, id, arg, narg, Vflag)
                    782: register YP    yp;
                    783: register int   level;
                    784: int    first,
                    785:        last;
                    786: register char  *id,
                    787:               *arg,
                    788:               *narg;
                    789: int    Vflag;
                    790: {
                    791:     register char  *narg2;
                    792:     register YT yt;
                    793: 
                    794:     printf ("%*s{\n%*sregister PE %s;\n\n",
                    795:            level * 4, "", (level + 1) * 4, "", narg2 = gensym ());
                    796:     level++;
                    797: 
                    798:     if ((yp -> yp_flags & (YP_OPTIONAL | YP_DEFAULT)) && !last) {
                    799:        YP yp2 = copy_type (yp);
                    800: 
                    801:        if (!(yp2 -> yp_flags & YP_TAG)) {
                    802:            switch (yp2 -> yp_code) {
                    803:            case YP_CHOICE:
                    804:                break;
                    805:            case YP_IDEFINED:
                    806:                if (lookup_tag (yp2) == NULLYT)
                    807:                    break;
                    808:            default:
                    809:                tag_type (yp2);
                    810:                break;
                    811:            }
                    812:        }
                    813:        printf ("%*sif ((%s = ", level * 4, "", narg2);
                    814:        if (first)
                    815:            printf ("first_member (%s)) != NULLPE", arg);
                    816:        else {
                    817:            printf ("(%s != %s ? next_member (%s, %s) : first_member (%s))",
                    818:                    arg, narg, arg, narg, arg);
                    819:            printf (") \n%*s!= NULLPE", (level + 3) * 4, "");
                    820:        }
                    821:        if (yp2 -> yp_flags & YP_TAG && !last) {
                    822:            yt = yp2 -> yp_tag;
                    823:            printf ("\n%*s&& PE_ID (%s -> pe_class, %s -> pe_id)\n",
                    824:                    (level + 2) * 4, "", narg2, narg2);
                    825:            printf ("%*s!= PE_ID (PE_CLASS_%s, %d))\n%*s%s = NULLPE;\n",
                    826:                    (level + 4) * 4, "", pe_classlist[yt -> yt_class],
                    827:                    val2int (yt -> yt_value), (level + 1) * 4, "", narg2);
                    828:        }
                    829:        else {
                    830:            ype zy;
                    831:            register YP y = &zy;
                    832: 
                    833:            y -> yp_type = copy_type (yp2); /* XXX */
                    834:            y -> yp_type -> yp_next = NULLYP;
                    835:            choice_pullup (y, CH_FULLY); /* XXX */
                    836:            for (y = y -> yp_type; y; y = y -> yp_next) {
                    837:                if (!(y -> yp_flags & YP_TAG))
                    838:                    tag_type (y);
                    839:                printf ("\n%*s&& PE_ID (%s -> pe_class, %s -> pe_id)\n",
                    840:                        (level + 2) * 4, "", narg2, narg2);
                    841:                printf ("%*s!= PE_ID (PE_CLASS_%s, %d)",
                    842:                        (level + 4) * 4, "",
                    843:                        pe_classlist[y -> yp_tag -> yt_class],
                    844:                        val2int (y -> yp_tag -> yt_value));
                    845:            }
                    846:            printf (")\n%*s%s = NULLPE;\n", (level + 1) * 4, "", narg2);
                    847:        }
                    848:        printf ("%*sif (%s != NULLPE", level * 4, "", narg2);
                    849:     }
                    850:     else {
                    851:        printf ("%*sif ((%s = ", level * 4, "", narg2);
                    852:        if (first)
                    853:            printf ("first_member (%s)", arg);
                    854:        else
                    855:            printf ("(%s != %s ? next_member (%s, %s) : first_member (%s))",
                    856:                    arg, narg, arg, narg, arg);
                    857:        printf (") != NULLPE");
                    858:     }
                    859:     printf (") {\n%*s%s = %s;\n\n", (level + 1) * 4, "", narg, narg2);
                    860:     level++;
                    861: 
                    862:     if (yp -> yp_code != YP_CHOICE && (yp -> yp_flags & YP_TAG)) {
                    863:        if ((yp -> yp_flags & YP_IMPLICIT) == 0 ||
                    864:            is_nonimplicit_type (yp))
                    865:            tag_pullup (yp, level, narg2, "element");
                    866:     }
                    867:     printf ("%*s{", level * 4, "");
                    868:     level++;
                    869:     if (yp -> yp_flags & YP_ID)
                    870:        printf ("\t/* %s */", yp -> yp_id);
                    871:     printf ("\n");
                    872: 
                    873:     undo_type (yp, level, yp -> yp_flags & YP_ID ? yp -> yp_id : "element",
                    874:            narg2, Vflag);
                    875: 
                    876:     level--;
                    877:     printf ("%*s}\n", level * 4, "");
                    878: 
                    879:     level--;
                    880:     printf ("%*s}\n", level * 4, "");
                    881: 
                    882:     if ((yp -> yp_flags & YP_DEFAULT) || !(yp -> yp_flags & YP_OPTIONAL)) {
                    883:        printf ("%*selse {\n", level * 4, "");
                    884: 
                    885:        if (yp -> yp_flags & YP_DEFAULT)
                    886:            printf ("%*s/* set default here using yp -> yp_default */\n",
                    887:                    (level + 1) * 4, "");
                    888:        else {
                    889:            printf ("%*sadvise (NULLCP, \"%s %%s",
                    890:                    (level + 1) * 4, "", id);
                    891:            if (yp -> yp_flags & YP_ID)
                    892:                printf ("%s ", yp -> yp_id);
                    893:            printf ("element\", PEPY_ERR_MISSING);\n%*sreturn NOTOK;\n", (level + 1) * 4, "");
                    894:        }
                    895: 
                    896:        printf ("%*s}\n\n", level * 4, "");
                    897:     }
                    898: 
                    899:     level--;
                    900:     printf ("%*s}\n\n", level * 4, "");
                    901: }
                    902: 
                    903: /*  */
                    904: 
                    905: static undo_type_member (yp, level, arg, narg, Vflag)
                    906: register YP    yp;
                    907: register int   level;
                    908: char   *arg,
                    909:        *narg;
                    910: int    Vflag;
                    911: {
                    912:     int            pullup = 0;
                    913:     char   *id = yp -> yp_flags & YP_ID ? yp -> yp_id : "member";
                    914:     char   *narg2;
                    915: 
                    916:     if (!(yp -> yp_flags & YP_TAG)) {
                    917:        switch (yp -> yp_code) {
                    918:        case YP_CHOICE:
                    919:            break;
                    920:        case YP_IDEFINED:
                    921:            if (lookup_tag (yp) == NULLYT)
                    922:                break;
                    923:        default:
                    924:            tag_type (yp);
                    925:        }
                    926:     }
                    927:     if (yp -> yp_flags & YP_TAG)
                    928:        printf ("%*sif (%s = set_find (%s, PE_CLASS_%s, %d)) {\n",
                    929:                level * 4, "", narg, arg,
                    930:                pe_classlist[yp -> yp_tag -> yt_class],
                    931:                val2int (yp -> yp_tag -> yt_value));
                    932:     else {
                    933:        ype zy;
                    934:        register YP y = &zy;
                    935: 
                    936:        y -> yp_type = copy_type(yp);   /* XXXX !!! */
                    937:        y -> yp_type -> yp_next = NULLYP;
                    938:        choice_pullup (y, CH_FULLY);
                    939:        /* this is dependant on choice_pullup coding... */
                    940:        y = y -> yp_type;
                    941:        if (y) {
                    942:            if (!(y -> yp_flags & YP_TAG))
                    943:                tag_type (y);
                    944:            printf ("%*sif ( (%s = set_find (%s, PE_CLASS_%s, %d))",
                    945:                    level * 4, "", narg, arg,
                    946:                    pe_classlist[y->yp_tag->yt_class],
                    947:                    val2int (y -> yp_tag -> yt_value));
                    948:            for (y = y -> yp_next; y; y = y -> yp_next) {
                    949:                if (!(y -> yp_flags & YP_TAG))
                    950:                    tag_type (y);
                    951:                printf ("\n%*s|| (%s = set_find (%s, PE_CLASS_%s, %d))",
                    952:                        (level + 1) * 4, "", narg, arg,
                    953:                        pe_classlist[y -> yp_tag -> yt_class],
                    954:                        val2int (y -> yp_tag -> yt_value));
                    955:            }
                    956:            printf (" ) {\n");
                    957:        }
                    958:     }
                    959:     level ++;
                    960: 
                    961:     if (yp -> yp_flags & YP_TAG) {
                    962:        if ((yp -> yp_flags & YP_IMPLICIT) == 0 ||
                    963:            is_nonimplicit_type (yp))
                    964:            pullup = 1;
                    965:     }
                    966: 
                    967:     if (pullup) {
                    968:        printf ("%*sregister PE %s = %s;\n\n", level * 4, "",
                    969:                narg2 = gensym (), narg);
                    970:        tag_pullup (yp, level, narg2, id);
                    971:        printf ("%*s{\n", level * 4, "");
                    972:        level++;
                    973:        yp -> yp_flags |= YP_PULLEDUP;
                    974:     }
                    975:     else
                    976:        narg2 = narg;
                    977: 
                    978:     undo_type (yp, level, id, narg2, Vflag);
                    979: 
                    980:     if (pullup) {
                    981:        level--;
                    982:        printf ("%*s}\n", level * 4, "");
                    983:     }
                    984: 
                    985:     printf ("%*s%s_count ++;\n", level * 4, "", narg); 
                    986:     level--;
                    987:     printf ("%*s}\n", level * 4, "");
                    988: 
                    989:     if ((yp -> yp_flags & YP_DEFAULT) || !(yp -> yp_flags & YP_OPTIONAL)) {
                    990:        printf ("%*selse {\n", level * 4, "");
                    991: 
                    992:        if (yp -> yp_flags & YP_DEFAULT)
                    993:            printf ("%*s/* set default here using yp -> yp_default */\n",
                    994:                    (level + 1) * 4, "");
                    995:        else {
                    996:            printf ("%*sadvise (NULLCP, \"%s %%s ",
                    997:                    (level + 1) * 4, "", id);
                    998:            if (yp -> yp_flags & YP_ID)
                    999:                printf ("%s ", yp -> yp_id);
                   1000:            printf ("member\", PEPY_ERR_MISSING);\n%*sreturn NOTOK;\n", (level + 1) * 4, "");
                   1001:        }
                   1002: 
                   1003:        printf ("%*s}\n\n", level * 4, "");
                   1004:     }
                   1005: }
                   1006: /*  */
                   1007: 
                   1008: static int  undo_type_choice (yp, level, narg, Vflag)
                   1009: register YP    yp;
                   1010: register int   level;
                   1011: register char  *narg;
                   1012: int    Vflag;
                   1013: {
                   1014:     int            pullup = 0;
                   1015:     int            result;
                   1016:     char   *id = yp -> yp_flags & YP_ID ? yp -> yp_id : "member";
                   1017:     char   *narg2;
                   1018: 
                   1019:     if (is_any_type (yp)) {
                   1020:        printf ("%*sdefault:", level * 4, "");
                   1021: 
                   1022:        result = 1;     
                   1023:     }
                   1024:     else if (!(yp -> yp_flags & YP_TAG) && yp->yp_code == YP_IDEFINED) {
                   1025:        ype zy;
                   1026:        register YP y = &zy;
                   1027: 
                   1028:        result = 0;
                   1029:        y -> yp_type = copy_type(yp);   /* XXXX !!! */
                   1030:        y -> yp_type -> yp_next = NULL;
                   1031:        choice_pullup (y, CH_FULLY);
                   1032:            /* this is dependant on choice_pullup coding..*/
                   1033:        for (y = y -> yp_type; y; y = y -> yp_next) {
                   1034:            if (is_any_type (y)) {
                   1035:                printf ("%*sdefault:%s", level * 4, "",
                   1036:                        y -> yp_next ? "\n" : "");
                   1037:                result ++;
                   1038:            }
                   1039:            else {
                   1040:                if (!(y -> yp_flags & YP_TAG))
                   1041:                    tag_type(y);
                   1042:                printf("%*scase PE_ID (PE_CLASS_%s, %d):%s", level * 4, "",
                   1043:                       pe_classlist [y -> yp_tag -> yt_class],
                   1044:                       val2int (y -> yp_tag -> yt_value),
                   1045:                       y -> yp_next ? "\n" : "");
                   1046:            }
                   1047:        }
                   1048:     }
                   1049:     else {
                   1050:        if (!(yp -> yp_flags & YP_TAG))
                   1051:            tag_type (yp);
                   1052:        printf ("%*scase PE_ID (PE_CLASS_%s, %d):", level * 4, "",
                   1053:                pe_classlist [yp -> yp_tag -> yt_class],
                   1054:                val2int (yp -> yp_tag -> yt_value));
                   1055: 
                   1056:        result = 0;
                   1057:     }
                   1058:     if (yp -> yp_flags & YP_ID)
                   1059:        printf ("\t/* %s */", yp -> yp_id);
                   1060:     printf ("\n");
                   1061:     level++;
                   1062: 
                   1063:     printf ("%*s{\n", level * 4, "");
                   1064:     level++;
                   1065: 
                   1066:     if (yp -> yp_flags & YP_TAG) {
                   1067:        if ((yp -> yp_flags & YP_IMPLICIT) == 0 ||
                   1068:            is_nonimplicit_type (yp))
                   1069:            pullup = 1;
                   1070:     }
                   1071:     if (pullup) {
                   1072:        printf ("%*sregister PE %s = %s;\n\n", level * 4, "",
                   1073:                narg2 = gensym (), narg);
                   1074:        tag_pullup (yp, level, narg2, id);
                   1075:        printf ("%*s{\n", level * 4, "");
                   1076:        level++;
                   1077:        yp -> yp_flags |= YP_PULLEDUP;
                   1078:     }
                   1079:     else
                   1080:        narg2 = narg;
                   1081: 
                   1082:     undo_type (yp, level, id, narg2, Vflag);
                   1083: 
                   1084:     if (pullup) {
                   1085:        level--;
                   1086:        printf ("%*s}\n", level * 4, "");
                   1087:     }
                   1088: 
                   1089:     level--;
                   1090:     printf ("%*s}\n%*sbreak;\n", level * 4, "", level * 4, "");
                   1091: 
                   1092:     return result;
                   1093: }
                   1094: 
                   1095: static undo_components_seq (yp, level, first, last, id, arg, narg, Vflag)
                   1096: YP     yp;
                   1097: register int level, first, last;
                   1098: register char  *id,
                   1099:                *arg,
                   1100:                *narg;
                   1101: int    Vflag;
                   1102: {
                   1103:     YP newyp;
                   1104:     YP y;
                   1105:     int        i = 0;
                   1106: 
                   1107:     if (yp -> yp_module) {
                   1108:        pyyerror (yp, "Can't do COMPONENTS OF with external types for %s",
                   1109:                  yp -> yp_identifier);
                   1110:        return i;
                   1111:     }
                   1112: 
                   1113:     if (!(newyp = lookup_type (yp->yp_module, yp -> yp_identifier))) {
                   1114:        pyyerror (yp, "Can't find referenced COMPONENTS OF %s",
                   1115:                  yp->yp_identifier);
                   1116:        return i;
                   1117:     }
                   1118: 
                   1119:     for (y = newyp -> yp_type; y; y = y -> yp_next) {
                   1120:        if (y -> yp_flags & YP_COMPONENTS)
                   1121:            i += undo_components_seq (y, level, first && y == yp -> yp_type,
                   1122:                                        last && y -> yp_next == NULLYP,
                   1123:                                        id, arg, narg, Vflag);
                   1124:        else {
                   1125:            undo_type_element (y, level, first && y == newyp -> yp_type,
                   1126:                               last && y -> yp_next == NULLYP, id,
                   1127:                               arg, narg, Vflag);
                   1128:            i ++;
                   1129:        }
                   1130:     }
                   1131:     return i;
                   1132: }
                   1133: 
                   1134: static undo_components_set (yp, level, arg, narg, Vflag)
                   1135: register YP    yp;
                   1136: register int   level;
                   1137: char   *arg,
                   1138:        *narg;
                   1139: int    Vflag;
                   1140: {
                   1141:     YP newyp, y;
                   1142: 
                   1143:     if (yp -> yp_module) {
                   1144:        pyyerror (yp, "Can't do COMPONENTS OF with external types for %s",
                   1145:                  yp -> yp_identifier);
                   1146:        return;
                   1147:     }
                   1148: 
                   1149:     if (!(newyp = lookup_type (yp->yp_module, yp -> yp_identifier))) {
                   1150:        pyyerror (yp, "Can't find referenced COMPONENTS OF %s",
                   1151:                  yp->yp_identifier);
                   1152:        return;
                   1153:     }
                   1154:     if (newyp -> yp_code != YP_SETLIST) {
                   1155:        yyerror_aux ("COMPONENTS OF type is not a SET");
                   1156:        print_type (newyp, 0);
                   1157:        return;
                   1158:     }
                   1159: 
                   1160:     choice_pullup (newyp, CH_PARTIAL);
                   1161:     for (y = newyp -> yp_type; y; y = y ->yp_next)
                   1162:        if (y -> yp_flags & YP_COMPONENTS)
                   1163:            undo_components_set (y, level, arg, narg, Vflag);
                   1164:        else
                   1165:            undo_type_member (y, level, arg, narg, Vflag);
                   1166:     choice_pullup (newyp, CH_FULLY);
                   1167: }

unix.superglobalmegacorp.com

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