diff options
Diffstat (limited to 'src/cmd/grap/main.c')
-rw-r--r-- | src/cmd/grap/main.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/cmd/grap/main.c b/src/cmd/grap/main.c new file mode 100644 index 00000000..0aa67417 --- /dev/null +++ b/src/cmd/grap/main.c @@ -0,0 +1,164 @@ +#include <stdio.h> +#include <signal.h> +#include <math.h> +#include <stdlib.h> +#include <string.h> +#include "grap.h" +#include "y.tab.h" + +int dbg = 0; + +#ifndef GRAPDEFINES +#define GRAPDEFINES "#9/sys/lib/grap.defines" +#endif +char *lib_defines = GRAPDEFINES; + +int lib = 1; /* 1 to include lib_defines */ +FILE *tfd = NULL; +char tempfile[L_tmpnam]; + +int synerr = 0; +int codegen = 0; /* 1=>output for this picture; 0=>no output */ +char *cmdname; + +Obj *objlist = NULL; /* all names stored here */ + +#define BIG 1e30 +Point ptmin = { NULL, -BIG, -BIG }; +Point ptmax = { NULL, BIG, BIG }; + +char *version = "version Dec 30, 1995"; + +extern int yyparse(void); +extern void setdefaults(void); +extern void getdata(void); +extern int unlink(char *); + +main(int argc, char *argv[]) +{ + extern void onintr(int), fpecatch(int); + + if (signal(SIGINT, SIG_IGN) != SIG_IGN) + signal(SIGINT, onintr); + signal(SIGFPE, fpecatch); + cmdname = argv[0]; + tmpnam(tempfile); + while (argc > 1 && *argv[1] == '-') { + switch (argv[1][1]) { + case 'd': + dbg = 1; + tfd = stdout; + strcpy(tempfile, "grap.temp"); + unlink(tempfile); + fprintf(stderr, "%s\n", version); + break; + case 'l': /* turn off /usr/lib inclusion */ + lib = 0; + break; + } + argc--; + argv++; + } + setdefaults(); + curfile = infile; + if (argc <= 1) { + curfile->fin = stdin; + curfile->fname = tostring("-"); + pushsrc(File, curfile->fname); + getdata(); + } else + while (argc-- > 1) { + if ((curfile->fin = fopen(*++argv, "r")) == NULL) { + fprintf(stderr, "grap: can't open %s\n", *argv); + onintr(0); + } + curfile->fname = tostring(*argv); + pushsrc(File, curfile->fname); + getdata(); + fclose(curfile->fin); + free(curfile->fname); + } + if (!dbg) + unlink(tempfile); + exit(0); +} + +void onintr(int n) +{ + n; + if (!dbg) + unlink(tempfile); + exit(1); +} + +void fpecatch(int n) +{ + ERROR "floating point exception" WARNING; + onintr(n); +} + +char *grow(char *ptr, char *name, int num, int size) /* make array bigger */ +{ + char *p; + + if (ptr == NULL) + p = malloc(num * size); + else + p = realloc(ptr, num * size); + if (p == NULL) + ERROR "can't grow %s to %d", name, num * size FATAL; + return p; +} + +static struct { + char *name; + double val; +} defaults[] ={ + "frameht", FRAMEHT, + "framewid", FRAMEWID, + "ticklen", TICKLEN, + "slop", SLOP, + NULL, 0 +}; + +void setdefaults(void) /* set default sizes for variables */ +{ + int i; + Obj *p; + + for (i = 0; defaults[i].name != NULL; i++) { + p = lookup(defaults[i].name, 1); + setvar(p, defaults[i].val); + } +} + +void getdata(void) /* read input */ +{ + register FILE *fin; + char buf[1000], buf1[100]; + int ln; + + fin = curfile->fin; + curfile->lineno = 0; + printf(".lf 1 %s\n", curfile->fname); + while (fgets(buf, sizeof buf, fin) != NULL) { + curfile->lineno++; + if (*buf == '.' && *(buf+1) == 'G' && *(buf+2) == '1') { + setup(); + fprintf(stdout, ".PS%s", &buf[3]); /* maps .G1 [w] to .PS w */ + printf("scale = 1\n"); /* defends against cip users */ + printf(".lf %d\n", curfile->lineno+1); + yyparse(); + fprintf(stdout, ".PE\n"); + printf(".lf %d\n", curfile->lineno+1); + fflush(stdout); + } else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') { + if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) { + free(curfile->fname); + printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = tostring(buf1)); + } else + printf(".lf %d\n", curfile->lineno = ln); + } else + fputs(buf, stdout); + } +} |