⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compile_et.c

📁 早期freebsd实现
💻 C
字号:
/* * * Copyright 1986, 1987 by MIT Student Information Processing Board * * For copyright info, see "mit-sipb-copyright.h". * */#include <stdio.h>#include <sys/file.h>#include <strings.h>#include <sys/param.h>#include "mit-sipb-copyright.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 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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -