main.c 3.7 KB

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