diff options
Diffstat (limited to 'eBones/compile_et/compile_et.c')
-rw-r--r-- | eBones/compile_et/compile_et.c | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/eBones/compile_et/compile_et.c b/eBones/compile_et/compile_et.c new file mode 100644 index 0000000..25be70b --- /dev/null +++ b/eBones/compile_et/compile_et.c @@ -0,0 +1,172 @@ +/* + * + * 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); +} |