1 #ifndef lint 2 static char sccsid[] = "@(#)main.c 1.1 (CWI) 85/07/19"; 3 #endif lint 4 #include <stdio.h> 5 #include <signal.h> 6 #include "grap.h" 7 #include "y.tab.h" 8 9 int dbg = 0; 10 char *lib_defines = "/usr/local/lib/grap/grap.defines"; 11 int lib = 1; /* 1 to include lib_defines */ 12 FILE *tfd = NULL; 13 /* 14 char *tempfile = NULL; 15 */ 16 char *tempfile = "/tmp/XXXXXX"; 17 18 int synerr = 0; 19 int codegen = 0; /* 1=>output for this picture; 0=>no output */ 20 char *cmdname; 21 22 Obj *objlist = NULL; /* all names stored here */ 23 24 Point ptmin = { NULL, -1.0e10, -1.0e10 }; 25 Point ptmax = { NULL, 1.0e10, 1.0e10 }; 26 27 main(argc, argv) 28 char **argv; 29 { 30 extern int onintr(), fpecatch(); 31 char *p, *getenv(); 32 33 if (signal(SIGINT, SIG_IGN) != SIG_IGN) 34 signal(SIGINT, onintr); 35 signal(SIGFPE, fpecatch); 36 tempfile = "/tmp/grap.XXXXXX"; 37 cmdname = argv[0]; 38 while (argc > 1 && *argv[1] == '-') { 39 switch (argv[1][1]) { 40 case 'd': 41 dbg = 1; 42 tfd = stdout; 43 tempfile = "grap.temp"; 44 unlink(tempfile); 45 break; 46 case 'l': /* turn off /usr/lib inclusion */ 47 lib = 0; 48 break; 49 } 50 argc--; 51 argv++; 52 } 53 setdefaults(); 54 if (!dbg) 55 mktemp(tempfile); 56 curfile = infile; 57 pushsrc(File, curfile); 58 if (argc <= 1) { 59 curfile->fin = stdin; 60 curfile->fname = tostring("-"); 61 getdata(); 62 } else 63 while (argc-- > 1) { 64 if ((curfile->fin = fopen(*++argv, "r")) == NULL) { 65 fprintf(stderr, "grap: can't open %s\n", *argv); 66 onintr(); 67 } 68 curfile->fname = tostring(*argv); 69 getdata(); 70 fclose(curfile->fin); 71 free(curfile->fname); 72 } 73 if (!dbg) 74 unlink(tempfile); 75 exit(0); 76 } 77 78 onintr() 79 { 80 if (!dbg) 81 unlink(tempfile); 82 exit(1); 83 } 84 85 fpecatch() 86 { 87 yyerror("floating point exception"); 88 onintr(); 89 } 90 91 char *grow(ptr, name, num, size) /* make array bigger */ 92 char *ptr, *name; 93 int num, size; 94 { 95 char *p; 96 97 if (ptr == NULL) 98 p = malloc(num * size); 99 else 100 p = realloc(ptr, num * size); 101 if (p == NULL) 102 fatal("can't grow %s to %d", name, num * size); 103 return p; 104 } 105 106 static struct { 107 char *name; 108 double val; 109 } defaults[] ={ 110 "frameht", FRAMEHT, 111 "framewid", FRAMEWID, 112 "ticklen", TICKLEN, 113 "slop", SLOP, 114 NULL, 0 115 }; 116 117 setdefaults() /* set default sizes for variables */ 118 { 119 int i; 120 Obj *p; 121 122 for (i = 0; defaults[i].name != NULL; i++) { 123 p = lookup(defaults[i].name, 1); 124 setvar(p, defaults[i].val); 125 } 126 } 127 128 getdata() /* read input */ 129 { 130 register FILE *fin; 131 char buf[1000], buf1[100], *p; 132 int ln; 133 134 fin = curfile->fin; 135 curfile->lineno = 0; 136 printf(".lf 1 %s\n", curfile->fname); 137 while (fgets(buf, sizeof buf, fin) != NULL) { 138 curfile->lineno++; 139 if (*buf == '.' && *(buf+1) == 'G' && *(buf+2) == '1') { 140 setup(); 141 fprintf(stdout, ".PS%s", &buf[3]); /* maps .G1 [w] to .PS w */ 142 printf(".lf %d\n", curfile->lineno+1); 143 yyparse(); 144 fprintf(stdout, ".PE\n"); 145 printf(".lf %d\n", curfile->lineno+1); 146 fflush(stdout); 147 } else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') { 148 if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) { 149 free(curfile->fname); 150 printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = tostring(buf1)); 151 } else 152 printf(".lf %d\n", curfile->lineno = ln); 153 } else 154 fputs(buf, stdout); 155 } 156 } 157