plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

main.c (3591B)


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