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

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)code2.c    4.1 (Berkeley) 7/3/83";
        !             3: #endif
        !             4: 
        !             5: #include "Courier.h"
        !             6: 
        !             7: /*
        !             8:  * Generate functions for user and server calls to a procedure.
        !             9:  */
        !            10: proc_functions(proc_name, type, value)
        !            11:        char *proc_name;
        !            12:        struct object *type, *value;
        !            13: {
        !            14:        list p, q;
        !            15:        int nresults;
        !            16:        struct object *t, *result_type;
        !            17:        char *result_name, *func, *ref;
        !            18: 
        !            19:        /*
        !            20:         * Make sure there is at most one result returned.
        !            21:         */
        !            22:        nresults = length(type->t_results);
        !            23:        if (nresults == 1)
        !            24:                /* could be multiple names with one type */
        !            25:                nresults = length(car(car(type->t_results)));
        !            26:        if (nresults > 1) {
        !            27:                yyerror("Procedures that return multiple results are not supported");
        !            28:                return;
        !            29:        }
        !            30:        if (nresults) {
        !            31:                result_name = name_of(car(car(car(type->t_results))));
        !            32:                result_type = (struct object *) cdr(car(type->t_results));
        !            33:        }
        !            34: 
        !            35:        /*
        !            36:         * Server routine.
        !            37:         */
        !            38:        if (nresults) {
        !            39:                fprintf(sf, "\nextern ");
        !            40:                print_decl(sf, proc_name, result_type, 1);
        !            41:                fprintf(sf, "();\n");
        !            42:        } else
        !            43:                fprintf(sf, "\nextern void %s();\n", proc_name);
        !            44:        fprintf(sf,
        !            45: "\nServer_%s(_buf)\n\
        !            46: \tregister Unspecified *_buf;\n\
        !            47: {\n\
        !            48: \tregister Unspecified *_bp;\n\
        !            49: \tregister LongCardinal _n;\n",
        !            50:                proc_name);
        !            51:        print_level++;
        !            52:        for (p = type->t_args; p != NIL; p = cdr(p)) {
        !            53:                t = (struct object *) cdr(car(p));
        !            54:                for (q = car(car(p)); q != NIL; q = cdr(q))
        !            55:                        print_decl(sf, name_of(car(q)), t, 0);
        !            56:        }
        !            57:        if (nresults)
        !            58:                print_decl(sf, result_name, result_type, 0);
        !            59:        print_level--;
        !            60:        fprintf(sf, "\n\t_bp = _buf;\n");
        !            61:        for (p = type->t_args; p != NIL; p = cdr(p)) {
        !            62:                t = (struct object *) cdr(car(p));
        !            63:                ref = refstr(t);
        !            64:                for (q = car(car(p)); q != NIL; q = cdr(q))
        !            65:                        fprintf(sf, "\t_bp += %s(%s%s, _bp);\n",
        !            66:                                unpack_function(t), ref, name_of(car(q)));
        !            67:        }
        !            68:        if (nresults)
        !            69:                fprintf(sf, "\t%s = %s(", result_name, proc_name);
        !            70:        else
        !            71:                fprintf(sf, "\t%s(", proc_name);
        !            72:        for (p = type->t_args; p != NIL; p = cdr(p)) {
        !            73:                for (q = car(car(p)); q != NIL; q = cdr(q)) {
        !            74:                        fprintf(sf, "%s", name_of(car(q)));
        !            75:                        if (cdr(q) != NIL)
        !            76:                                fprintf(sf, ", ");
        !            77:                }
        !            78:                if (cdr(p) != NIL)
        !            79:                        fprintf(sf, ", ");
        !            80:        }
        !            81:        fprintf(sf, ");\n");
        !            82:        if (nresults) {
        !            83:                func = pack_function(result_type);
        !            84:                ref = refstr(result_type);
        !            85:                fprintf(sf,
        !            86: "\t_n = %s(%s%s, 0, 0);\n\
        !            87: \t_bp = Allocate(_n);\n\
        !            88: \t%s(%s%s, _bp, 1);\n\
        !            89: \tSendReturnMessage(_n, _bp);\n\
        !            90: \tDeallocate(_bp);\n",
        !            91:                        func, ref, result_name, func, ref, result_name);
        !            92:        }
        !            93:        fprintf(sf, "}\n");
        !            94: 
        !            95:        /*
        !            96:         * Remote access routine.
        !            97:         */
        !            98:        if (nresults) {
        !            99:                fprintf(hf, "\nextern ");
        !           100:                print_decl(hf, proc_name, result_type, 1);
        !           101:                fprintf(hf, "();\n");
        !           102: 
        !           103:                fprintf(uf, "\n");
        !           104:                print_decl(uf, proc_name, result_type, 1);
        !           105:                fprintf(uf, "(");
        !           106:        } else {
        !           107:                fprintf(hf, "\nextern void %s();\n", proc_name);
        !           108:                fprintf(uf, "\nvoid %s(", proc_name);
        !           109:        }
        !           110:        if (explicit) {
        !           111:                fprintf(uf, "_machine");
        !           112:                if (type->t_args != NIL)
        !           113:                        fprintf(uf, ", ");
        !           114:        }
        !           115:        for (p = type->t_args; p != NIL; p = cdr(p)) {
        !           116:                for (q = car(car(p)); q != NIL; q = cdr(q)) {
        !           117:                        fprintf(uf, "%s", name_of(car(q)));
        !           118:                        if (cdr(q) != NIL)
        !           119:                                fprintf(uf, ", ");
        !           120:                }
        !           121:                if (cdr(p) != NIL)
        !           122:                        fprintf(uf, ", ");
        !           123:        }
        !           124:        fprintf(uf, ")\n");
        !           125:        if (explicit)
        !           126:                fprintf(uf, "\tString _machine;\n");
        !           127:        print_level++;
        !           128:        for (p = type->t_args; p != NIL; p = cdr(p)) {
        !           129:                t = (struct object *) cdr(car(p));
        !           130:                for (q = car(car(p)); q != NIL; q = cdr(q))
        !           131:                        print_decl(uf, name_of(car(q)), t, 0);
        !           132:        }
        !           133:        fprintf(uf, "{\n");
        !           134:        if (nresults)
        !           135:                print_decl(uf, result_name, result_type, 0);
        !           136:        fprintf(uf,
        !           137: "\tregister Unspecified *_buf, *_bp;\n\
        !           138: \tregister LongCardinal _n;\n\
        !           139: \n\
        !           140: \t_n = 0;\n");
        !           141:        print_level--;
        !           142:        for (p = type->t_args; p != NIL; p = cdr(p)) {
        !           143:                t = (struct object *) cdr(car(p));
        !           144:                ref = refstr(t);
        !           145:                for (q = car(car(p)); q != NIL; q = cdr(q))
        !           146:                        fprintf(uf, "\t_n += %s(%s%s, 0, 0);\n",
        !           147:                                pack_function(t), ref, name_of(car(q)));
        !           148:        }
        !           149:        fprintf(uf,
        !           150: "\t_buf = Allocate(_n);\n\
        !           151: \t_bp = _buf;\n");
        !           152:        for (p = type->t_args; p != NIL; p = cdr(p)) {
        !           153:                t = (struct object *) cdr(car(p));
        !           154:                ref = refstr(t);
        !           155:                for (q = car(car(p)); q != NIL; q = cdr(q))
        !           156:                        fprintf(uf, "\t_bp += %s(%s%s, _bp, 1);\n",
        !           157:                                pack_function(t), ref, name_of(car(q)));
        !           158:        }
        !           159:        if (explicit)
        !           160:                fprintf(uf,
        !           161: "\tSendCallMessage(CourierProgram(\"%s\", _machine), %s, _n, _buf);\n",
        !           162:                        program_name, obj_rep(value));
        !           163:        else
        !           164:                fprintf(uf,
        !           165: "\tSendCallMessage(_%sConnection, %s, _n, _buf);\n",
        !           166:                        program_name, obj_rep(value));
        !           167:        fprintf(uf, "\tDeallocate(_buf);\n");
        !           168:        if (nresults) {
        !           169:                if (explicit)
        !           170:                        fprintf(uf,
        !           171: "\t_bp = ReceiveReturnMessage(CourierProgram(\"%s\", _machine));\n",
        !           172:                                program_name);
        !           173:                else
        !           174:                        fprintf(uf,
        !           175: "\t_bp = ReceiveReturnMessage(_%sConnection);\n",
        !           176:                                program_name);
        !           177:                fprintf(uf,
        !           178: "\t%s(%s%s, _bp);\n\
        !           179: \tDeallocate(_bp);\n\
        !           180: \treturn (%s);\n",
        !           181:                        unpack_function(result_type), refstr(result_type),
        !           182:                        result_name, result_name);
        !           183:        }
        !           184:        fprintf(uf, "}\n");
        !           185: }
        !           186: 
        !           187: program(prog)
        !           188:        struct object *prog;
        !           189: {
        !           190:        /*
        !           191:         * Program_name should have been set by now,
        !           192:         * but a little paranoia never hurt anyone.
        !           193:         */
        !           194:        if (! streq(name_of(prog), program_name)) {
        !           195:                yyerror("Internal error: conflicting program names %s and %s\n",
        !           196:                        name_of(prog), program_name);
        !           197:                exit(1);
        !           198:        }
        !           199:        generate_server();
        !           200: }
        !           201: 
        !           202: /*
        !           203:  * Generate main loop for server program.
        !           204:  */
        !           205: generate_server()
        !           206: {
        !           207:        list p;
        !           208:        struct object *t, *proc, *v;
        !           209: 
        !           210:        fprintf(sf,
        !           211: "\nServer()\n\
        !           212: {\n\
        !           213: \tCardinal procedure;\n\
        !           214: \tregister Unspecified *buf;\n\
        !           215: \n\
        !           216: \tServerInit();\n\
        !           217: \tfor (;;) {\n\
        !           218: \t\tbuf = ReceiveCallMessage(&procedure);\n\
        !           219: \t\tswitch (procedure) {\n"
        !           220:                );
        !           221:        /*
        !           222:         * Find all the procedures declared in the program.
        !           223:         */
        !           224:        for (p = Types; p != NIL; p = cdr(p)) {
        !           225:                t = (struct object *) cdr(car(p));
        !           226:                if (t->t_constr == C_PROCEDURE) {
        !           227:                        proc = (struct object *) car(car(p));
        !           228:                        v = lookup(Values, proc);
        !           229:                        fprintf(sf,
        !           230: "\t\tcase %s:\n\
        !           231: \t\t\tServer_%s(buf);\n\
        !           232: \t\t\tbreak;\n",
        !           233:                                obj_rep(v), name_of(proc));
        !           234:                }
        !           235:        }
        !           236:        fprintf(sf,
        !           237: "\t\tdefault:\n\
        !           238: \t\t\tNoSuchProcedureValue(\"%s\", procedure);\n\
        !           239: \t\t\tbreak;\n\
        !           240: \t\t}\n\
        !           241: \t\tDeallocate(buf);\n\
        !           242: \t}\n\
        !           243: }\n",
        !           244:                program_name);
        !           245: }
        !           246: 
        !           247: /*
        !           248:  * When implicit binding is used, this routine generates functions to
        !           249:  * bind the remote Courier program to a machine by setting the global
        !           250:  * connection variable for the program, and to remove the binding by
        !           251:  * closing the connection.
        !           252:  */
        !           253: generate_binding_functions()
        !           254: {
        !           255:        fprintf(uf,
        !           256: "\nint _%sConnection = -1;\n\
        !           257: \n\
        !           258: Bind%sToMachine(machine)\n\
        !           259: \tString machine;\n\
        !           260: {\n\
        !           261: \tclose(_%sConnection);\n\
        !           262: \t_%sConnection = CourierActivate(\"%s\", machine);\n\
        !           263: }\n\
        !           264: \n\
        !           265: Unbind%s()\n\
        !           266: {\n\
        !           267: \tclose(_%sConnection);\n\
        !           268: \t_%sConnection = -1;\n\
        !           269: }\n",
        !           270:                program_name, program_name, program_name, program_name,
        !           271:                program_name, program_name, program_name, program_name);
        !           272: }

unix.superglobalmegacorp.com

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