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