Annotation of 43BSDReno/contrib/isode-beta/pepy/pepy_do.c, revision 1.1

1.1     ! root        1: /* pepy_do.c - PE parser (yacc-based) building routines */
        !             2: 
        !             3: #ifndef        lint
        !             4: static char *rcsid = "$Header: /f/osi/pepy/RCS/pepy_do.c,v 7.0 89/11/23 22:11:49 mrose Rel $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/pepy/RCS/pepy_do.c,v 7.0 89/11/23 22:11:49 mrose Rel $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       pepy_do.c,v $
        !            12:  * Revision 7.0  89/11/23  22:11:49  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 "pepy.h"
        !            28: #include <ctype.h>
        !            29: #include <stdio.h>
        !            30: 
        !            31: extern struct tuple tuples[];
        !            32: extern int     rflag;
        !            33: 
        !            34: char   *gensym (), *modsym ();
        !            35: 
        !            36: YP     lookup_type (), lookup_binding ();
        !            37: YT     lookup_tag ();
        !            38: char   *add_point ();
        !            39: 
        !            40: /*  */
        !            41: 
        !            42: do_type (yp, level, id, arg)
        !            43: register YP    yp;
        !            44: register int   level;
        !            45: register char  *id,
        !            46:               *arg;
        !            47: {
        !            48:     register int    i;
        !            49:     register char  *narg;
        !            50:     char   *narg2,
        !            51:           *narg3;
        !            52:     register struct tuple *t;
        !            53:     register YP     y;
        !            54:     register YV     yv;
        !            55:     char          *class, *value, *form;
        !            56:     char           tbuf1[32], tbuf2[32];
        !            57:     int                    pushdown = 0;
        !            58: 
        !            59:     if (yp -> yp_flags & YP_COMPONENTS) {
        !            60:        warning ("I shouldn't be here!");
        !            61:        return;
        !            62:     }
        !            63: 
        !            64:     if (level == 1) {
        !            65:        printf ("(pe, explicit, len, buffer, parm)\n");
        !            66:        printf ("%sPE     *pe;\nint\texplicit;\n",
        !            67:                yp -> yp_code != YP_ANY
        !            68:                    && yp -> yp_code != YP_NULL
        !            69:                    && (yp -> yp_code != YP_CHOICE
        !            70:                        || (yp -> yp_flags & YP_CONTROLLED))
        !            71:                ? "register " : "");
        !            72:        printf ("integer\tlen;\nchar   *buffer;\n%s parm;\n{\n",
        !            73:                yp -> yp_param_type ? yp -> yp_param_type : "PEPYPARM");
        !            74: 
        !            75:        if (yp -> yp_action0) {
        !            76:            if (!Pflag && *sysin)
        !            77:                printf ("# line %d \"%s\"\n", yp -> yp_act0_lineno, sysin);
        !            78:            printf ("%*s%s\n", level * 4, "", yp -> yp_action0);
        !            79:        }
        !            80:     }
        !            81: 
        !            82:     pushdown = (yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) == YP_TAG;
        !            83:     
        !            84:     for (t = tuples; t -> t_type != YP_UNDF; t++)
        !            85:        if (t -> t_type == yp -> yp_code) {
        !            86:            class = t -> t_class;
        !            87:            value = t -> t_id;
        !            88:            if((form = t -> t_form) == NULL)
        !            89:                form = "PE_FORM_PRIM";
        !            90:            break;
        !            91:        }
        !            92:     if ((yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) == (YP_TAG | YP_IMPLICIT)) {
        !            93:        (void) sprintf (tbuf2, "PE_CLASS_%s",
        !            94:                    pe_classlist[yp -> yp_tag -> yt_class]);
        !            95:        class = tbuf2;
        !            96:        (void) sprintf (tbuf1, "%d",val2int (yp -> yp_tag -> yt_value));
        !            97:        value = tbuf1;
        !            98:     }
        !            99: 
        !           100:     switch (yp -> yp_code) {
        !           101:        case YP_BOOL:
        !           102:            printf ("%*sregister int %s = %s;\n\n", level * 4, "",
        !           103:                    narg = gensym (), yp -> yp_intexp ? yp -> yp_intexp
        !           104:                                            : level == 1 ? "len" : "0");
        !           105:            break;
        !           106:        case YP_INT:
        !           107:        case YP_INTLIST:
        !           108:        case YP_ENUMLIST:
        !           109:            printf ("%*sregister integer %s = %s;\n\n", level * 4, "",
        !           110:                    narg = gensym (), yp -> yp_intexp ? yp -> yp_intexp
        !           111:                                            : level == 1 ? "len" : "0");
        !           112:            break;
        !           113: 
        !           114:        case YP_REAL:
        !           115:            printf ("%*sregister double %s = 0.0;\n\n", level * 4, "",
        !           116:                    narg = gensym ());
        !           117:            if (yp -> yp_strexp)
        !           118:                    printf ("%*s%s = %s;\n", level * 4, "", narg,
        !           119:                            yp -> yp_strexp);
        !           120:            break;
        !           121: 
        !           122:        case YP_BIT:
        !           123:        case YP_BITLIST:
        !           124:            printf ("%*sPE\t%s_z = NULLPE;\n", level * 4, "",
        !           125:                    narg = gensym ());
        !           126:            printf ("%*sregister PE *%s = &%s_z;\n\n", level * 4, "",
        !           127:                    narg, narg);
        !           128:            narg = add_point (narg);
        !           129:            printf ("%*schar *%s;\n%*sint %s;\n", level * 4, "",
        !           130:                    narg2 = gensym (), level * 4, "", narg3 = gensym ());
        !           131: 
        !           132:            if (yp -> yp_strexp)
        !           133:                printf ("%*s%s = %s;\n%*s%s = %s;\n", level * 4, "",
        !           134:                    narg2, yp -> yp_strexp, level * 4, "", narg3,
        !           135:                    yp -> yp_intexp);
        !           136:            else
        !           137:            if (level == 1)
        !           138:                printf ("%*s%s = buffer;\n%*s%s = len;\n", level * 4, "",
        !           139:                    narg2, level * 4, "", narg3);
        !           140:            else
        !           141:                printf ("%*s%s = NULLCP;\n%*s%s = 0;\n", level * 4, "",
        !           142:                    narg2, level * 4, "", narg3);
        !           143:            printf ("%*s%s = %s ? strb2bitstr (%s, %s, %s, %s) : NULLPE;\n",
        !           144:                level * 4, "", narg, narg2, narg2, narg3, class, value);
        !           145:            break;
        !           146: 
        !           147:        case YP_OCT:
        !           148:            narg = gensym ();
        !           149:            if (yp -> yp_prfexp != 'q') {
        !           150:                printf ("%*sregister char *%s;\n%*sint %s_len;\n\n",
        !           151:                        level * 4, "", narg, level * 4, "", narg);
        !           152:                if (yp -> yp_strexp) {
        !           153:                    printf ("%*s%s = %s;\n", level * 4, "",
        !           154:                            narg, yp -> yp_strexp);
        !           155:                    if (yp -> yp_intexp)
        !           156:                        printf ("%*s%s_len = %s;\n", level * 4, "",
        !           157:                                narg, yp -> yp_intexp);
        !           158:                    else
        !           159:                        printf ("%*s%s_len = strlen (%s);\n", level * 4, "",
        !           160:                                narg, narg);
        !           161:                }
        !           162:                else
        !           163:                    if (level == 1) {
        !           164:                        printf ("%*s%s = buffer;\n", level * 4, "", narg);
        !           165:                        printf ("%*sif ((%s_len = len) == 0)\n", level * 4, "",
        !           166:                                narg);
        !           167:                        printf ("%*s%s_len = strlen (%s);\n",
        !           168:                                (level + 1) * 4, "", narg, narg);
        !           169:                    }
        !           170:                    else
        !           171:                        printf ("%*s%s = NULLCP;\n%*s%s_len = 0;\n",
        !           172:                                level * 4, "", narg, level * 4, "", narg);
        !           173:            }
        !           174:            else {
        !           175:                printf ("%*sregister struct qbuf *%s;\n\n",
        !           176:                        level * 4, "", narg);
        !           177:                printf ("%*s%s = %s;\n", level * 4, "", narg, yp -> yp_strexp);
        !           178:            }
        !           179:            break;
        !           180: 
        !           181:        case YP_SEQ:
        !           182:        case YP_SET:
        !           183:        case YP_ANY:
        !           184:            if (yp -> yp_strexp) {
        !           185:                printf ("%*sPE\t%s = %s;\n\n", level * 4, "",
        !           186:                        narg = gensym (), yp -> yp_strexp);
        !           187:                break;
        !           188:            }
        !           189:            /* else fall */
        !           190:        case YP_NULL:
        !           191:        case YP_IDEFINED:
        !           192:            narg = NULL;
        !           193:            break;
        !           194: 
        !           195:        case YP_CHOICE:
        !           196:            if (yp -> yp_type && yp -> yp_control)
        !           197:                printf ("%*sint\t%s;\n\n", level * 4, "", narg2 = gensym ());
        !           198:            narg = NULL;
        !           199:            break;
        !           200: 
        !           201:        case YP_OID:
        !           202:            printf ("%*sregister OID %s;\n\n", level * 4, "",
        !           203:                    narg = gensym ());
        !           204:            if (yp -> yp_strexp)
        !           205:                printf ("%*s%s = %s;\n", level * 4, "", narg, yp -> yp_strexp);
        !           206:            else if (level == 1)
        !           207:                printf ("%*s%s = buffer ? str2oid (buffer) : NULLOID;\n",
        !           208:                    level * 4, "", narg);
        !           209:            else
        !           210:                printf ("%*s%s = NULLOID;\n", level * 4, "", narg);
        !           211:            break;
        !           212: 
        !           213:        case YP_SEQTYPE:
        !           214:        case YP_SETTYPE:
        !           215:            printf ("%*sPE\t%s = NULLPE;\n", level * 4, "",
        !           216:                    narg2 = gensym ());
        !           217:            /* and fall ... */
        !           218:        case YP_SEQLIST:
        !           219:        case YP_SETLIST:
        !           220:            printf ("%*sPE\t%s_z = NULLPE;\n", level * 4, "",
        !           221:                    narg = gensym ());
        !           222:            printf ("%*sregister PE *%s = &%s_z;\n\n", level * 4, "",
        !           223:                    narg, narg);
        !           224:            narg = add_point(narg);
        !           225:            break;
        !           226: 
        !           227:        default:
        !           228:            myyerror ("unknown type: %d", yp -> yp_code);
        !           229:     }
        !           230: 
        !           231:     switch (yp -> yp_code) {
        !           232:        case YP_SEQ:
        !           233:        case YP_SET:
        !           234:            if (yp -> yp_strexp)
        !           235:                break;
        !           236:            /* else fall */
        !           237:        case YP_SEQTYPE:
        !           238:        case YP_SETTYPE:
        !           239:        case YP_SEQLIST:
        !           240:        case YP_SETLIST:
        !           241:        case YP_NULL:
        !           242:            printf ("%*sif ((%s = pe_alloc (%s, %s, %s)) == NULLPE) {\n",
        !           243:                    level * 4, "", arg, class, form, value);
        !           244:            printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
        !           245:                    (level + 1) * 4, "", id);
        !           246:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           247:                    level * 4, "");
        !           248:            break;
        !           249:     }
        !           250: 
        !           251:     if (!dflag && yp -> yp_action05)
        !           252:        do_action (yp -> yp_action05, level, narg ? narg : arg,
        !           253:                yp -> yp_act05_lineno);
        !           254:     if (!dflag && yp -> yp_action1)
        !           255:        do_action (yp -> yp_action1, level, narg ? narg : arg,
        !           256:                yp -> yp_act1_lineno);
        !           257: 
        !           258:     switch (yp -> yp_code) {
        !           259:        case YP_BOOL:
        !           260:            printf ("%*sif ((%s = flag2prim (%s, %s, ",
        !           261:                    level * 4, "", arg, narg, class);
        !           262:            printf ("%s)) == NULLPE) {\n", value);
        !           263:            printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
        !           264:                    (level + 1) * 4, "", id);
        !           265:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           266:                    level * 4, "");
        !           267:            break;
        !           268: 
        !           269:        case YP_INT:
        !           270:        case YP_INTLIST:
        !           271:        case YP_ENUMLIST:
        !           272:            printf ("%*sif ((%s = %snum2prim (%s, %s, ",
        !           273:                    level * 4, "", arg,
        !           274:                    yp->yp_code == YP_ENUMLIST ? "e" : "",
        !           275:                    narg, class);
        !           276:            printf ("%s)) == NULLPE) {\n", value);
        !           277:            printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
        !           278:                    (level + 1) * 4, "", id);
        !           279:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           280:                    level * 4, "");
        !           281:            if (yp -> yp_code == YP_INT)
        !           282:                break;
        !           283:            uniqint (yp -> yp_value);
        !           284:            printf ("%*sswitch (%s) {\n", level * 4, "", narg);
        !           285:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !           286:                printf ("%*scase %d:", (level + 1) * 4, "", val2int (yv));
        !           287:                if (yv -> yv_flags & YV_NAMED)
        !           288:                    printf ("\t/* %s */", yv -> yv_named);
        !           289:                printf ("\n");
        !           290:                if (!dflag && yv -> yv_action)
        !           291:                    do_action (yv -> yv_action, level + 2, narg,
        !           292:                                yv -> yv_act_lineno);
        !           293:                printf ("%*sbreak;\n", (level + 2) * 4, "");
        !           294:            }
        !           295:            if (!rflag && yp -> yp_code == YP_ENUMLIST) {
        !           296:                printf ("%*sdefault:\n", (level + 1) * 4, "");
        !           297:                printf ("%*sadvise (NULLCP, \"%s %%s%%d\", PEPY_ERR_UNK_COMP, %s);\n",
        !           298:                        (level + 2) * 4, "", id, narg);
        !           299:                printf ("%*sreturn NOTOK;\n", (level + 2) * 4, "");
        !           300:            }
        !           301:            printf ("%*s}\n", level * 4, "");
        !           302:            break;
        !           303: 
        !           304:        case YP_REAL:
        !           305:            printf ("%*sif ((%s = real2prim (%s, %s, ",
        !           306:                    level * 4, "", arg, narg, class);
        !           307:            printf ("%s)) == NULLPE) {\n", value);
        !           308:            printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
        !           309:                    (level + 1) * 4, "", id);
        !           310:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           311:                    level * 4, "");
        !           312:            break;
        !           313: 
        !           314:        case YP_BIT:
        !           315:        case YP_BITLIST:
        !           316:            printf ("%*sif (%s == NULLPE) {\n", level * 4, "", narg);
        !           317:            printf ("%*sadvise (NULLCP, \"%s %%s\", PEPY_ERR_INIT_FAILED);\n",
        !           318:                    (level + 1) * 4, "", id);
        !           319:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           320:                    level * 4, "");
        !           321:            if (!yp -> yp_strexp && level != 1)
        !           322:                printf ("%*s%s -> pe_class = %s;\n%*s%s -> pe_id = %s;\n",
        !           323:                    level * 4, "", narg, class, level * 4, "", narg, value);
        !           324:            if (yp -> yp_code == YP_BITLIST) {
        !           325:                register int    j;
        !           326: 
        !           327:                for (yv = yp -> yp_value, i = -1; yv; yv = yv -> yv_next)
        !           328:                    if ((j = val2int (yv)) > i)
        !           329:                        i = j;
        !           330:                if (i >= 0)
        !           331:                    printf ("%*sif (bit_test (%s, %d) == NOTOK)\n%*s(void) bit_off (%s, %d);\n",
        !           332:                            level * 4, "", narg, i,
        !           333:                            (level + 1) * 4, "", narg, i);
        !           334:            }
        !           335:            printf ("%*sif ((%s = bit2prim (%s)) == NULLPE) {\n",
        !           336:                    level * 4, "", arg, narg);
        !           337:            printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
        !           338:                    (level + 1) * 4, "", id);
        !           339:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           340:                    level * 4, "");
        !           341:            if (yp -> yp_code == YP_BIT)
        !           342:                break;
        !           343:            printf ("#define\tBITS\t\"\\020");
        !           344:            for (yv = yp -> yp_value; yv; yv = yv -> yv_next)
        !           345:                if (yv -> yv_flags & YV_NAMED)
        !           346:                    printf ("\\0%o%s", val2int (yv) + 1, yv -> yv_named);
        !           347:                else
        !           348:                    printf ("\\0%oBIT%d", val2int (yv) + 1, val2int (yv));
        !           349:            printf ("\"\n");
        !           350:            uniqint (yp -> yp_value);
        !           351:            if (!dflag)
        !           352:                for (yv = yp -> yp_value; yv; yv = yv -> yv_next) {
        !           353:                    if (!yv -> yv_action)
        !           354:                        continue;
        !           355:                    printf ("%*sif (bit_test (%s, %d) > OK) {",
        !           356:                            level * 4, "", narg, val2int (yv));
        !           357:                    if (yv -> yv_flags & YV_NAMED)
        !           358:                        printf ("\t/* %s */", yv -> yv_named);
        !           359:                    printf ("\n");
        !           360:                    do_action (yv -> yv_action, level + 1, narg,
        !           361:                               yv -> yv_act_lineno);
        !           362:                    printf ("%*s}\n", level * 4, "");
        !           363:                }
        !           364:            break;
        !           365: 
        !           366:        case YP_OCT:
        !           367:            printf ("%*sif (%s == %s) {\n",
        !           368:                    level * 4, "", narg, 
        !           369:                    yp -> yp_prfexp != 'q' ? "NULLCP" : "((struct qbuf *) 0)");
        !           370:            printf ("%*sadvise (NULLCP, \"%s %%s\", PEPY_ERR_INIT_FAILED);\n",
        !           371:                    (level + 1) * 4, "", id);
        !           372:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           373:                    level * 4, "");
        !           374:            printf ("%*sif ((%s = ", level * 4, "", arg);
        !           375:            if (yp -> yp_prfexp != 'q')
        !           376:                printf ("str2prim (%s, %s_len,", narg, narg);
        !           377:            else
        !           378:                printf ("qb2prim (%s,", narg);
        !           379:            printf (" %s, %s)) == NULLPE) {\n", class, value);
        !           380:            printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
        !           381:                    (level + 1) * 4, "", id);
        !           382:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           383:                    level * 4, "");
        !           384:            break;
        !           385: 
        !           386:        case YP_NULL:
        !           387:            break;
        !           388: 
        !           389:        case YP_ANY:
        !           390:        case YP_SEQ:
        !           391:        case YP_SET:
        !           392:            if (!yp -> yp_strexp)
        !           393:                break;
        !           394:            printf ("%*sif (%s == NULLPE) {\n", level * 4, "", narg);
        !           395:            printf ("%*sadvise (NULLCP, \"%s %%s\", PEPY_ERR_INIT_FAILED);\n",
        !           396:                    (level + 1) * 4, "", id);
        !           397:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           398:                    level * 4, "");
        !           399: #ifdef notdef
        !           400:            printf ("%*sif ((%s = pe_cpy (%s)) == NULLPE) {\n",
        !           401:                    level * 4, "", arg, narg);
        !           402:            printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
        !           403:                    (level + 1) * 4, "", id);
        !           404:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           405:                    level * 4, "");
        !           406: #else
        !           407:            printf ("%*s(%s = %s) -> pe_refcnt++;\n",
        !           408:                    level * 4, "", arg, narg);
        !           409: #endif
        !           410:            break;
        !           411: 
        !           412:        case YP_OID:
        !           413:            printf ("%*sif (%s == NULLOID) {\n", level * 4, "", narg);
        !           414:            printf ("%*sadvise (NULLCP, \"%s %%s\", PEPY_ERR_INIT_FAILED);\n",
        !           415:                    (level + 1) * 4, "", id);
        !           416:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           417:                    level * 4, "");
        !           418:            printf ("%*sif ((%s = obj2prim (%s, %s, %s)) == NULLPE) {\n",
        !           419:                    level * 4, "", arg, narg, class, value);
        !           420:            printf ("%*sadvise (NULLCP, \"%s: %%s\", PEPY_ERR_NOMEM);\n",
        !           421:                    (level + 1) * 4, "", id);
        !           422:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 1) * 4, "",
        !           423:                    level * 4, "");
        !           424:            break;
        !           425: 
        !           426:        case YP_SEQTYPE:
        !           427:            if (yp -> yp_type && yp -> yp_control) {
        !           428:                printf ("%*sfor (%s) {\n",
        !           429:                        level * 4, "", yp -> yp_control);
        !           430:                if (!dflag && yp -> yp_action3) {
        !           431:                    do_action (yp -> yp_action3, ++level, narg ? narg : arg,
        !           432:                                yp -> yp_act3_lineno);
        !           433:                    printf ("%*s{\n", level * 4, "");
        !           434:                }
        !           435:                do_type (yp -> yp_type, level + 1, "element", narg);
        !           436:                if (!dflag && yp -> yp_action3)
        !           437:                    printf ("%*s}\n", level-- * 4, "");
        !           438: #ifndef notdef
        !           439:                printf ("%*sseq_addon (%s, %s, %s);\n", (level + 1) * 4, "",
        !           440:                        arg, narg2, narg);
        !           441:                printf ("%*s%s = %s;\n%*s}\n", (level + 1) * 4, "",
        !           442:                        narg2, narg, level * 4, "");
        !           443: #else
        !           444:                printf ("%*sif (seq_add (%s, %s, -1) == NOTOK) {\n",
        !           445:                        (level + 1) * 4, "", arg, narg);
        !           446:                printf ("%*sadvise (NULLCP, \"%s %%s: %%s\", PEPY_ERR_BAD_SEQ,\n",
        !           447:                        (level + 2) * 4, "", id);
        !           448:                printf ("%*spe_error (%s -> pe_errno));\n", (level + 4) * 4,
        !           449:                        "", arg);
        !           450:                printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
        !           451:                        (level + 1) * 4, "");
        !           452:                printf ("%*s}\n", level * 4, "");
        !           453: #endif
        !           454:            }
        !           455:            break;
        !           456: 
        !           457:        case YP_SEQLIST:
        !           458:            for (y = yp -> yp_type, i = 0; y; y = y -> yp_next, i++) {
        !           459:                if (y -> yp_flags & YP_COMPONENTS)
        !           460:                    do_components_seq (y, level, y -> yp_next == NULLYP,
        !           461:                                       id, arg, narg);
        !           462:                else {
        !           463:                    do_type_element (y, level, y -> yp_next == NULLYP,
        !           464:                                     id, narg);
        !           465:                    printf ("%*sif (%s != NULLPE)\n", level * 4, "", narg);
        !           466:                    printf ("%*sif (seq_add (%s, %s, -1) == NOTOK) {\n",
        !           467:                            (level + 1) * 4, "", arg, narg);
        !           468:                    printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SEQ,\n",
        !           469:                            (level + 2) * 4, "", id);
        !           470:                    printf ("%*spe_error (%s -> pe_errno));\n", (level + 4) * 4,
        !           471:                            "", arg);
        !           472:                    printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
        !           473:                            (level + 1) * 4, "");
        !           474:                }
        !           475:            }
        !           476:            for (y = yp -> yp_type; y; y = y -> yp_next) {
        !           477:                register YP     z;
        !           478: 
        !           479:                if (!(y -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
        !           480:                        || lookup_tag (y) == NULLYT)
        !           481:                    continue;
        !           482:                for (z = y -> yp_next; z; z = z -> yp_next)
        !           483:                    if (!(z -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
        !           484:                            || lookup_tag (z) == NULLYT)
        !           485:                        break;
        !           486:                uniqtag (y, z);
        !           487:                if (z == NULLYP)
        !           488:                    break;
        !           489:                y = z;
        !           490:            }
        !           491:            break;
        !           492: 
        !           493:        case YP_SETTYPE:
        !           494:            if (yp -> yp_type && yp -> yp_control) {
        !           495:                printf ("%*sfor (%s) {\n",
        !           496:                        level * 4, "", yp -> yp_control);
        !           497:                if (!dflag && yp -> yp_action3) {
        !           498:                    do_action (yp -> yp_action3, ++level, narg ? narg : arg,
        !           499:                                yp -> yp_act3_lineno);
        !           500:                    printf ("%*s{\n", level * 4, "");
        !           501:                }
        !           502:                do_type (yp -> yp_type, level + 1, "member", narg);
        !           503:                if (!dflag && yp -> yp_action3)
        !           504:                    printf ("%*s}\n", level-- * 4, "");
        !           505: #ifndef notdef
        !           506:                printf ("%*sset_addon (%s, %s, %s);\n", (level + 1) * 4, "",
        !           507:                        arg, narg2, narg);
        !           508:                printf ("%*s%s = %s;\n%*s}\n", (level + 1) * 4, "",
        !           509:                        narg2, narg, level * 4, "");
        !           510: #else
        !           511:                printf ("%*sif (seq_add (%s, %s, -1) == NOTOK) {\n",
        !           512:                        (level + 1) * 4, "", arg, narg);
        !           513:                printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SET,\n",
        !           514:                        (level + 2) * 4, "", id);
        !           515:                printf ("%*spe_error (%s -> pe_errno));\n", (level + 4) * 4,
        !           516:                        "", arg);
        !           517:                printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
        !           518:                        (level + 1) * 4, "");
        !           519:                printf ("%*s}\n", level * 4, "");
        !           520: #endif
        !           521:            }
        !           522:            break;
        !           523: 
        !           524:        case YP_SETLIST:
        !           525:            if (yp -> yp_type) {
        !           526:                for (y = yp -> yp_type; y; y = y -> yp_next) {
        !           527:                    if (y -> yp_flags & YP_COMPONENTS)
        !           528:                        do_components_set (y, level, id, arg, narg);
        !           529:                    else {
        !           530:                        do_type_member (y, level, narg);
        !           531:                        printf ("%*sif (%s != NULLPE)\n", level * 4, "", narg);
        !           532:                        printf ("%*sif (set_add (%s, %s) == NOTOK) {\n",
        !           533:                                (level + 1) * 4, "", arg, narg);
        !           534:                        printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SET,\n",
        !           535:                                (level + 2) * 4, "", id);
        !           536:                        printf ("%*spe_error (%s -> pe_errno));\n",
        !           537:                                (level + 4) * 4, "", arg);
        !           538:                        printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
        !           539:                                (level + 1) * 4, "");
        !           540:                    }
        !           541:                }
        !           542:                                /* now pull up fully to check uniqueness */
        !           543:                choice_pullup (y = copy_type (yp), CH_FULLY);
        !           544:                uniqtag (y -> yp_type, NULLYP);
        !           545:            }
        !           546:            break;
        !           547: 
        !           548:        case YP_CHOICE:
        !           549:            if (yp -> yp_type && yp -> yp_control) {
        !           550:                printf ("%*sswitch (%s = (%s)) {\n",
        !           551:                        level * 4, "", narg2, yp -> yp_control);
        !           552:                for (y = yp -> yp_type, i = 0; y; y = y -> yp_next)
        !           553:                    do_type_choice (y, ++i, level + 1, arg);
        !           554:                choice_pullup (yp, CH_FULLY);
        !           555:                uniqtag (yp -> yp_type, NULLYP);
        !           556:                printf ("\n%*sdefault:\n", (level + 1) * 4, "");
        !           557:                printf ("%*sadvise (NULLCP, \"%s %%s%%d\", PEPY_ERR_INVALID_CHOICE, \n",
        !           558:                        (level + 2) * 4, "", id);
        !           559:                printf ("%*s%s);\n", (level + 4) * 4, "", narg2);
        !           560:                printf ("%*sreturn NOTOK;\n", (level + 2) * 4, "");
        !           561:                printf ("%*s}\n", level * 4, "");
        !           562:                if ((yp -> yp_flags & YP_TAG)
        !           563:                        && !(yp -> yp_flags & YP_PULLEDUP))
        !           564:                    tag_pushdown (yp, level, arg, "choice");
        !           565:            }
        !           566:            break;
        !           567: 
        !           568:        case YP_IDEFINED:
        !           569:            printf ("%*sif (%s (", level * 4, "", modsym (yp -> yp_module,
        !           570:                    yp -> yp_identifier, YP_ENCODER));
        !           571:            i = strlen (arg) - 3;
        !           572:            printf ("%*.*s, 0, ", i, i, arg + 2);
        !           573:            if (yp -> yp_intexp)
        !           574:                printf ("%s, ", yp -> yp_intexp);
        !           575:            else if (level == 1)
        !           576:                printf ("len, ");
        !           577:            else
        !           578:                printf ("NULLINT, ");
        !           579:            if (yp -> yp_strexp)
        !           580:                printf ("%s", yp -> yp_strexp);
        !           581:            else if (level == 1)
        !           582:                printf ("buffer");
        !           583:            else
        !           584:                printf ("NULLCP");
        !           585:            if (yp -> yp_flags & YP_PARMVAL)
        !           586:                printf (", %s", yp -> yp_parm);
        !           587:            else
        !           588:                printf (", NullParm");
        !           589:            printf (") == NOTOK)\n%*sreturn NOTOK;\n", (level + 1) * 4, "");
        !           590:            if ((yp -> yp_flags & (YP_TAG | YP_IMPLICIT))
        !           591:                      == (YP_TAG | YP_IMPLICIT)) {
        !           592:                if (is_nonimplicit_type (yp))
        !           593:                    pushdown = 1;
        !           594:                else {
        !           595:                    printf ("%*s%s -> pe_class = %s;\n", level * 4, "",
        !           596:                            arg, class);
        !           597:                    printf ("%*s%s -> pe_id = %s;\n", level * 4, "",
        !           598:                            arg, value);
        !           599:                }
        !           600:            }
        !           601:            break;
        !           602: 
        !           603:        default:
        !           604:            myyerror ("unknown type: %d", yp -> yp_code);
        !           605:     }
        !           606:     if (pushdown && !(yp -> yp_flags & YP_PULLEDUP)) {
        !           607:        switch (yp -> yp_code) { /* sets & seqs are implicit implicit's? */
        !           608:            case YP_CHOICE:
        !           609:                break;
        !           610: 
        !           611:            default:
        !           612:                tag_pushdown (yp, level, arg, id);
        !           613:                break;
        !           614:            }
        !           615:     }
        !           616: 
        !           617:     printf ("\n#ifdef DEBUG\n%*s(void) testdebug (%s, \"",
        !           618:            level * 4, "", arg);
        !           619:     if (level == 1)
        !           620:        printf ("%s.", mymodule);
        !           621:     printf ("%s\");\n#endif\n\n", id);
        !           622: 
        !           623:     if (!dflag && yp -> yp_action2)
        !           624:        do_action (yp -> yp_action2, level, arg, yp -> yp_act2_lineno);
        !           625: 
        !           626:     switch (yp -> yp_code) {
        !           627:        case YP_BITLIST:
        !           628:            printf ("#undef\tBITS\n");
        !           629:            break;
        !           630: 
        !           631:        default:
        !           632:            break;
        !           633:     }
        !           634: }
        !           635: 
        !           636: 
        !           637: static char *add_point (arg)
        !           638: char *arg;
        !           639: {
        !           640:     char    buffer[BUFSIZ];
        !           641: 
        !           642:     (void) sprintf (buffer, "(*%s)", arg);
        !           643:     return new_string (buffer);
        !           644: }
        !           645: 
        !           646: /*  */
        !           647: 
        !           648: static  do_type_member (yp, level, narg)
        !           649: register YP     yp;
        !           650: register int    level;
        !           651: char   *narg;
        !           652: {
        !           653:     int     pushdown = (yp -> yp_flags & (YP_TAG | YP_IMPLICIT)) == YP_TAG;
        !           654:     char   *id = yp -> yp_flags & YP_ID ? yp -> yp_id : "member";
        !           655: 
        !           656:     if (!(yp -> yp_flags & YP_TAG)) {
        !           657:        switch (yp -> yp_code) {
        !           658:            case YP_CHOICE:
        !           659:                break;
        !           660:            case YP_IDEFINED:
        !           661:                if (lookup_tag (yp) == NULLYT)
        !           662:                    break;
        !           663:                /* else drop ... */
        !           664:            default:
        !           665:                tag_type (yp);
        !           666:                break;
        !           667:        }
        !           668:     }
        !           669:     printf ("%*s%s = NULLPE;\n\n", level * 4, "", narg);
        !           670:     if (yp -> yp_flags & (YP_OPTIONAL | YP_DEFAULT)) {
        !           671:        if (yp -> yp_flags & YP_OPTCONTROL)
        !           672:            printf ("%*sif (%s) {\n", level * 4, "", yp -> yp_optcontrol);
        !           673:        else
        !           674:            return;
        !           675:     }
        !           676:     else
        !           677:        printf ("%*s{\n", level * 4, "");
        !           678: 
        !           679:     level++;
        !           680:     yp -> yp_flags |= YP_PULLEDUP;
        !           681: 
        !           682:     do_type (yp, level, id, narg);
        !           683: 
        !           684:     if (pushdown)
        !           685:        tag_pushdown (yp, level, narg, id);
        !           686: 
        !           687:     level--;
        !           688:     printf ("%*s}\n", level * 4, "");
        !           689: }
        !           690: 
        !           691: 
        !           692: /*  */
        !           693: 
        !           694: static  do_type_choice (yp, caseindex, level, narg)
        !           695: register YP     yp;
        !           696: register int    caseindex,
        !           697:                level;
        !           698: register char  *narg;
        !           699: {
        !           700:     int     pushdown = (yp -> yp_flags & YP_TAG)
        !           701:                            && !(yp -> yp_flags & YP_IMPLICIT);
        !           702:     char   *id = yp -> yp_flags & YP_ID ? yp -> yp_id : "member";
        !           703: 
        !           704:     printf ("%*scase %d:", level * 4, "", caseindex);
        !           705:     if (yp -> yp_flags & YP_ID)
        !           706:        printf ("\t/* %s */", yp -> yp_id);
        !           707:     printf ("\n");
        !           708:     level++;
        !           709: 
        !           710:     printf ("%*s{\n", level * 4, "");
        !           711:     level++;
        !           712: 
        !           713:     yp -> yp_flags |= YP_PULLEDUP;
        !           714: 
        !           715:     do_type (yp, level, id, narg);
        !           716: 
        !           717:     if (pushdown) {
        !           718:        tag_pushdown (yp, level, narg, id);
        !           719:     }
        !           720: 
        !           721:     level--;
        !           722:     printf ("%*s}\n%*sbreak;\n", level * 4, "", level * 4, "");
        !           723: }
        !           724: 
        !           725: /*  */
        !           726: 
        !           727: do_action (action, level, arg, lineno)
        !           728: register char  *action,
        !           729:               *arg;
        !           730: register int level;
        !           731: int    lineno;
        !           732: {
        !           733:     register char   c,
        !           734:                    d;
        !           735: 
        !           736:     printf ("%*s{\n", level * 4, "");
        !           737: 
        !           738:     if (!Pflag && *sysin)
        !           739:        printf ("# line %d \"%s\"\n", lineno, sysin);
        !           740: 
        !           741:     for (d = NULL; c = *action++; d = c)
        !           742:        switch (d) {
        !           743:            case '$':
        !           744:                if (c == '$') {
        !           745:                    printf ("%s", arg);
        !           746:                    c = NULL;
        !           747:                    break;
        !           748:                }
        !           749:                putchar ('$');  /* fall */
        !           750: 
        !           751:            default:
        !           752:                if (c != '$')
        !           753:                    putchar (c);
        !           754:                break;
        !           755:        }
        !           756: 
        !           757:     switch (d) {
        !           758:        case '\n':
        !           759:            break;
        !           760: 
        !           761:        case '$':
        !           762:            putchar ('$');      /* fall */
        !           763:        default:
        !           764:            putchar ('\n');
        !           765:            break;
        !           766:     }
        !           767: 
        !           768:     printf ("%*s}\n", level * 4, "");
        !           769: }
        !           770: 
        !           771: /*  */
        !           772: 
        !           773: /* ARGSUSED */
        !           774: 
        !           775: static  do_type_element (yp, level, last, id, narg)
        !           776: register YP     yp;
        !           777: register int    level;
        !           778: int     last;
        !           779: char   *id;
        !           780: register char  *narg;
        !           781: {
        !           782:     printf ("%*s%s = NULLPE;\n\n", level * 4, "", narg);
        !           783:     if (yp -> yp_flags & (YP_OPTIONAL | YP_DEFAULT)) {
        !           784:        if (yp -> yp_flags & YP_OPTCONTROL)
        !           785:            printf ("%*sif (%s) {", level * 4, "", yp -> yp_optcontrol);
        !           786:        else
        !           787:            return;
        !           788:     }
        !           789:     else {
        !           790:        printf ("%*s{", level * 4, "");
        !           791:     }
        !           792:     level++;
        !           793:     if (yp -> yp_flags & YP_ID)
        !           794:        printf ("\t/* %s */", yp -> yp_id);
        !           795:     printf ("\n");
        !           796:     do_type (yp, level, yp -> yp_flags & YP_ID ? yp -> yp_id : "element",
        !           797:            narg);
        !           798: 
        !           799:     level--;
        !           800:     printf ("%*s}\n\n", level * 4, "");
        !           801: }
        !           802: 
        !           803: static do_components_seq (yp, level, last, id, arg, narg)
        !           804: YP     yp;
        !           805: register int level;
        !           806: register char  *id,
        !           807:                *arg,
        !           808:                *narg;
        !           809: {
        !           810:     YP newyp, y;
        !           811: 
        !           812:     if (yp -> yp_module) {
        !           813:        pyyerror (yp, "Can't do COMPONENTS OF with external types for %s",
        !           814:                  yp -> yp_identifier);
        !           815:        return;
        !           816:     }
        !           817: 
        !           818:     if (!(newyp = lookup_type (yp->yp_module, yp -> yp_identifier))) {
        !           819:        pyyerror (yp, "Can't find refernced COMPONENTS OF");
        !           820:        return;
        !           821:     }
        !           822: 
        !           823:     if (newyp -> yp_code != YP_SEQLIST) {
        !           824:        yyerror_aux ("COMPONENTS OF type is not a SEQUENCE");
        !           825:        print_type (yp, 0);
        !           826:        return;
        !           827:     }
        !           828:     for (y = newyp -> yp_type; y; y = y -> yp_next) {
        !           829:        if (y -> yp_flags & YP_COMPONENTS)
        !           830:            do_components_seq (y, level, last && y -> yp_next == NULLYP,
        !           831:                               id, arg, narg);
        !           832:        else {
        !           833:            do_type_element (y, level, last && y -> yp_next == NULLYP,
        !           834:                             id, narg);
        !           835:            printf ("%*sif (%s != NULLPE)\n", level * 4, "", narg);
        !           836:            printf ("%*sif (seq_add (%s, %s, -1) == NOTOK) {\n",
        !           837:                    (level + 1) * 4, "", arg, narg);
        !           838:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SEQ,\n",
        !           839:                    (level + 2) * 4, "", id);
        !           840:            printf ("%*spe_error (%s -> pe_errno));\n", (level + 4) * 4,
        !           841:                    "", arg);
        !           842:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
        !           843:                    (level + 1) * 4, "");
        !           844:        }
        !           845:     }
        !           846:     for (y = newyp -> yp_type; y; y = y -> yp_next) {
        !           847:        register YP     z;
        !           848: 
        !           849:        if (!(y -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
        !           850:            || lookup_tag (y) == NULLYT)
        !           851:            continue;
        !           852:        for (z = y -> yp_next; z; z = z -> yp_next)
        !           853:            if (!(z -> yp_flags & (YP_OPTIONAL | YP_DEFAULT))
        !           854:                || lookup_tag (z) == NULLYT)
        !           855:                break;
        !           856:        uniqtag (y, z);
        !           857:        if (z == NULLYP)
        !           858:            break;
        !           859:        y = z;
        !           860:     }
        !           861:     return;
        !           862: }
        !           863: 
        !           864: 
        !           865: 
        !           866: static  do_components_set (yp, level, arg, id, narg)
        !           867: register YP     yp;
        !           868: register int    level;
        !           869: char   *narg, *arg, *id;
        !           870: {
        !           871: 
        !           872:     YP newyp, y;
        !           873: 
        !           874:     if (yp -> yp_module) {
        !           875:        pyyerror (yp, "Can't do COMPONENTS OF with external types for %s",
        !           876:                  yp -> yp_identifier);
        !           877:        return;
        !           878:     }
        !           879: 
        !           880:     if (!(newyp = lookup_type (yp->yp_module, yp -> yp_identifier))) {
        !           881:        pyyerror (yp, "Can't find refernced COMPONENTS OF");
        !           882:        return;
        !           883:     }
        !           884: 
        !           885:     if (newyp -> yp_code != YP_SETLIST) {
        !           886:        yyerror_aux ("COMPONENTS OF type is not a SET");
        !           887:        print_type (yp, 0);
        !           888:        return;
        !           889:     }
        !           890:     
        !           891:     for (y = newyp -> yp_type; y; y = y -> yp_next) {
        !           892:        if (y -> yp_flags & YP_COMPONENTS)
        !           893:            do_components_set (y, level, arg, id, narg);
        !           894:        else {
        !           895:            do_type_member (y, level, narg);
        !           896:            printf ("%*sif (%s != NULLPE)\n", level * 4, "", narg);
        !           897:            printf ("%*sif (set_add (%s, %s) == NOTOK) {\n",
        !           898:                    (level + 1) * 4, "", arg, narg);
        !           899:            printf ("%*sadvise (NULLCP, \"%s %%s%%s\", PEPY_ERR_BAD_SET,\n",
        !           900:                    (level + 2) * 4, "", id);
        !           901:            printf ("%*spe_error (%s -> pe_errno));\n",
        !           902:                    (level + 4) * 4, "", arg);
        !           903:            printf ("%*sreturn NOTOK;\n%*s}\n", (level + 2) * 4, "",
        !           904:                    (level + 1) * 4, "");
        !           905:        }
        !           906:     }
        !           907:     choice_pullup (newyp, CH_FULLY);
        !           908: }

unix.superglobalmegacorp.com

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