xref: /plan9/sys/src/cmd/grap/main.c (revision 027288c8a8763d34db13dc89d8bcd6514dbc2163)
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 Dec 30, 1995";
31 
32 extern int yyparse(void);
33 extern void setdefaults(void);
34 extern void getdata(void);
35 extern	int	unlink(char *);
36 
37 void
main(int argc,char * argv[])38 main(int argc, char *argv[])
39 {
40 	extern void onintr(int), fpecatch(int);
41 
42 	if (signal(SIGINT, SIG_IGN) != SIG_IGN)
43 		signal(SIGINT, onintr);
44 	signal(SIGFPE, fpecatch);
45 	cmdname = argv[0];
46 	tmpnam(tempfile);
47 	while (argc > 1 && *argv[1] == '-') {
48 		switch (argv[1][1]) {
49 		case 'd':
50 			dbg = 1;
51 			tfd = stdout;
52 			strcpy(tempfile, "grap.temp");
53 			unlink(tempfile);
54 			fprintf(stderr, "%s\n", version);
55 			break;
56 		case 'l':	/* turn off /usr/lib inclusion */
57 			lib = 0;
58 			break;
59 		}
60 		argc--;
61 		argv++;
62 	}
63 	setdefaults();
64 	curfile = infile;
65 	if (argc <= 1) {
66 		curfile->fin = stdin;
67 		curfile->fname = tostring("-");
68 		pushsrc(File, curfile->fname);
69 		getdata();
70 	} else
71 		while (argc-- > 1) {
72 			if ((curfile->fin = fopen(*++argv, "r")) == NULL) {
73 				fprintf(stderr, "grap: can't open %s\n", *argv);
74 				onintr(0);
75 			}
76 			curfile->fname = tostring(*argv);
77 			pushsrc(File, curfile->fname);
78 			getdata();
79 			fclose(curfile->fin);
80 			free(curfile->fname);
81 		}
82 	if (!dbg)
83 		unlink(tempfile);
84 	exit(0);
85 }
86 
onintr(int n)87 void onintr(int n)
88 {
89 	n;
90 	if (!dbg)
91 		unlink(tempfile);
92 	exit(1);
93 }
94 
fpecatch(int n)95 void fpecatch(int n)
96 {
97 	ERROR "floating point exception" WARNING;
98 	onintr(n);
99 }
100 
grow(char * ptr,char * name,int num,int size)101 char *grow(char *ptr, char *name, int num, int size)	/* make array bigger */
102 {
103 	char *p;
104 
105 	if (ptr == NULL)
106 		p = malloc(num * size);
107 	else
108 		p = realloc(ptr, num * size);
109 	if (p == NULL)
110 		ERROR "can't grow %s to %d", name, num * size FATAL;
111 	return p;
112 }
113 
114 static struct {
115 	char	*name;
116 	double	val;
117 } defaults[] ={
118 	"frameht", FRAMEHT,
119 	"framewid", FRAMEWID,
120 	"ticklen", TICKLEN,
121 	"slop", SLOP,
122 	NULL, 0
123 };
124 
setdefaults(void)125 void setdefaults(void)	/* set default sizes for variables */
126 {
127 	int i;
128 	Obj *p;
129 
130 	for (i = 0; defaults[i].name != NULL; i++) {
131 		p = lookup(defaults[i].name, 1);
132 		setvar(p, defaults[i].val);
133 	}
134 }
135 
getdata(void)136 void getdata(void)		/* read input */
137 {
138 	register FILE *fin;
139 	char buf[1000], buf1[100];
140 	int ln;
141 
142 	fin = curfile->fin;
143 	curfile->lineno = 0;
144 	printf(".lf 1 %s\n", curfile->fname);
145 	while (fgets(buf, sizeof buf, fin) != NULL) {
146 		curfile->lineno++;
147 		if (*buf == '.' && *(buf+1) == 'G' && *(buf+2) == '1') {
148 			setup();
149 			fprintf(stdout, ".PS%s", &buf[3]);	/* maps .G1 [w] to .PS w */
150 			printf("scale = 1\n");	/* defends against cip users */
151 			printf(".lf %d\n", curfile->lineno+1);
152 			yyparse();
153 			fprintf(stdout, ".PE\n");
154 			printf(".lf %d\n", curfile->lineno+1);
155 			fflush(stdout);
156 		} else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') {
157 			if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) {
158 				free(curfile->fname);
159 				printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = tostring(buf1));
160 			} else
161 				printf(".lf %d\n", curfile->lineno = ln);
162 		} else
163 			fputs(buf, stdout);
164 	}
165 }
166