| #define _BSD_SOURCE 1 /* strdup, mkstemp */ |
| #include <stdio.h> |
| #include <signal.h> |
| #include <math.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <string.h> |
| #include "grap.h" |
| #include "y.tab.h" |
| |
| int dbg = 0; |
| |
| #ifndef GRAPDEFINES |
| #define GRAPDEFINES "#9/lib/grap.defines" |
| #endif |
| char *lib_defines; |
| |
| int lib = 1; /* 1 to include lib_defines */ |
| FILE *tfd = NULL; |
| char *tempfile; |
| |
| 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 *); */ /* in unistd.h */ |
| |
| int |
| main(int argc, char *argv[]) |
| { |
| extern void onintr(int), fpecatch(int); |
| |
| lib_defines = unsharp(GRAPDEFINES); |
| |
| if (signal(SIGINT, SIG_IGN) != SIG_IGN) |
| signal(SIGINT, onintr); |
| signal(SIGFPE, fpecatch); |
| cmdname = argv[0]; |
| tempfile = strdup("grap.XXXXXX"); |
| mkstemp(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) |
| { |
| if(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); |
| } |
| } |