60643d379b
(Including all changes for FreeBSD - importing the original eBones distribution would be too complex at this stage, since I don't have access to Piero's CVS.) (If you want to include eBones in your system, don't forget to include MAKE_EBONES in /etc/make.conf.) (This stuff is now also suppable from braae.ru.ac.za.) Bones originally from MIT SIPB. Original port to FreeBSD 1.x by Piero Serini. Moved to FreeBSD 2.0 by Doug Rabson and Geoff Rehmet. Nice bug fixes from Doug Rabson.
173 lines
3.6 KiB
C
173 lines
3.6 KiB
C
/*
|
|
*
|
|
* Copyright 1986, 1987 by MIT Student Information Processing Board
|
|
* For copyright info, see "Copyright.SIPB".
|
|
*
|
|
* $Id: compile_et.c,v 1.2 1994/07/19 19:21:24 g89r4222 Exp $
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <sys/file.h>
|
|
#include <strings.h>
|
|
#include <sys/param.h>
|
|
|
|
static char copyright[] = "Copyright 1987 by MIT Student Information Processing Board";
|
|
|
|
extern char *gensym();
|
|
extern char *current_token;
|
|
extern int table_number, current;
|
|
char buffer[BUFSIZ];
|
|
char *table_name = (char *)NULL;
|
|
FILE *hfile, *cfile;
|
|
|
|
/* C library */
|
|
extern char *malloc();
|
|
extern int errno;
|
|
|
|
/* lex stuff */
|
|
extern FILE *yyin;
|
|
extern int yylineno;
|
|
|
|
/* pathnames */
|
|
char c_file[MAXPATHLEN]; /* temporary file */
|
|
char h_file[MAXPATHLEN]; /* output */
|
|
char o_file[MAXPATHLEN]; /* output */
|
|
char et_file[MAXPATHLEN]; /* input */
|
|
|
|
main(argc, argv)
|
|
int argc;
|
|
char **argv;
|
|
{
|
|
register char *p;
|
|
int n_flag = 0, debug = 0;
|
|
|
|
while (argc > 2) {
|
|
register char *arg, ch;
|
|
arg = argv[--argc];
|
|
if (strlen(arg) != 2 || arg[0] != '-')
|
|
goto usage;
|
|
ch = arg[1];
|
|
if (ch == 'n')
|
|
n_flag++;
|
|
else if (ch == 'd')
|
|
debug++;
|
|
else
|
|
goto usage;
|
|
}
|
|
|
|
if (argc != 2) {
|
|
usage:
|
|
fprintf(stderr, "Usage: %s et_file [-n]\n", argv[0]);
|
|
exit(1);
|
|
}
|
|
|
|
strcpy(et_file, argv[1]);
|
|
p = rindex(et_file, '/');
|
|
if (p == (char *)NULL)
|
|
p = et_file;
|
|
else
|
|
p++;
|
|
p = rindex(p, '.');
|
|
if (!strcmp(p, ".et"))
|
|
*++p = '\0';
|
|
else {
|
|
if (!p)
|
|
p = et_file;
|
|
while (*p)
|
|
p++;
|
|
*p++ = '.';
|
|
*p = '\0';
|
|
}
|
|
/* p points at null where suffix should be */
|
|
strcpy(p, "et.c");
|
|
strcpy(c_file, et_file);
|
|
p[0] = 'h';
|
|
p[1] = '\0';
|
|
strcpy(h_file, et_file);
|
|
p[0] = 'o';
|
|
strcpy(o_file, et_file);
|
|
p[0] = 'e';
|
|
p[1] = 't';
|
|
p[2] = '\0';
|
|
|
|
yyin = fopen(et_file, "r");
|
|
if (!yyin) {
|
|
perror(et_file);
|
|
exit(1);
|
|
}
|
|
|
|
hfile = fopen(h_file, "w");
|
|
if (hfile == (FILE *)NULL) {
|
|
perror(h_file);
|
|
exit(1);
|
|
}
|
|
|
|
cfile = fopen(c_file, "w");
|
|
if (cfile == (FILE *)NULL) {
|
|
perror("Can't open temp file");
|
|
exit(1);
|
|
}
|
|
|
|
/* parse it */
|
|
fputs("#define NULL 0\n", cfile);
|
|
fputs("static char *_et[] = {\n", cfile);
|
|
|
|
yyparse();
|
|
fclose(yyin); /* bye bye input file */
|
|
|
|
fputs("\t(char *)0\n};\n", cfile);
|
|
fputs("extern int init_error_table();\n\n", cfile);
|
|
fprintf(cfile, "int %s_err_base = %d;\n\n", table_name, table_number);
|
|
fprintf(cfile, "int\ninit_%s_err_tbl()\n", table_name);
|
|
fprintf(cfile, "{\n\treturn(init_error_table(_et, %d, %d));\n}\n",
|
|
table_number, current);
|
|
fclose(cfile);
|
|
|
|
fputs("extern int init_", hfile);
|
|
fputs(table_name, hfile);
|
|
fputs("_err_tbl();\nextern int ", hfile);
|
|
fputs(table_name, hfile);
|
|
fputs("_err_base;\n", hfile);
|
|
fclose(hfile); /* bye bye hfile */
|
|
|
|
if (n_flag)
|
|
exit(0);
|
|
|
|
if (!fork()) {
|
|
p = rindex(c_file, '/');
|
|
if (p) {
|
|
*p++ = '\0';
|
|
chdir(c_file);
|
|
}
|
|
else
|
|
p = c_file;
|
|
execlp("cc", "cc", "-c", "-R", "-O", p, 0);
|
|
perror("cc");
|
|
exit(1);
|
|
}
|
|
else wait(0);
|
|
|
|
if (!debug)
|
|
(void) unlink(c_file);
|
|
/* make it .o file name */
|
|
c_file[strlen(c_file)-1] = 'o';
|
|
if (!fork()) {
|
|
execlp("cp", "cp", c_file, o_file, 0);
|
|
perror("cp");
|
|
exit(1);
|
|
}
|
|
else wait(0);
|
|
if (!debug)
|
|
(void) unlink(c_file);
|
|
|
|
exit(0);
|
|
}
|
|
|
|
yyerror(s)
|
|
char *s;
|
|
{
|
|
fputs(s, stderr);
|
|
fprintf(stderr, "\nLine number %d; last token was '%s'\n",
|
|
yylineno, current_token);
|
|
}
|