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