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