main.c 3.3 KB

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