Blame


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