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