11 double margin = MARGIN; /* extra space around edges */
12 extern double frame_ht, frame_wid, ticklen;
13 extern int just, sizeop, tick_dir;
14 extern double sizexpr, lab_up, lab_rt;
16 char graphname[50] = "Graph";
17 char graphpos[200] = "";
19 void print(void) /* arrange final output */
24 double dx, dy, xfac, yfac;
27 fclose(tfd); /* end the temp file */
31 if ((p=lookup("margin",0)) != NULL)
33 if (frame_ht < 0) /* wasn't set explicitly, so use default */
34 frame_ht = getvar(lookup("frameht", 0));
36 frame_wid = getvar(lookup("framewid", 0));
38 for (p = objlist; p; p = p->next) {
39 dprintf("print: name = <%s>, type = %d\n", p->name, p->type);
40 if (p->type == NAME) {
44 fprintf(tfd, "\t# %s %g .. %g, %g .. %g\n",
45 p->name, pt.x, pt1.x, pt.y, pt1.y);
48 ERROR "can't take log of x coord %g", pt.x FATAL;
54 ERROR "can't take log of y coord %g", pt.y FATAL;
58 if (!(p->coord & XFLAG)) {
63 if (!(p->coord & YFLAG)) {
68 if (autoticks && strcmp(p->name, dflt_coord) == 0) {
72 p->pt.x = pow(10.0, pt.x);
73 p->pt1.x = pow(10.0, pt1.x);
76 p->pt.y = pow(10.0, pt.y);
77 p->pt1.y = pow(10.0, pt1.y);
83 xfac = dx > 0 ? frame_wid/dx : frame_wid/2;
84 yfac = dy > 0 ? frame_ht/dy : frame_ht/2;
86 fprintf(tfd, "define xy_%s @ ", p->name);
88 fprintf(tfd, "\t(($1)-(%g))*%g", pt.x, xfac);
90 fprintf(tfd, "\t%g", xfac);
92 fprintf(tfd, ", (($2)-(%g))*%g @\n", pt.y, yfac);
94 fprintf(tfd, ", %g @\n", yfac);
95 fprintf(tfd, "define x_%s @ ", p->name);
97 fprintf(tfd, "\t(($1)-(%g))*%g @\n", pt.x, xfac);
99 fprintf(tfd, "\t%g @\n", xfac);
100 fprintf(tfd, "define y_%s @ ", p->name);
102 fprintf(tfd, "\t(($1)-(%g))*%g @\n", pt.y, yfac);
104 fprintf(tfd, "\t%g @\n", yfac);
109 if (codegen && autoticks && dfp)
112 if ((fd = fopen(tempfile, "r")) != NULL) {
113 while ((c = getc(fd)) != EOF)
120 void endstat(void) /* clean up after each statement */
124 lab_up = lab_rt = 0.0;
133 void graph(char *s) /* graph statement */
139 fprintf(stdout, "%s: [\n", graphname);
140 print(); /* pump out previous graph */
141 fprintf(stdout, "\n] %s\n", graphpos);
145 dprintf("into graph with <%s>\n", s);
148 while ((c = *s) == ' ' || c == '\t')
151 ERROR "no name on graph statement" WARNING;
152 if (!isupper((uchar)s[0]))
153 ERROR "graph name %s must be capitalized", s WARNING;
154 for (p=graphname; (c = *s) != ' ' && c != '\t' && c != '\0'; )
158 dprintf("graphname = <%s>, graphpos = <%s>\n", graphname, graphpos);
163 void setup(void) /* done at each .G1 */
165 static int firstG1 = 0;
169 frame_ht = frame_wid = -1; /* reset in frame() */
170 ticklen = getvar(lookup("ticklen", 0));
173 codegen = synerr = 0;
174 strcpy(graphname, "Graph");
175 strcpy(graphpos, "");
178 void do_first(void) /* done at first .G1: definitions, etc. */
181 extern char *lib_defines;
182 static char buf[100], buf1[100]; /* static because pbstr uses them */
185 snprintf(buf, sizeof buf, "define pid /%d/\n", getpid());
188 if ((fp = fopen(lib_defines, "r")) != NULL) {
189 snprintf(buf1, sizeof buf, "copy \"%s\"\n", lib_defines);
193 fprintf(stderr, "grap warning: can't open %s\n", lib_defines);
198 void reset(void) /* done at each "graph ..." statement */
200 Obj *p, *np, *deflist;
201 extern int tlist, toffside, autodir;
203 curr_coord = dflt_coord;
205 autoticks = LEFT|BOT;
207 tside = tlist = toffside = 0;
211 for (p = objlist; p; p = np) {
213 if (p->type == DEFNAME || p->type == VARNAME) {
230 if ((tfd = fopen(tempfile, "w")) == NULL) {
231 fprintf(stderr, "grap: can't open %s\n", tempfile);