|
|
1.1 root 1: #ifndef lint
2: static char *rcsid = "$Header: liszt.c 1.6 83/07/25 12:07:31 layer Exp $";
3: #endif
4:
5: /*
6: ** -[Wed May 4 18:18:10 1983 by layer]-
7: **
8: **
9: ** liszt :: interface to the lisp compiler
10: **
11: ** There are two reasons for having a C interface to the compiler:
12: ** 1) Fseek doesn't work properly from lisp, and there is no
13: ** lseek.
14: ** 2) To start up a process from a 1 Mb process, like when liszt forks
15: ** a /usr/lib/lisp/as to assemble the output of the compiler, takes
16: ** too long. (The compiler is 100 times larger than this program.)
17: **
18: **/
19:
20: #include <stdio.h>
21: #include "../../franz/h/aout.h"
22: #include "../../franz/h/config.h"
23:
24: #ifndef LISZT
25: #define LISZT "/usr/ucb/xliszt"
26: #endif
27:
28: #ifndef AS
29: #define AS "/usr/lib/lisp/as"
30: #endif
31:
32: #ifndef OFFSET
33: #define OFFSET 0x0
34: #endif
35:
36: main(argc,argv,envp)
37: register char *argv[], **envp;
38: {
39: struct exec header;
40: register int autorun = 0;
41: register int no_assem = 0;
42: register char *p;
43: register int oflag = 0, cur;
44: register int objp;
45: register int slen;
46: char temp[20], tempfile[20], srcfile[20], outfile[20];
47: char *args_to_string();
48: char *flags_to_string();
49: char command[1024];
50:
51: /*
52: ** process arguments :: check for -r and -S switches
53: **
54: ** -F is a special flag that means just to fix the offset in the
55: ** object file, and then quit.
56: **
57: **/
58: /* If no args, then give the user an interactive liszt */
59: if (argc == 1)
60: {
61: execle(LISZT, "liszt", 0, envp);
62: exit(100);
63: } else
64: {
65: for (cur = 1; cur < argc; cur++) {
66: if (*argv[cur] == '-')
67: {
68: p = argv[cur];
69: p++;
70: if (*p == 'o')
71: {
72: strcpy(outfile,argv[++cur]);
73: oflag++;
74: }
75: else if (*p == 'F')
76: {
77: strcpy(outfile,argv[++cur]);
78: autorun = 1;
79: goto fixit;
80: }
81: else
82: {
83: for (; *p; p++) {
84: switch (*p)
85: {
86: case 'S':
87: no_assem++;
88: break;
89: case 'r':
90: autorun++;
91: break;
92: default:
93: break;
94: }
95: }
96: }
97: }
98: else
99: { /* must be filename */
100: strcpy(srcfile, argv[cur]);
101: }
102: }
103: }
104:
105: if (no_assem)
106: {
107: sprintf(command, "%s %s", LISZT, args_to_string(argv));
108: #ifdef debug
109: printf("%s\n", command);
110: #else
111: exit(system(command));
112: #endif
113: }
114:
115: sprintf(tempfile, "/tmp/Lzt%d.s", getpid());
116:
117: /* If output file not given, then we deduce it... */
118: if (oflag == 0)
119: {
120: strcpy(outfile,srcfile);
121: slen = strlen(outfile);
122: if (outfile[slen - 2] == '.')
123: {
124: outfile[slen - 1] = 'o';
125: }
126: else
127: {
128: strcpy(temp,outfile);
129: sprintf(outfile, "%s.o", temp);
130: }
131: }
132:
133: sprintf(command, "%s -S%s -o %s %s",
134: LISZT, flags_to_string(argc, argv), tempfile, srcfile);
135: #ifdef debug
136: printf("%s\n", command);
137: #else
138: if (system(command) != 0)
139: {
140: exit(101);
141: }
142: #endif
143:
144: sprintf(command, "%s -o %s %s", AS, outfile, tempfile);
145: #ifdef debug
146: printf("%s\n", command);
147: #else
148: if (system(command) != 0)
149: {
150: exit(102);
151: }
152: unlink(tempfile);
153:
154: fixit:
155: if (autorun)
156: {
157: if ((objp = open(outfile,2)) == -1)
158: {
159: perror(outfile);
160: exit(103);
161: }
162: if (read(objp,&header,sizeof header) != sizeof (struct exec))
163: {
164: perror("read failed");
165: exit(1);
166: }
167:
168: /* Change the offset to the correct value */
169: header.a_entry = OFFSET;
170:
171: /* seek back to beginning */
172: if (lseek(objp,0,0) != 0)
173: {
174: perror("seek failed");
175: exit(104);
176: }
177:
178: /* write the new a.out header... */
179: if (write(objp,&header,sizeof header) != sizeof(struct exec))
180: {
181: perror("write failed");
182: exit(105);
183: }
184:
185: /* make it executable */
186: chmod(outfile, 0755);
187: } else
188: exit(0);
189: #endif
190: }
191:
192: char *
193: args_to_string(pp)
194: char *pp[];
195: {
196: char result[1024];
197: register int ii = 0,
198: jj = 1;
199:
200: for (; pp[jj]; ii++, jj++)
201: {
202: xstrcpy(&result[ii],pp[jj]);
203: ii = ii + strlen(pp[jj]);
204: }
205: result[ii++] = '\0';
206: return(result);
207: }
208:
209: char *
210: flags_to_string(argc, argv)
211: int argc;
212: char *argv[];
213: {
214: char result[128];
215: register int chari, word, skipnext = 0, out = 0;
216:
217: for (word = 1; word < argc; word++)
218: {
219: if (skipnext)
220: {
221: skipnext = 0;
222: word++;
223: continue;
224: }
225: if (*argv[word] == '-')
226: for (chari = 1; argv[word][chari]; chari++)
227: if (argv[word][chari] == 'o')
228: skipnext = 1;
229: else
230: result[out++] = argv[word][chari];
231: }
232: result[out] = '\0';
233: return(result);
234: }
235:
236: xstrcpy(s, t)
237: char *s, *t;
238: {
239: while (*t != '\0')
240: {
241: *s++ = *t++;
242: }
243: *s = ' ';
244: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.