| #include <stdio.h> |
| #include <string.h> |
| #include "grap.h" |
| #include "y.tab.h" |
| |
| int pointsize = 10; /* assumed pointsize to start */ |
| int ps_set = 0; /* someone has set pointsize explicitly */ |
| |
| double textht = 1.0/6.0; /* 6 lines/inch */ |
| double textwid = 1; /* width of text box for vertical */ |
| |
| double lab_up = 0.0; /* extra motion for label */ |
| double lab_rt = 0.0; /* extra motion for label */ |
| double lab_wid = 0.0; /* override default width computation */ |
| |
| void labelwid(double amt) |
| { |
| lab_wid = amt + .00001; |
| } |
| |
| void labelmove(int dir, double amt) /* record direction & motion of position corr */ |
| { |
| switch (dir) { |
| case UP: lab_up += amt; break; |
| case DOWN: lab_up -= amt; break; |
| case LEFT: lab_rt -= amt; break; |
| case RIGHT: lab_rt += amt; break; |
| } |
| } |
| |
| void label(int label_side, Attr *stringlist) /* stick label on label_side */ |
| { |
| int m; |
| Attr *ap; |
| |
| fprintf(tfd, "\ttextht = %g\n", textht); |
| if (lab_wid != 0.0) { |
| fprintf(tfd, "\ttextwid = %g\n", lab_wid); |
| lab_wid = 0; |
| } else if (label_side == LEFT || label_side == RIGHT) { |
| textwid = 0; |
| for (ap = stringlist; ap != NULL; ap = ap->next) |
| if ((m = strlen(ap->sval)) > textwid) |
| textwid = m; |
| textwid /= 15; /* estimate width at 15 chars/inch */ |
| fprintf(tfd, "\ttextwid = %g\n", textwid); |
| } |
| fprintf(tfd, "Label:\t%s", slprint(stringlist)); |
| freeattr(stringlist); |
| switch (label_side) { |
| case BOT: |
| case 0: |
| fprintf(tfd, " with .n at Frame.s - (0,2 * textht)"); |
| break; |
| case LEFT: |
| fprintf(tfd, " wid textwid with .e at Frame.w - (0.2,0)"); |
| break; |
| case RIGHT: |
| fprintf(tfd, " wid textwid with .w at Frame.e + (0.2,0)"); |
| break; |
| case TOP: |
| fprintf(tfd, " with .s at Frame.n + (0,2 * textht)"); |
| break; |
| } |
| lab_adjust(); |
| fprintf(tfd, "\n"); |
| label_side = BOT; |
| } |
| |
| void lab_adjust(void) /* add a string to adjust labels, ticks, etc. */ |
| { |
| if (lab_up != 0.0 || lab_rt != 0.0) |
| fprintf(tfd, " + (%g,%g)", lab_rt, lab_up); |
| } |
| |
| char *sizeit(Attr *ap) /* add \s..\s to ap->sval */ |
| { |
| int n; |
| static char buf[1000]; |
| |
| if (!ap->op) { /* no explicit size command */ |
| if (ps_set) { |
| sprintf(buf, "\\s%d%s\\s0", pointsize, ap->sval); |
| return buf; |
| } else |
| return ap->sval; |
| } else if (!ps_set) { /* explicit size but no global size */ |
| n = (int) ap->fval; |
| switch (ap->op) { |
| case ' ': /* absolute size */ |
| sprintf(buf, "\\s%d%s\\s0", n, ap->sval); |
| break; |
| case '+': /* better be only one digit! */ |
| sprintf(buf, "\\s+%d%s\\s-%d", n, ap->sval, n); |
| break; |
| case '-': |
| sprintf(buf, "\\s-%d%s\\s+%d", n, ap->sval, n); |
| break; |
| case '*': |
| case '/': |
| return ap->sval; /* ignore for now */ |
| } |
| return buf; |
| } else { |
| /* explicit size and a global background size */ |
| n = (int) ap->fval; |
| switch (ap->op) { |
| case ' ': /* absolute size */ |
| sprintf(buf, "\\s%d%s\\s0", n, ap->sval); |
| break; |
| case '+': |
| sprintf(buf, "\\s%d%s\\s0", pointsize+n, ap->sval); |
| break; |
| case '-': |
| sprintf(buf, "\\s%d%s\\s0", pointsize-n, ap->sval); |
| break; |
| case '*': |
| case '/': |
| return ap->sval; /* ignore for now */ |
| } |
| return buf; |
| } |
| } |