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