xref: /plan9/sys/src/cmd/grap/main.c (revision 027288c8a8763d34db13dc89d8bcd6514dbc2163)
13e12c5d1SDavid du Colombier #include <stdio.h>
23e12c5d1SDavid du Colombier #include <signal.h>
33e12c5d1SDavid du Colombier #include <math.h>
43e12c5d1SDavid du Colombier #include <stdlib.h>
53e12c5d1SDavid du Colombier #include <string.h>
63e12c5d1SDavid du Colombier #include "grap.h"
73e12c5d1SDavid du Colombier #include "y.tab.h"
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier int	dbg	= 0;
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier #ifndef GRAPDEFINES
123e12c5d1SDavid du Colombier #define GRAPDEFINES "/sys/lib/grap.defines"
133e12c5d1SDavid du Colombier #endif
143e12c5d1SDavid du Colombier char	*lib_defines	= GRAPDEFINES;
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier int	lib	= 1;		/* 1 to include lib_defines */
173e12c5d1SDavid du Colombier FILE	*tfd	= NULL;
183e12c5d1SDavid du Colombier char	tempfile[L_tmpnam];
193e12c5d1SDavid du Colombier 
203e12c5d1SDavid du Colombier int	synerr	= 0;
213e12c5d1SDavid du Colombier int	codegen	= 0;   		/* 1=>output for this picture; 0=>no output */
223e12c5d1SDavid du Colombier char	*cmdname;
233e12c5d1SDavid du Colombier 
243e12c5d1SDavid du Colombier Obj	*objlist = NULL;	/* all names stored here */
253e12c5d1SDavid du Colombier 
263e12c5d1SDavid du Colombier #define	BIG	1e30
273e12c5d1SDavid du Colombier Point	ptmin	= { NULL, -BIG, -BIG };
283e12c5d1SDavid du Colombier Point	ptmax	= { NULL, BIG, BIG };
293e12c5d1SDavid du Colombier 
307dd7cddfSDavid du Colombier char	*version = "version Dec 30, 1995";
313e12c5d1SDavid du Colombier 
323e12c5d1SDavid du Colombier extern int yyparse(void);
333e12c5d1SDavid du Colombier extern void setdefaults(void);
343e12c5d1SDavid du Colombier extern void getdata(void);
353e12c5d1SDavid du Colombier extern	int	unlink(char *);
363e12c5d1SDavid du Colombier 
37*027288c8SDavid du Colombier void
main(int argc,char * argv[])383e12c5d1SDavid du Colombier main(int argc, char *argv[])
393e12c5d1SDavid du Colombier {
403e12c5d1SDavid du Colombier 	extern void onintr(int), fpecatch(int);
413e12c5d1SDavid du Colombier 
423e12c5d1SDavid du Colombier 	if (signal(SIGINT, SIG_IGN) != SIG_IGN)
433e12c5d1SDavid du Colombier 		signal(SIGINT, onintr);
443e12c5d1SDavid du Colombier 	signal(SIGFPE, fpecatch);
453e12c5d1SDavid du Colombier 	cmdname = argv[0];
463e12c5d1SDavid du Colombier 	tmpnam(tempfile);
473e12c5d1SDavid du Colombier 	while (argc > 1 && *argv[1] == '-') {
483e12c5d1SDavid du Colombier 		switch (argv[1][1]) {
493e12c5d1SDavid du Colombier 		case 'd':
503e12c5d1SDavid du Colombier 			dbg = 1;
513e12c5d1SDavid du Colombier 			tfd = stdout;
523e12c5d1SDavid du Colombier 			strcpy(tempfile, "grap.temp");
533e12c5d1SDavid du Colombier 			unlink(tempfile);
543e12c5d1SDavid du Colombier 			fprintf(stderr, "%s\n", version);
553e12c5d1SDavid du Colombier 			break;
563e12c5d1SDavid du Colombier 		case 'l':	/* turn off /usr/lib inclusion */
573e12c5d1SDavid du Colombier 			lib = 0;
583e12c5d1SDavid du Colombier 			break;
593e12c5d1SDavid du Colombier 		}
603e12c5d1SDavid du Colombier 		argc--;
613e12c5d1SDavid du Colombier 		argv++;
623e12c5d1SDavid du Colombier 	}
633e12c5d1SDavid du Colombier 	setdefaults();
643e12c5d1SDavid du Colombier 	curfile = infile;
653e12c5d1SDavid du Colombier 	if (argc <= 1) {
663e12c5d1SDavid du Colombier 		curfile->fin = stdin;
673e12c5d1SDavid du Colombier 		curfile->fname = tostring("-");
683e12c5d1SDavid du Colombier 		pushsrc(File, curfile->fname);
693e12c5d1SDavid du Colombier 		getdata();
703e12c5d1SDavid du Colombier 	} else
713e12c5d1SDavid du Colombier 		while (argc-- > 1) {
723e12c5d1SDavid du Colombier 			if ((curfile->fin = fopen(*++argv, "r")) == NULL) {
733e12c5d1SDavid du Colombier 				fprintf(stderr, "grap: can't open %s\n", *argv);
743e12c5d1SDavid du Colombier 				onintr(0);
753e12c5d1SDavid du Colombier 			}
763e12c5d1SDavid du Colombier 			curfile->fname = tostring(*argv);
773e12c5d1SDavid du Colombier 			pushsrc(File, curfile->fname);
783e12c5d1SDavid du Colombier 			getdata();
793e12c5d1SDavid du Colombier 			fclose(curfile->fin);
803e12c5d1SDavid du Colombier 			free(curfile->fname);
813e12c5d1SDavid du Colombier 		}
823e12c5d1SDavid du Colombier 	if (!dbg)
833e12c5d1SDavid du Colombier 		unlink(tempfile);
843e12c5d1SDavid du Colombier 	exit(0);
853e12c5d1SDavid du Colombier }
863e12c5d1SDavid du Colombier 
onintr(int n)873e12c5d1SDavid du Colombier void onintr(int n)
883e12c5d1SDavid du Colombier {
893e12c5d1SDavid du Colombier 	n;
903e12c5d1SDavid du Colombier 	if (!dbg)
913e12c5d1SDavid du Colombier 		unlink(tempfile);
923e12c5d1SDavid du Colombier 	exit(1);
933e12c5d1SDavid du Colombier }
943e12c5d1SDavid du Colombier 
fpecatch(int n)953e12c5d1SDavid du Colombier void fpecatch(int n)
963e12c5d1SDavid du Colombier {
973e12c5d1SDavid du Colombier 	ERROR "floating point exception" WARNING;
983e12c5d1SDavid du Colombier 	onintr(n);
993e12c5d1SDavid du Colombier }
1003e12c5d1SDavid du Colombier 
grow(char * ptr,char * name,int num,int size)1013e12c5d1SDavid du Colombier char *grow(char *ptr, char *name, int num, int size)	/* make array bigger */
1023e12c5d1SDavid du Colombier {
1033e12c5d1SDavid du Colombier 	char *p;
1043e12c5d1SDavid du Colombier 
1053e12c5d1SDavid du Colombier 	if (ptr == NULL)
1063e12c5d1SDavid du Colombier 		p = malloc(num * size);
1073e12c5d1SDavid du Colombier 	else
1083e12c5d1SDavid du Colombier 		p = realloc(ptr, num * size);
1093e12c5d1SDavid du Colombier 	if (p == NULL)
1103e12c5d1SDavid du Colombier 		ERROR "can't grow %s to %d", name, num * size FATAL;
1113e12c5d1SDavid du Colombier 	return p;
1123e12c5d1SDavid du Colombier }
1133e12c5d1SDavid du Colombier 
1143e12c5d1SDavid du Colombier static struct {
1153e12c5d1SDavid du Colombier 	char	*name;
1163e12c5d1SDavid du Colombier 	double	val;
1173e12c5d1SDavid du Colombier } defaults[] ={
1183e12c5d1SDavid du Colombier 	"frameht", FRAMEHT,
1193e12c5d1SDavid du Colombier 	"framewid", FRAMEWID,
1203e12c5d1SDavid du Colombier 	"ticklen", TICKLEN,
1213e12c5d1SDavid du Colombier 	"slop", SLOP,
1223e12c5d1SDavid du Colombier 	NULL, 0
1233e12c5d1SDavid du Colombier };
1243e12c5d1SDavid du Colombier 
setdefaults(void)1253e12c5d1SDavid du Colombier void setdefaults(void)	/* set default sizes for variables */
1263e12c5d1SDavid du Colombier {
1273e12c5d1SDavid du Colombier 	int i;
1283e12c5d1SDavid du Colombier 	Obj *p;
1293e12c5d1SDavid du Colombier 
1303e12c5d1SDavid du Colombier 	for (i = 0; defaults[i].name != NULL; i++) {
1313e12c5d1SDavid du Colombier 		p = lookup(defaults[i].name, 1);
1323e12c5d1SDavid du Colombier 		setvar(p, defaults[i].val);
1333e12c5d1SDavid du Colombier 	}
1343e12c5d1SDavid du Colombier }
1353e12c5d1SDavid du Colombier 
getdata(void)1363e12c5d1SDavid du Colombier void getdata(void)		/* read input */
1373e12c5d1SDavid du Colombier {
1383e12c5d1SDavid du Colombier 	register FILE *fin;
1393e12c5d1SDavid du Colombier 	char buf[1000], buf1[100];
1403e12c5d1SDavid du Colombier 	int ln;
1413e12c5d1SDavid du Colombier 
1423e12c5d1SDavid du Colombier 	fin = curfile->fin;
1433e12c5d1SDavid du Colombier 	curfile->lineno = 0;
1443e12c5d1SDavid du Colombier 	printf(".lf 1 %s\n", curfile->fname);
1453e12c5d1SDavid du Colombier 	while (fgets(buf, sizeof buf, fin) != NULL) {
1463e12c5d1SDavid du Colombier 		curfile->lineno++;
1473e12c5d1SDavid du Colombier 		if (*buf == '.' && *(buf+1) == 'G' && *(buf+2) == '1') {
1483e12c5d1SDavid du Colombier 			setup();
1493e12c5d1SDavid du Colombier 			fprintf(stdout, ".PS%s", &buf[3]);	/* maps .G1 [w] to .PS w */
1507dd7cddfSDavid du Colombier 			printf("scale = 1\n");	/* defends against cip users */
1513e12c5d1SDavid du Colombier 			printf(".lf %d\n", curfile->lineno+1);
1523e12c5d1SDavid du Colombier 			yyparse();
1533e12c5d1SDavid du Colombier 			fprintf(stdout, ".PE\n");
1543e12c5d1SDavid du Colombier 			printf(".lf %d\n", curfile->lineno+1);
1553e12c5d1SDavid du Colombier 			fflush(stdout);
1563e12c5d1SDavid du Colombier 		} else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') {
1573e12c5d1SDavid du Colombier 			if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) {
1583e12c5d1SDavid du Colombier 				free(curfile->fname);
1593e12c5d1SDavid du Colombier 				printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = tostring(buf1));
1603e12c5d1SDavid du Colombier 			} else
1613e12c5d1SDavid du Colombier 				printf(".lf %d\n", curfile->lineno = ln);
1623e12c5d1SDavid du Colombier 		} else
1633e12c5d1SDavid du Colombier 			fputs(buf, stdout);
1643e12c5d1SDavid du Colombier 	}
1653e12c5d1SDavid du Colombier }
166