Blob


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"
12 int dbg = 0;
14 #ifndef GRAPDEFINES
15 #define GRAPDEFINES "#9/lib/grap.defines"
16 #endif
17 char *lib_defines;
19 int lib = 1; /* 1 to include lib_defines */
20 FILE *tfd = NULL;
21 char *tempfile;
23 int synerr = 0;
24 int codegen = 0; /* 1=>output for this picture; 0=>no output */
25 char *cmdname;
27 Obj *objlist = NULL; /* all names stored here */
29 #define BIG 1e30
30 Point ptmin = { NULL, -BIG, -BIG };
31 Point ptmax = { NULL, BIG, BIG };
33 char *version = "version Dec 30, 1995";
35 extern int yyparse(void);
36 extern void setdefaults(void);
37 extern void getdata(void);
39 /* extern int unlink(char *); */ /* in unistd.h */
41 int
42 main(int argc, char *argv[])
43 {
44 extern void onintr(int), fpecatch(int);
46 lib_defines = unsharp(GRAPDEFINES);
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 }
94 void onintr(int n)
95 {
96 if(n){}
97 if(!dbg)
98 unlink(tempfile);
99 exit(1);
102 void fpecatch(int n)
104 ERROR "floating point exception" WARNING;
105 onintr(n);
108 char *grow(char *ptr, char *name, int num, int size) /* make array bigger */
110 char *p;
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;
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 };
132 void setdefaults(void) /* set default sizes for variables */
134 int i;
135 Obj *p;
137 for (i = 0; defaults[i].name != NULL; i++) {
138 p = lookup(defaults[i].name, 1);
139 setvar(p, defaults[i].val);
143 void getdata(void) /* read input */
145 register FILE *fin;
146 char buf[1000], buf1[100];
147 int ln;
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);