Esempio n. 1
0
static void
WriteDispatcher(FILE *file)
{
	register statement_t *stat;
	int descr_count = 0;

    for (stat = defs_stats; stat != stNULL; stat = stat->stNext)
		if (stat->stKind == skRoutine)
		{
			register routine_t *rt = stat->stRoutine;
			descr_count += rtCountArgDescriptors(rt->rtArgs, (int *) 0);
		}
	fprintf(file, "\n");

	WriteMigExternal(file);
	fprintf(file, "boolean_t %s(\n", ServerDemux);
	fprintf(file, "\t\tmach_msg_header_t *InHeadP,\n");
	fprintf(file, "\t\tmach_msg_header_t *OutHeadP);\n\n");

	WriteMigExternal(file);
	fprintf(file, "mig_routine_t %s_routine(\n", ServerDemux);
	fprintf(file, "\t\tmach_msg_header_t *InHeadP);\n\n");

	fprintf(file, "\n/* Description of this subsystem, for use in direct RPC */\n");
	fprintf(file, "extern const struct %s {\n", ServerSubsys);
	if (UseRPCTrap) {
		fprintf(file, "\tstruct subsystem *\tsubsystem;\t/* Reserved for system use */\n");
	}
	else {
		fprintf(file, "\tmig_server_routine_t\tserver;\t/* Server routine */\n");
	}
	fprintf(file, "\tmach_msg_id_t\tstart;\t/* Min routine number */\n");
	fprintf(file, "\tmach_msg_id_t\tend;\t/* Max routine number + 1 */\n");
	fprintf(file, "\tunsigned int\tmaxsize;\t/* Max msg size */\n");
	if (UseRPCTrap) {
		fprintf(file, "\tvm_address_t\tbase_addr;\t/* Base address */\n");
		fprintf(file, "\tstruct rpc_routine_descriptor\t/*Array of routine descriptors */\n");
	}
	else {
		fprintf(file, "\tvm_address_t\treserved;\t/* Reserved */\n");
		fprintf(file, "\tstruct routine_descriptor\t/*Array of routine descriptors */\n");
	}
	fprintf(file, "\t\troutine[%d];\n", rtNumber);
	if (UseRPCTrap) {
		fprintf(file, "\tstruct rpc_routine_arg_descriptor\t/*Array of arg descriptors */\n");
		fprintf(file, "\t\targ_descriptor[%d];\n", descr_count);
	}
	fprintf(file, "} %s;\n", ServerSubsys);
	fprintf(file, "\n");
}
Esempio n. 2
0
static void
WriteUserRoutine(FILE *file, routine_t *rt)
{
	fprintf(file, "\n");
	fprintf(file, "/* %s %s */\n", rtRoutineKindToStr(rt->rtKind), rt->rtName);
	WriteMigExternal(file);
	fprintf(file, "%s %s\n", ReturnTypeStr(rt), rt->rtUserName);
    fprintf(file, "#if\t%s\n", LintLib);
    fprintf(file, "    (");
    WriteList(file, rt->rtArgs, WriteNameDecl, akbUserArg, ", " , "");
    fprintf(file, ")\n");
    WriteList(file, rt->rtArgs, WriteUserVarDecl, akbUserArg, ";\n", ";\n");
    fprintf(file, "{ ");
    fprintf(file, "return ");
    fprintf(file, "%s(", rt->rtUserName);
    WriteList(file, rt->rtArgs, WriteNameDecl, akbUserArg, ", ", "");
    fprintf(file, "); }\n");
    fprintf(file, "#else\n");
	if (BeAnsiC) {
		fprintf(file, "(\n");
		WriteList(file, rt->rtArgs, WriteUserVarDecl, akbUserArg, ",\n", "\n");
		fprintf(file, ");\n");
    } else {
		fprintf(file, "#if\t%s\n", NewCDecl);
		fprintf(file, "(\n");
		WriteList(file, rt->rtArgs, WriteUserVarDecl, akbUserArg, ",\n", "\n");
		fprintf(file, ");\n");
		fprintf(file, "#else\n");

		fprintf(file, "    ();\n");
		fprintf(file, "#endif\t/* %s */\n", NewCDecl);
	}
	fprintf(file, "#endif\t/* %s */\n",  LintLib);
}
Esempio n. 3
0
File: header.c Progetto: Prajna/mach
static void
WriteServerRoutine(FILE *file, const routine_t *rt)
{
    fprintf(file, "\n");
    fprintf(file, "/* %s %s */\n", rtRoutineKindToStr(rt->rtKind), rt->rtName);
    WriteMigExternal(file);
    fprintf(file, "%s %s\n", ReturnTypeStr(rt), rt->rtServerName);
    fprintf(file, "#if\t%s\n", LintLib);
    fprintf(file, "    (");
    WriteList(file, rt->rtArgs, WriteNameDecl, akbServerArg, ", " , "");
    fprintf(file, ")\n");
    WriteList(file, rt->rtArgs, WriteServerVarDecl,
	      akbServerArg, ";\n", ";\n");
    fprintf(file, "{ ");
    if (!rt->rtProcedure)
	fprintf(file, "return ");
    fprintf(file, "%s(", rt->rtServerName);
    WriteList(file, rt->rtArgs, WriteNameDecl, akbServerArg, ", ", "");
    fprintf(file, "); }\n");
    fprintf(file, "#else\n");
    fprintf(file, "(\n");
    WriteList(file, rt->rtArgs, WriteServerVarDecl,
	      akbServerArg, ",\n", "\n");
    fprintf(file, ");\n");
    fprintf(file, "#endif\n");
}