main.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "pic.h"
  6. #include "y.tab.h"
  7. char *version = "version July 5, 1993";
  8. obj **objlist = 0; /* store the elements here */
  9. int nobjlist = 0; /* size of objlist array */
  10. int nobj = 0;
  11. Attr *attr; /* attributes stored here as collected */
  12. int nattrlist = 0;
  13. int nattr = 0; /* number of entries in attr_list */
  14. Text *text = 0; /* text strings stored here as collected */
  15. int ntextlist = 0; /* size of text[] array */
  16. int ntext = 0;
  17. int ntext1 = 0; /* record ntext here on entry to each figure */
  18. double curx = 0;
  19. double cury = 0;
  20. int hvmode = R_DIR; /* R => join left to right, D => top to bottom, etc. */
  21. int codegen = 0; /* 1=>output for this picture; 0=>no output */
  22. char *PEstring; /* "PS" or "PE" picked up by lexer */
  23. double deltx = 6; /* max x value in output, for scaling */
  24. double delty = 6; /* max y value in output, for scaling */
  25. int dbg = 0;
  26. int lineno = 0;
  27. char *filename = "-";
  28. int synerr = 0;
  29. int anyerr = 0; /* becomes 1 if synerr ever 1 */
  30. char *cmdname;
  31. double xmin = 30000; /* min values found in actual data */
  32. double ymin = 30000;
  33. double xmax = -30000; /* max */
  34. double ymax = -30000;
  35. void fpecatch(int);
  36. void getdata(void), setdefaults(void);
  37. void setfval(char *, double);
  38. int getpid(void);
  39. main(int argc, char *argv[])
  40. {
  41. char buf[20];
  42. signal(SIGFPE, fpecatch);
  43. cmdname = argv[0];
  44. while (argc > 1 && *argv[1] == '-') {
  45. switch (argv[1][1]) {
  46. case 'd':
  47. dbg = atoi(&argv[1][2]);
  48. if (dbg == 0)
  49. dbg = 1;
  50. fprintf(stderr, "%s\n", version);
  51. break;
  52. case 'V':
  53. fprintf(stderr, "%s\n", version);
  54. return 0;
  55. }
  56. argc--;
  57. argv++;
  58. }
  59. setdefaults();
  60. objlist = (obj **) grow((char *)objlist, "objlist", nobjlist += 1000, sizeof(obj *));
  61. text = (Text *) grow((char *)text, "text", ntextlist += 1000, sizeof(Text));
  62. attr = (Attr *) grow((char *)attr, "attr", nattrlist += 100, sizeof(Attr));
  63. sprintf(buf, "/%d/", getpid());
  64. pushsrc(String, buf);
  65. definition("pid");
  66. curfile = infile;
  67. pushsrc(File, curfile->fname);
  68. if (argc <= 1) {
  69. curfile->fin = stdin;
  70. curfile->fname = tostring("-");
  71. getdata();
  72. } else
  73. while (argc-- > 1) {
  74. if ((curfile->fin = fopen(*++argv, "r")) == NULL) {
  75. fprintf(stderr, "%s: can't open %s\n", cmdname, *argv);
  76. exit(1);
  77. }
  78. curfile->fname = tostring(*argv);
  79. getdata();
  80. fclose(curfile->fin);
  81. free(curfile->fname);
  82. }
  83. return anyerr;
  84. }
  85. void fpecatch(int n)
  86. {
  87. ERROR "floating point exception %d", n FATAL;
  88. }
  89. char *grow(char *ptr, char *name, int num, int size) /* make array bigger */
  90. {
  91. char *p;
  92. if (ptr == NULL)
  93. p = malloc(num * size);
  94. else
  95. p = realloc(ptr, num * size);
  96. if (p == NULL)
  97. ERROR "can't grow %s to %d", name, num * size FATAL;
  98. return p;
  99. }
  100. static struct {
  101. char *name;
  102. double val;
  103. short scalable; /* 1 => adjust when "scale" changes */
  104. } defaults[] ={
  105. "scale", SCALE, 1,
  106. "lineht", HT, 1,
  107. "linewid", HT, 1,
  108. "moveht", HT, 1,
  109. "movewid", HT, 1,
  110. "dashwid", HT10, 1,
  111. "boxht", HT, 1,
  112. "boxwid", WID, 1,
  113. "circlerad", HT2, 1,
  114. "arcrad", HT2, 1,
  115. "ellipseht", HT, 1,
  116. "ellipsewid", WID, 1,
  117. "arrowht", HT5, 1,
  118. "arrowwid", HT10, 1,
  119. "arrowhead", 2, 0, /* arrowhead style */
  120. "textht", 0.0, 1, /* 6 lines/inch is also a useful value */
  121. "textwid", 0.0, 1,
  122. "maxpsht", MAXHT, 0,
  123. "maxpswid", MAXWID, 0,
  124. "fillval", 0.7, 0, /* gray value for filling boxes */
  125. NULL, 0, 0
  126. };
  127. void setdefaults(void) /* set default sizes for variables like boxht */
  128. {
  129. int i;
  130. YYSTYPE v;
  131. for (i = 0; defaults[i].name != NULL; i++) {
  132. v.f = defaults[i].val;
  133. makevar(tostring(defaults[i].name), VARNAME, v);
  134. }
  135. }
  136. void resetvar(void) /* reset variables listed */
  137. {
  138. int i, j;
  139. if (nattr == 0) { /* none listed, so do all */
  140. setdefaults();
  141. return;
  142. }
  143. for (i = 0; i < nattr; i++) {
  144. for (j = 0; defaults[j].name != NULL; j++)
  145. if (strcmp(defaults[j].name, attr[i].a_val.p) == 0) {
  146. setfval(defaults[j].name, defaults[j].val);
  147. free(attr[i].a_val.p);
  148. break;
  149. }
  150. }
  151. }
  152. void checkscale(char *s) /* if s is "scale", adjust default variables */
  153. {
  154. int i;
  155. double scale;
  156. if (strcmp(s, "scale") == 0) {
  157. scale = getfval("scale");
  158. for (i = 1; defaults[i].name != NULL; i++)
  159. if (defaults[i].scalable)
  160. setfval(defaults[i].name, defaults[i].val * scale);
  161. }
  162. }
  163. void getdata(void)
  164. {
  165. char *p, buf[1000], buf1[100];
  166. int ln;
  167. void reset(void), openpl(char *), closepl(char *), print(void);
  168. int yyparse(void);
  169. curfile->lineno = 0;
  170. printlf(1, curfile->fname);
  171. while (fgets(buf, sizeof buf, curfile->fin) != NULL) {
  172. curfile->lineno++;
  173. if (*buf == '.' && *(buf+1) == 'P' && *(buf+2) == 'S') {
  174. for (p = &buf[3]; *p == ' '; p++)
  175. ;
  176. if (*p++ == '<') {
  177. Infile svfile;
  178. svfile = *curfile;
  179. sscanf(p, "%s", buf1);
  180. if ((curfile->fin=fopen(buf1, "r")) == NULL)
  181. ERROR "can't open %s", buf1 FATAL;
  182. curfile->fname = tostring(buf1);
  183. getdata();
  184. fclose(curfile->fin);
  185. free(curfile->fname);
  186. *curfile = svfile;
  187. printlf(curfile->lineno, curfile->fname);
  188. continue;
  189. }
  190. reset();
  191. yyparse();
  192. anyerr += synerr;
  193. deltx = (xmax - xmin) / getfval("scale");
  194. delty = (ymax - ymin) / getfval("scale");
  195. if (buf[3] == ' ') { /* next things are wid & ht */
  196. if (sscanf(&buf[4],"%lf %lf", &deltx, &delty) < 2)
  197. delty = deltx * (ymax-ymin) / (xmax-xmin);
  198. /* else {
  199. /* double xfac, yfac; */
  200. /* xfac = deltx / (xmax-xmin);
  201. /* yfac = delty / (ymax-ymin);
  202. /* if (xfac <= yfac)
  203. /* delty = xfac * (ymax-ymin);
  204. /* else
  205. /* deltx = yfac * (xmax-xmin);
  206. /*}
  207. */
  208. }
  209. dprintf("deltx = %g, delty = %g\n", deltx, delty);
  210. if (codegen && !synerr) {
  211. openpl(&buf[3]); /* puts out .PS, with ht & wid stuck in */
  212. printlf(curfile->lineno+1, NULL);
  213. print(); /* assumes \n at end */
  214. closepl(PEstring); /* does the .PE/F */
  215. free(PEstring);
  216. }
  217. printlf(curfile->lineno+1, NULL);
  218. fflush(stdout);
  219. } else if (buf[0] == '.' && buf[1] == 'l' && buf[2] == 'f') {
  220. if (sscanf(buf+3, "%d %s", &ln, buf1) == 2) {
  221. free(curfile->fname);
  222. printlf(curfile->lineno = ln, curfile->fname = tostring(buf1));
  223. } else
  224. printlf(curfile->lineno = ln, NULL);
  225. } else
  226. fputs(buf, stdout);
  227. }
  228. }
  229. void reset(void)
  230. {
  231. obj *op;
  232. int i;
  233. extern int nstack;
  234. extern void freesymtab(struct symtab *);
  235. for (i = 0; i < nobj; i++) {
  236. op = objlist[i];
  237. if (op->o_type == BLOCK)
  238. freesymtab(op->o_symtab);
  239. free((char *)objlist[i]);
  240. }
  241. nobj = 0;
  242. nattr = 0;
  243. for (i = 0; i < ntext; i++)
  244. if (text[i].t_val)
  245. free(text[i].t_val);
  246. ntext = ntext1 = 0;
  247. codegen = synerr = 0;
  248. nstack = 0;
  249. curx = cury = 0;
  250. PEstring = 0;
  251. hvmode = R_DIR;
  252. xmin = ymin = 30000;
  253. xmax = ymax = -30000;
  254. }