label.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "grap.h"
  4. #include "y.tab.h"
  5. int pointsize = 10; /* assumed pointsize to start */
  6. int ps_set = 0; /* someone has set pointsize explicitly */
  7. double textht = 1.0/6.0; /* 6 lines/inch */
  8. double textwid = 1; /* width of text box for vertical */
  9. double lab_up = 0.0; /* extra motion for label */
  10. double lab_rt = 0.0; /* extra motion for label */
  11. double lab_wid = 0.0; /* override default width computation */
  12. void labelwid(double amt)
  13. {
  14. lab_wid = amt + .00001;
  15. }
  16. void labelmove(int dir, double amt) /* record direction & motion of position corr */
  17. {
  18. switch (dir) {
  19. case UP: lab_up += amt; break;
  20. case DOWN: lab_up -= amt; break;
  21. case LEFT: lab_rt -= amt; break;
  22. case RIGHT: lab_rt += amt; break;
  23. }
  24. }
  25. void label(int label_side, Attr *stringlist) /* stick label on label_side */
  26. {
  27. int m;
  28. Attr *ap;
  29. fprintf(tfd, "\ttextht = %g\n", textht);
  30. if (lab_wid != 0.0) {
  31. fprintf(tfd, "\ttextwid = %g\n", lab_wid);
  32. lab_wid = 0;
  33. } else if (label_side == LEFT || label_side == RIGHT) {
  34. textwid = 0;
  35. for (ap = stringlist; ap != NULL; ap = ap->next)
  36. if ((m = strlen(ap->sval)) > textwid)
  37. textwid = m;
  38. textwid /= 15; /* estimate width at 15 chars/inch */
  39. fprintf(tfd, "\ttextwid = %g\n", textwid);
  40. }
  41. fprintf(tfd, "Label:\t%s", slprint(stringlist));
  42. freeattr(stringlist);
  43. switch (label_side) {
  44. case BOT:
  45. case 0:
  46. fprintf(tfd, " with .n at Frame.s - (0,2 * textht)");
  47. break;
  48. case LEFT:
  49. fprintf(tfd, " wid textwid with .e at Frame.w - (0.2,0)");
  50. break;
  51. case RIGHT:
  52. fprintf(tfd, " wid textwid with .w at Frame.e + (0.2,0)");
  53. break;
  54. case TOP:
  55. fprintf(tfd, " with .s at Frame.n + (0,2 * textht)");
  56. break;
  57. }
  58. lab_adjust();
  59. fprintf(tfd, "\n");
  60. label_side = BOT;
  61. }
  62. void lab_adjust(void) /* add a string to adjust labels, ticks, etc. */
  63. {
  64. if (lab_up != 0.0 || lab_rt != 0.0)
  65. fprintf(tfd, " + (%g,%g)", lab_rt, lab_up);
  66. }
  67. char *sizeit(Attr *ap) /* add \s..\s to ap->sval */
  68. {
  69. int n;
  70. static char buf[1000];
  71. if (!ap->op) { /* no explicit size command */
  72. if (ps_set) {
  73. sprintf(buf, "\\s%d%s\\s0", pointsize, ap->sval);
  74. return buf;
  75. } else
  76. return ap->sval;
  77. } else if (!ps_set) { /* explicit size but no global size */
  78. n = (int) ap->fval;
  79. switch (ap->op) {
  80. case ' ': /* absolute size */
  81. sprintf(buf, "\\s%d%s\\s0", n, ap->sval);
  82. break;
  83. case '+': /* better be only one digit! */
  84. sprintf(buf, "\\s+%d%s\\s-%d", n, ap->sval, n);
  85. break;
  86. case '-':
  87. sprintf(buf, "\\s-%d%s\\s+%d", n, ap->sval, n);
  88. break;
  89. case '*':
  90. case '/':
  91. return ap->sval; /* ignore for now */
  92. }
  93. return buf;
  94. } else {
  95. /* explicit size and a global background size */
  96. n = (int) ap->fval;
  97. switch (ap->op) {
  98. case ' ': /* absolute size */
  99. sprintf(buf, "\\s%d%s\\s0", n, ap->sval);
  100. break;
  101. case '+':
  102. sprintf(buf, "\\s%d%s\\s0", pointsize+n, ap->sval);
  103. break;
  104. case '-':
  105. sprintf(buf, "\\s%d%s\\s0", pointsize-n, ap->sval);
  106. break;
  107. case '*':
  108. case '/':
  109. return ap->sval; /* ignore for now */
  110. }
  111. return buf;
  112. }
  113. }