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