|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie the
24: * rights to redistribute these changes.
25: */
26:
27: #include "write.h"
28: #include "utils.h"
29: #include "global.h"
30: #include "error.h"
31:
32: static void
33: WriteIncludes(FILE *file)
34: {
35: fprintf(file, "#include <mach/kern_return.h>\n");
36: fprintf(file, "#include <mach/port.h>\n");
37: fprintf(file, "#include <mach/message.h>\n");
38: fprintf(file, "\n");
39: }
40:
41: static void
42: WriteDefines(FILE *file)
43: {
44: }
45:
46: static void
47: WriteMigExternal(FILE *file)
48: {
49: fprintf(file, "#ifdef\tmig_external\n");
50: fprintf(file, "mig_external\n");
51: fprintf(file, "#else\n");
52: fprintf(file, "extern\n");
53: fprintf(file, "#endif\n");
54: }
55:
56: static void
57: WriteProlog(FILE *file, const char *protect)
58: {
59: if (protect != strNULL) {
60: fprintf(file, "#ifndef\t_%s\n", protect);
61: fprintf(file, "#define\t_%s\n", protect);
62: fprintf(file, "\n");
63: }
64:
65: fprintf(file, "/* Module %s */\n", SubsystemName);
66: fprintf(file, "\n");
67:
68: WriteIncludes(file);
69: WriteDefines(file);
70: }
71:
72: static void
73: WriteEpilog(FILE *file, const char *protect)
74: {
75: if (protect != strNULL) {
76: fprintf(file, "\n");
77: fprintf(file, "#endif\t/* not defined(_%s) */\n", protect);
78: }
79: }
80:
81: static void
82: WriteUserRoutine(FILE *file, const routine_t *rt)
83: {
84: fprintf(file, "\n");
85: fprintf(file, "/* %s %s */\n", rtRoutineKindToStr(rt->rtKind), rt->rtName);
86: WriteMigExternal(file);
87: fprintf(file, "%s %s\n", ReturnTypeStr(rt), rt->rtUserName);
88: fprintf(file, "#if\t%s\n", LintLib);
89: fprintf(file, " (");
90: WriteList(file, rt->rtArgs, WriteNameDecl, akbUserArg, ", " , "");
91: fprintf(file, ")\n");
92: WriteList(file, rt->rtArgs, WriteUserVarDecl, akbUserArg, ";\n", ";\n");
93: fprintf(file, "{ ");
94: if (!rt->rtProcedure)
95: fprintf(file, "return ");
96: fprintf(file, "%s(", rt->rtUserName);
97: WriteList(file, rt->rtArgs, WriteNameDecl, akbUserArg, ", ", "");
98: fprintf(file, "); }\n");
99: fprintf(file, "#else\n");
100: fprintf(file, "(\n");
101: WriteList(file, rt->rtArgs, WriteUserVarDecl, akbUserArg, ",\n", "\n");
102: fprintf(file, ");\n");
103: fprintf(file, "#endif\n");
104: }
105:
106: void
107: WriteUserHeader(FILE *file, const statement_t *stats)
108: {
109: register const statement_t *stat;
110: const char *protect = strconcat(SubsystemName, "_user_");
111:
112: WriteProlog(file, protect);
113: for (stat = stats; stat != stNULL; stat = stat->stNext)
114: switch (stat->stKind)
115: {
116: case skRoutine:
117: WriteUserRoutine(file, stat->stRoutine);
118: break;
119: case skImport:
120: case skUImport:
121: WriteImport(file, stat->stFileName);
122: break;
123: case skSImport:
124: break;
125: default:
126: fatal("WriteHeader(): bad statement_kind_t (%d)",
127: (int) stat->stKind);
128: }
129: WriteEpilog(file, protect);
130: }
131:
132: static void
133: WriteServerRoutine(FILE *file, const routine_t *rt)
134: {
135: fprintf(file, "\n");
136: fprintf(file, "/* %s %s */\n", rtRoutineKindToStr(rt->rtKind), rt->rtName);
137: WriteMigExternal(file);
138: fprintf(file, "%s %s\n", ReturnTypeStr(rt), rt->rtServerName);
139: fprintf(file, "#if\t%s\n", LintLib);
140: fprintf(file, " (");
141: WriteList(file, rt->rtArgs, WriteNameDecl, akbServerArg, ", " , "");
142: fprintf(file, ")\n");
143: WriteList(file, rt->rtArgs, WriteServerVarDecl,
144: akbServerArg, ";\n", ";\n");
145: fprintf(file, "{ ");
146: if (!rt->rtProcedure)
147: fprintf(file, "return ");
148: fprintf(file, "%s(", rt->rtServerName);
149: WriteList(file, rt->rtArgs, WriteNameDecl, akbServerArg, ", ", "");
150: fprintf(file, "); }\n");
151: fprintf(file, "#else\n");
152: fprintf(file, "(\n");
153: WriteList(file, rt->rtArgs, WriteServerVarDecl,
154: akbServerArg, ",\n", "\n");
155: fprintf(file, ");\n");
156: fprintf(file, "#endif\n");
157: }
158:
159: void
160: WriteServerHeader(FILE *file, const statement_t *stats)
161: {
162: register const statement_t *stat;
163: const char *protect = strconcat(SubsystemName, "_server_");
164:
165: WriteProlog(file, protect);
166: for (stat = stats; stat != stNULL; stat = stat->stNext)
167: switch (stat->stKind)
168: {
169: case skRoutine:
170: WriteServerRoutine(file, stat->stRoutine);
171: break;
172: case skImport:
173: case skSImport:
174: WriteImport(file, stat->stFileName);
175: break;
176: case skUImport:
177: break;
178: default:
179: fatal("WriteServerHeader(): bad statement_kind_t (%d)",
180: (int) stat->stKind);
181: }
182: WriteEpilog(file, protect);
183: }
184:
185: static void
186: WriteInternalRedefine(FILE *file, register const routine_t *rt)
187: {
188: fprintf(file, "#define %s %s_external\n", rt->rtUserName, rt->rtUserName);
189: }
190:
191: void
192: WriteInternalHeader(FILE *file, const statement_t *stats)
193: {
194: register const statement_t *stat;
195:
196: for (stat = stats; stat != stNULL; stat = stat->stNext)
197: switch (stat->stKind)
198: {
199: case skRoutine:
200: WriteInternalRedefine(file, stat->stRoutine);
201: break;
202: case skImport:
203: case skUImport:
204: case skSImport:
205: break;
206: default:
207: fatal("WriteInternalHeader(): bad statement_kind_t (%d)",
208: (int) stat->stKind);
209: }
210: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.