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