|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)main.c 4.1 (Berkeley) 7/3/83";
3: #endif
4:
5: #include "Courier.h"
6: #include <errno.h>
7:
8: char *input_file;
9: char hfile[MAXSTR], cfile1[MAXSTR], cfile2[MAXSTR];
10: char ufile[MAXSTR], sfile[MAXSTR];
11: FILE *hf, *cf1, *cf2, *uf, *sf;
12: list Values, Types;
13: int errs;
14: int explicit = 0; /* if true, generate stubs with explicit bindings */
15:
16: /*
17: * Predefined types.
18: */
19: struct object
20: *Boolean_type,
21: *Cardinal_type, *LongCardinal_type,
22: *Integer_type, *LongInteger_type,
23: *String_type,
24: *Unspecified_type, *LongUnspecified_type;
25:
26: struct object
27: *Undefined_constant;
28:
29: main(argc, argv)
30: int argc;
31: char **argv;
32: {
33: argc--; argv++;
34: if (argc == 2 && strcmp(*argv, "-x") == 0) {
35: explicit = 1; argc--; argv++;
36: }
37: if (argc != 1) {
38: fprintf(stderr, "Usage: courier [-x] input_file\n");
39: exit(1);
40: }
41: input_file = *argv;
42: if (freopen(input_file, "r", stdin) == NULL) {
43: perror(input_file); exit(1);
44: }
45: tempname(hfile); tempname(ufile); tempname(sfile);
46: tempname(cfile1); tempname(cfile2);
47: if ((hf = fopen(hfile, "w")) == NULL) {
48: perror(hfile); goto bad;
49: }
50: if ((uf = fopen(ufile, "w")) == NULL) {
51: perror(ufile); goto bad;
52: }
53: if ((sf = fopen(sfile, "w")) == NULL) {
54: perror(sfile); goto bad;
55: }
56: if ((cf1 = fopen(cfile1, "w")) == NULL) {
57: perror(cfile1); goto bad;
58: }
59: if ((cf2 = fopen(cfile2, "w")) == NULL) {
60: perror(cfile2); goto bad;
61: }
62: setup_predefs();
63: (void) yyparse();
64: fclose(hf); fclose(uf); fclose(sf);
65: if (errs == 0) {
66: int c;
67:
68: freopen(cfile2, "r", cf2);
69: while ((c = getc(cf2)) != EOF)
70: putc(c, cf1);
71: fclose(cf1); fclose(cf2);
72: unlink(cfile2);
73: rename(cfile1, program_name, "_stubs.c", 0);
74: rename(ufile, program_name, "_client.c", 0);
75: rename(sfile, program_name, "_server.c", 0);
76: rename(hfile, program_name, ".h", 1);
77: exit(0);
78: }
79: fclose(cf1); fclose(cf2);
80: bad:
81: unlink(hfile);
82: unlink(ufile);
83: unlink(sfile);
84: unlink(cfile1);
85: unlink(cfile2);
86: exit(1);
87: }
88:
89: /*
90: * Rename the source file to be <dest>.<suffix> .
91: * If we're being paranoid, we prepend # to existing files that might
92: * get clobbered.
93: */
94: rename(source, dest, suffix, paranoid)
95: char *source, *dest, *suffix;
96: int paranoid;
97: {
98: char newname[MAXSTR], backup[MAXSTR];
99: extern int errno;
100:
101: sprintf(newname, "%s%s", dest, suffix);
102: for (;;)
103: if (link(source, newname) == 0)
104: if (unlink(source) != 0) {
105: perror(newname);
106: return (-1);
107: } else
108: return (0);
109: else if (errno != EEXIST ||
110: (paranoid && rename(newname, "#", newname) != 0) ||
111: (! paranoid && unlink(newname) != 0))
112: break;
113: perror(newname);
114: return (-1);
115: }
116:
117: /* VARARGS1 */
118: yyerror(s, args)
119: char *s;
120: {
121: extern int yylineno;
122:
123: errs = 1;
124: fprintf(stderr, "%d: ", yylineno);
125: _doprnt(s, &args, stderr);
126: putc('\n', stderr);
127: unlink(hfile); unlink(ufile); unlink(sfile);
128: unlink(cfile1); unlink(cfile2);
129: }
130:
131: tempname(buf)
132: char *buf;
133: {
134: static int n = 0;
135:
136: sprintf(buf, "tmp%d.%d", n, getpid());
137: n++;
138: }
139:
140: /*
141: * This mess is needed because C doesn't handle initialization of unions.
142: */
143: setup_predefs()
144: {
145: struct object *t;
146:
147: Boolean_type = make(O_SYMBOL, "Boolean");
148: t = make(O_TYPE, C_PREDEF);
149: t->t_pfname = "PackBoolean";
150: t->t_ufname = "UnpackBoolean";
151: declare(&Values, Boolean_type, t);
152:
153: Cardinal_type = make(O_SYMBOL, "Cardinal");
154: t = make(O_TYPE, C_PREDEF);
155: t->t_pfname = "PackCardinal";
156: t->t_ufname = "UnpackCardinal";
157: declare(&Values, Cardinal_type, t);
158:
159: LongCardinal_type = make(O_SYMBOL, "LongCardinal");
160: t = make(O_TYPE, C_PREDEF);
161: t->t_pfname = "PackLongCardinal";
162: t->t_ufname = "Unpack_LongCardinal";
163: declare(&Values, LongCardinal_type, t);
164:
165: Integer_type = make(O_SYMBOL, "Integer");
166: t = make(O_TYPE, C_PREDEF);
167: t->t_pfname = "PackInteger";
168: t->t_ufname = "UnpackInteger";
169: declare(&Values, Integer_type, t);
170:
171: LongInteger_type = make(O_SYMBOL, "LongInteger");
172: t = make(O_TYPE, C_PREDEF);
173: t->t_pfname = "PackLongInteger";
174: t->t_ufname = "UnpackLongInteger";
175: declare(&Values, LongInteger_type, t);
176:
177: String_type = make(O_SYMBOL, "String");
178: t = make(O_TYPE, C_PREDEF);
179: t->t_pfname = "PackString";
180: t->t_ufname = "UnpackString";
181: declare(&Values, String_type, t);
182:
183: Unspecified_type = make(O_SYMBOL, "Unspecified");
184: t = make(O_TYPE, C_PREDEF);
185: t->t_pfname = "PackUnspecified";
186: t->t_ufname = "UnpackUnspecified";
187: declare(&Values, Unspecified_type, t);
188:
189: LongUnspecified_type = make(O_SYMBOL, "LongUnspecified");
190: t = make(O_TYPE, C_PREDEF);
191: t->t_pfname = "PackLongUnspecified";
192: t->t_ufname = "UnpackLongUnspecified";
193: declare(&Values, LongUnspecified_type, t);
194:
195: Undefined_constant = make(O_SYMBOL, "?undefined?");
196: declare(&Types, Undefined_constant, Unspecified_type);
197: declare(&Values, Undefined_constant, make(O_CONSTANT, 0));
198: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.