main.c 3.3 KB

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