Annotation of 43BSDTahoe/new/courier/compiler/code1.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)code1.c    4.2 (Berkeley) 9/27/83";
        !             3: #endif
        !             4: 
        !             5: #include "Courier.h"
        !             6: 
        !             7: char *program_name = "Unknown";
        !             8: int print_level;               /* for pretty-printing C code */
        !             9: 
        !            10: /*
        !            11:  * Return a printable representation of an object (number or string).
        !            12:  */
        !            13: char *
        !            14: obj_rep(o)
        !            15:        struct object *o;
        !            16: {
        !            17:        static char rep[MAXSTR];
        !            18: 
        !            19:        switch (class_of(o)) {
        !            20:        case O_CONSTANT:
        !            21:                sprintf(rep, "%d", o->o_value);
        !            22:                return (rep);
        !            23:        case O_SYMBOL:
        !            24:                return(o->o_name);
        !            25:        default:
        !            26:                yyerror("Internal error in obj_rep: bad object class");
        !            27:                exit(1);
        !            28:                /* NOTREACHED */
        !            29:        }
        !            30: }
        !            31: 
        !            32: program_header(symbol)
        !            33:        struct object *symbol;
        !            34: {
        !            35:        program_name = symbol->o_name;
        !            36:        fprintf(hf,
        !            37: "/*\n\
        !            38:  * Declarations for Courier program %s.\n\
        !            39:  */\n\
        !            40: #include <courier.h>\n",
        !            41:                program_name);
        !            42: 
        !            43:        fprintf(cf1,
        !            44: "/*\n\
        !            45:  * Routines for Courier program %s.\n\
        !            46:  */\n\
        !            47: #include \"%s.h\"\n",
        !            48:                program_name, program_name);
        !            49: 
        !            50:        fprintf(uf,
        !            51: "/*\n\
        !            52:  * User access to Courier program %s.\n\
        !            53:  */\n\
        !            54: #include \"%s_stubs.c\"\n",
        !            55:                program_name, program_name);
        !            56: 
        !            57:        fprintf(sf,
        !            58: "/*\n\
        !            59:  * Server for Courier program %s.\n\
        !            60:  */\n\
        !            61: #include \"%s_stubs.c\"\n",
        !            62:                program_name, program_name);
        !            63: 
        !            64:        if (! explicit)
        !            65:                generate_binding_functions();
        !            66: }
        !            67: 
        !            68: char *
        !            69: pack_function(type)
        !            70:        struct object *type;
        !            71: {
        !            72:        static char buf[MAXSTR];
        !            73: 
        !            74:        if (class_of(type) == O_TYPE)
        !            75:                return (type->t_pfname);
        !            76:        sprintf(buf, "Pack%s", type->o_name);
        !            77:        return (buf);
        !            78: }
        !            79: 
        !            80: char *
        !            81: unpack_function(type)
        !            82:        struct object *type;
        !            83: {
        !            84:        static char buf[MAXSTR];
        !            85: 
        !            86:        if (class_of(type) == O_TYPE)
        !            87:                return (type->t_ufname);
        !            88:        sprintf(buf, "Unpack%s", type->o_name);
        !            89:        return (buf);
        !            90: }
        !            91: 
        !            92: /*
        !            93:  * Generate definitions for types.
        !            94:  */
        !            95: compile_type(symbol, type)
        !            96:        struct object *symbol, *type;
        !            97: {
        !            98:        char *name;
        !            99: 
        !           100:        if (type->t_constr == C_PROCEDURE || type->t_constr == C_ERROR)
        !           101:                return;
        !           102:        name = symbol->o_name;
        !           103:        fprintf(hf, "\ntypedef ");
        !           104:        print_decl(hf, name, type, 0);
        !           105:        fprintf(cf1, "\n#define Pack%s %s\n#define Unpack%s %s\n",
        !           106:                name, pack_function(type), name, unpack_function(type));
        !           107:        declare(&Values, symbol, type);
        !           108: }
        !           109: 
        !           110: /*
        !           111:  * Generate definitions corresponding to constant declarations.
        !           112:  */
        !           113: compile_def(name, type, value)
        !           114:        struct object *name, *type, *value;
        !           115: {
        !           116:        struct object *t;
        !           117: 
        !           118:        t = basetype(type);
        !           119:        if (t->t_constr == C_PROCEDURE)
        !           120:                proc_functions(name->o_name, t, value);
        !           121:        else
        !           122:                fprintf(hf, "\n#define %s %s\n", name->o_name, obj_rep(value));
        !           123:        declare(&Values, name, value);
        !           124:        declare(&Types, name, type);
        !           125: }
        !           126: 
        !           127: /*
        !           128:  * Print a C type declaration for a Courier type.
        !           129:  *
        !           130:  * If the nonewline flag is on, don't follow the declaration
        !           131:  * by ";\n" (used for declaring the return value of a function.)
        !           132:  */
        !           133: print_decl(f, name, type, nonewline)
        !           134:        FILE *f;
        !           135:        char *name;
        !           136:        struct object *type;
        !           137:        int nonewline;
        !           138: {
        !           139:        list p, q;
        !           140:        struct object *t;
        !           141:        char *member;
        !           142:        char newname[MAXSTR];
        !           143: 
        !           144:        if (class_of(type) == O_SYMBOL) {
        !           145:                tab(f); fprintf(f, "%s %s", type->o_name, name);
        !           146:                goto ret;
        !           147:        }
        !           148:        if (class_of(type) != O_TYPE) {
        !           149:                yyerror("Internal error in print_decl: bad object class for %s",
        !           150:                        name);
        !           151:                exit(1);
        !           152:        }
        !           153:        switch (type->t_constr) {
        !           154: 
        !           155:        case C_ENUMERATION:
        !           156:                tab(f); fprintf(f, "enum {\n");
        !           157:                print_level++;
        !           158:                for (p = type->t_list; p != NIL; p = cdr(p)) {
        !           159:                        q = car(p);
        !           160:                        member = name_of(car(q));
        !           161:                        tab(f); fprintf(f, "%s = %s", member, obj_rep(cdr(q)));
        !           162:                        if (cdr(p) != NIL)
        !           163:                                fprintf(f, ",\n");
        !           164:                        else
        !           165:                                fprintf(f, "\n");
        !           166:                }
        !           167:                print_level--;
        !           168:                tab(f); fprintf(f, "} %s", name);
        !           169:                goto ret;
        !           170: 
        !           171:        case C_ARRAY:
        !           172:                sprintf(newname, "%s[%s]", name, obj_rep(type->t_size));
        !           173:                print_decl(f, newname, type->t_basetype, nonewline);
        !           174:                return;
        !           175: 
        !           176:        case C_SEQUENCE:
        !           177:                tab(f); fprintf(f, "struct {\n");
        !           178:                print_level++;
        !           179:                print_decl(f, "length", Cardinal_type, 0);
        !           180:                print_decl(f, "*sequence", type->t_basetype, 0);
        !           181:                print_level--;
        !           182:                tab(f); fprintf(f, "} %s", name);
        !           183:                goto ret;
        !           184: 
        !           185:        case C_RECORD:
        !           186:                if (type->t_list == NIL) {
        !           187:                        /* C complains about this, but accepts it */
        !           188:                        tab(f); fprintf(f, "int %s[0]", name);
        !           189:                        goto ret;
        !           190:                }
        !           191:                tab(f); fprintf(f, "struct {\n");
        !           192:                print_level++;
        !           193:                for (p = type->t_list; p != NIL; p = cdr(p)) {
        !           194:                        t = (struct object *) cdr(car(p));
        !           195:                        for (q = car(car(p)); q != NIL; q = cdr(q))
        !           196:                                print_decl(f, name_of(car(q)), t, 0); 
        !           197:                }
        !           198:                print_level--;
        !           199:                tab(f); fprintf(f, "} %s", name);
        !           200:                goto ret;
        !           201: 
        !           202:        case C_CHOICE:
        !           203:                tab(f); fprintf(f, "struct {\n");
        !           204:                print_level++;
        !           205:                print_decl(f, "designator", type->t_designator, 0);
        !           206:                tab(f); fprintf(f, "union {\n");
        !           207:                print_level++;
        !           208:                for (p = type->t_candidates; p != NIL; p = cdr(p)) {
        !           209:                        t = (struct object *) cdr(car(p));
        !           210:                        for (q = car(car(p)); q != NIL; q = cdr(q)) {
        !           211:                                member = name_of(car(car(q)));
        !           212:                                sprintf(newname, "u_%s", member);
        !           213:                                print_decl(f, newname, t, 0); 
        !           214:                                fprintf(f, "#define %s_case u.u_%s\n",
        !           215:                                        member, member);
        !           216:                        }
        !           217:                }
        !           218:                print_level--;
        !           219:                tab(f); fprintf(f, "} u;\n");
        !           220:                print_level--;
        !           221:                tab(f); fprintf(f, "} %s", name);
        !           222:                goto ret;
        !           223: 
        !           224:        default:
        !           225:                yyerror("Internal error in print_decl: bad type constructor for %s",
        !           226:                        name);
        !           227:                exit(1);
        !           228:        }
        !           229: ret:
        !           230:        if (! nonewline)
        !           231:                fprintf(f, ";\n");
        !           232: }
        !           233: 
        !           234: char *
        !           235: gensym(prefix)
        !           236:        char *prefix;
        !           237: {
        !           238:        static int n = 0;
        !           239:        char buf[MAXSTR];
        !           240: 
        !           241:        sprintf(buf, "%s%d", prefix, n);
        !           242:        n++;
        !           243:        return (copy(buf));
        !           244: }
        !           245: 
        !           246: /*
        !           247:  * Generate C functions to pack and unpack a Courier type.
        !           248:  * Put their names in the type structure.
        !           249:  */
        !           250: type_functions(type)
        !           251:        struct object *type;
        !           252: {
        !           253:        list p, q;
        !           254:        struct object *t;
        !           255:        char *pname, *uname, *format, *ref, *member, *value;
        !           256: 
        !           257:        if (class_of(type) != O_TYPE || type->t_constr == C_PREDEF)
        !           258:                return;
        !           259:        if (type->t_constr != C_ENUMERATION) {
        !           260:                type->t_pfname = pname = gensym("Pack");
        !           261:                type->t_ufname = uname = gensym("Unpack");
        !           262:        }
        !           263: 
        !           264:        switch (type->t_constr) {
        !           265: 
        !           266:        case C_ENUMERATION:
        !           267:                type->t_pfname = "PackCardinal";
        !           268:                type->t_ufname = "UnpackCardinal";
        !           269:                return;
        !           270: 
        !           271:        case C_ARRAY:
        !           272:                function_heading(cf1, pname, type->t_basetype, 1);
        !           273:                function_heading(cf2, uname, type->t_basetype, 0);
        !           274:                format =
        !           275: "{\n\
        !           276: \tregister Unspecified *bp;\n\
        !           277: \tregister Cardinal i;\n\
        !           278: \n\
        !           279: \tbp = buf;\n\
        !           280: \tfor (i = 0; i < %s; i++)\n\
        !           281: \t\tbp += %s(%sp[i], bp%s);\n";
        !           282: 
        !           283:                ref = refstr(type->t_basetype);
        !           284:                fprintf(cf1, format, obj_rep(type->t_size),
        !           285:                        pack_function(type->t_basetype), ref, ", flag");
        !           286:                fprintf(cf2, format, obj_rep(type->t_size),
        !           287:                        unpack_function(type->t_basetype), ref, "");
        !           288:                break;
        !           289: 
        !           290:        case C_SEQUENCE:
        !           291:                function_heading(cf1, pname, type, 1);
        !           292:                function_heading(cf2, uname, type, 0);
        !           293:                format =
        !           294: "{\n\
        !           295: \tregister Unspecified *bp;\n\
        !           296: \tregister Cardinal i;\n\
        !           297: \n\
        !           298: \tbp = buf;\n\
        !           299: \tbp += %sCardinal(&p->length, bp%s);\n";
        !           300: 
        !           301:                fprintf(cf1, format, "Pack", ", flag");
        !           302:                fprintf(cf2, format, "Unpack", "");
        !           303: 
        !           304:                /*
        !           305:                 * The unpack function needs to dynamically
        !           306:                 * allocate space for the sequence elements.
        !           307:                 */
        !           308:                fprintf(cf2, "\tp->sequence = (");
        !           309:                print_decl(cf2, "*", type->t_basetype);
        !           310:                fprintf(cf2, ")\n\t\tAllocate(p->length * sizeof(");
        !           311:                print_decl(cf2, "", type->t_basetype);
        !           312:                fprintf(cf2, ")/sizeof(Unspecified));\n");
        !           313: 
        !           314:                format =
        !           315: "\tfor (i = 0; i < p->length; i++)\n\
        !           316: \t\tbp += %s(%sp->sequence[i], bp%s);\n";
        !           317: 
        !           318:                ref = refstr(type->t_basetype);
        !           319:                fprintf(cf1, format, pack_function(type->t_basetype),
        !           320:                        ref, ", flag");
        !           321:                fprintf(cf2, format, unpack_function(type->t_basetype),
        !           322:                        ref, "");
        !           323:                break;
        !           324: 
        !           325:        case C_RECORD:
        !           326:                function_heading(cf1, pname, type, 1);
        !           327:                function_heading(cf2, uname, type, 0);
        !           328:                format =
        !           329: "{\n\
        !           330: \tregister Unspecified *bp;\n\
        !           331: \n\
        !           332: \tbp = buf;\n";
        !           333:                fprintf(cf1, format);
        !           334:                fprintf(cf2, format);
        !           335: 
        !           336:                format = "\tbp += %s(%sp->%s, bp%s);\n";
        !           337:                for (p = type->t_list; p != NIL; p = cdr(p)) {
        !           338:                        t = (struct object *) cdr(car(p));
        !           339:                        ref = refstr(t);
        !           340:                        for (q = car(car(p)); q != NIL; q = cdr(q)) {
        !           341:                                member = name_of(car(q));
        !           342:                                fprintf(cf1, format, pack_function(t),
        !           343:                                        ref, member, ", flag");
        !           344:                                fprintf(cf2, format, unpack_function(t),
        !           345:                                        ref, member, "");
        !           346:                        }
        !           347:                }
        !           348:                break;
        !           349: 
        !           350:        case C_CHOICE:
        !           351:                function_heading(cf1, pname, type, 1);
        !           352:                function_heading(cf2, uname, type, 0);
        !           353:                format =
        !           354: "{\n\
        !           355: \tregister Unspecified *bp;\n\
        !           356: \n\
        !           357: \tbp = buf;\n\
        !           358: \tbp += %sCardinal(&p->designator, bp%s);\n\
        !           359: \tswitch (p->designator) {\n";
        !           360:                fprintf(cf1, format, "Pack", ", flag");
        !           361:                fprintf(cf2, format, "Unpack", "");
        !           362: 
        !           363:                format =
        !           364: "\tcase %s:\n\
        !           365: \t\tbp += %s(%sp->%s_case, bp%s);\n\
        !           366: \t\tbreak;\n";
        !           367:                for (p = type->t_candidates; p != NIL; p = cdr(p)) {
        !           368:                        t = (struct object *) cdr(car(p));
        !           369:                        ref = refstr(t);
        !           370:                        for (q = car(car(p)); q != NIL; q = cdr(q)) {
        !           371:                                member = name_of(car(car(q)));
        !           372:                                fprintf(cf1, format, member, pack_function(t),
        !           373:                                        ref, member, ", flag");
        !           374:                                fprintf(cf2, format, member, unpack_function(t),
        !           375:                                        ref, member, "");
        !           376:                        }
        !           377:                }
        !           378:                fprintf(cf1, "\t}\n");
        !           379:                fprintf(cf2, "\t}\n");
        !           380:                break;
        !           381: 
        !           382:        case C_PROCEDURE:
        !           383:        case C_ERROR:
        !           384:                return;
        !           385: 
        !           386:        default:
        !           387:                yyerror("Internal error in type_functions: bad type constructor");
        !           388:                exit(1);
        !           389:        }
        !           390: 
        !           391:        format =
        !           392: "\treturn (bp - buf);\n\
        !           393: }\n";
        !           394:        fprintf(cf1, format);
        !           395:        fprintf(cf2, format);
        !           396: }
        !           397: 
        !           398: /*
        !           399:  * Print the heading for a type packing or unpacking function.
        !           400:  */
        !           401: function_heading(f, name, type, flag)
        !           402:        FILE *f;
        !           403:        char *name;
        !           404:        struct object *type;
        !           405:        int flag;
        !           406: {
        !           407:        fprintf(f, "\nstatic %s(p, buf%s)\n", name, flag ? ", flag" : "");
        !           408:        print_level++; print_decl(f, "*p", type, 0); print_level--;
        !           409:        fprintf(f, "\tregister Unspecified *buf;\n%s",
        !           410:                flag ? "\tBoolean flag;\n" : "");
        !           411: }
        !           412: 
        !           413: tab(f)
        !           414:        FILE *f;
        !           415: {
        !           416:        int n;
        !           417: 
        !           418:        for (n = print_level; n > 0; n--)
        !           419:                putc('\t', f);
        !           420: }

unix.superglobalmegacorp.com

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