ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/devmain.c
Revision: 1.8
Committed: Thu Feb 22 11:46:24 1990 UTC (34 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.7: +10 -5 lines
Log Message:
added explicit flush call to drivers

File Contents

# Content
1 /* Copyright (c) 1989 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * devmain.c - main for independent drivers.
9 *
10 * Redefine your initialization routine to dinit.
11 *
12 * 10/25/89
13 */
14
15 #include <stdio.h>
16
17 #include <signal.h>
18
19 #include "color.h"
20
21 #include "driver.h"
22
23 int (*wrnvec)(), (*errvec)(), (*cmdvec)(); /* error vectors, unused */
24
25 struct driver *dev = NULL; /* output device */
26
27 FILE *devin, *devout; /* communications channels */
28
29 int notified = 0; /* notified parent of input? */
30
31 char *progname; /* driver name */
32
33 int r_clear(), r_paintr(), r_getcur(), r_comout(), r_comin(), r_flush();
34
35 int (*dev_func[NREQUESTS])() = { /* request handlers */
36 r_clear, r_paintr,
37 r_getcur, r_comout,
38 r_comin, r_flush
39 };
40
41
42 main(argc, argv) /* set up communications and main loop */
43 int argc;
44 char *argv[];
45 {
46 extern struct driver *dinit();
47 int com;
48 /* set up I/O */
49 progname = argv[0];
50 if (argc < 3) {
51 stderr_v("arg count\n");
52 quit(1);
53 }
54 devin = fdopen(atoi(argv[1]), "r");
55 devout = fdopen(atoi(argv[2]), "w");
56 if (devin == NULL || devout == NULL || getw(devin) != COM_SENDM) {
57 stderr_v("connection failure\n");
58 quit(1);
59 }
60 /* open device */
61 if ((dev = dinit(argv[0], argv[3])) == NULL)
62 quit(1);
63 putw(COM_RECVM, devout); /* verify initialization */
64 fwrite((char *)&dev->pixaspect, sizeof(dev->pixaspect), 1, devout);
65 putw(dev->xsiz, devout);
66 putw(dev->ysiz, devout);
67 fflush(devout);
68 /* loop on requests */
69 while ((com = getc(devin)) != EOF) {
70 if (com >= NREQUESTS || dev_func[com] == NULL) {
71 stderr_v("invalid request\n");
72 quit(1);
73 }
74 (*dev_func[com])(); /* process request */
75 }
76 quit(0); /* all done, clean up and exit */
77 }
78
79
80 quit(code) /* close device and exit */
81 int code;
82 {
83 if (dev != NULL)
84 (*dev->close)();
85 exit(code);
86 }
87
88
89 r_clear() /* clear screen */
90 {
91 int xres, yres;
92
93 xres = getw(devin);
94 yres = getw(devin);
95 (*dev->clear)(xres, yres);
96 }
97
98
99 r_paintr() /* paint a rectangle */
100 {
101 COLOR col;
102 int xmin, ymin, xmax, ymax;
103
104 fread((char *)col, sizeof(COLOR), 1, devin);
105 xmin = getw(devin); ymin = getw(devin);
106 xmax = getw(devin); ymax = getw(devin);
107 (*dev->paintr)(col, xmin, ymin, xmax, ymax);
108 /* check for input */
109 if (!notified && dev->inpready > 0) {
110 notified = 1;
111 kill(getppid(), SIGIO);
112 }
113 }
114
115
116 r_flush() /* flush output */
117 {
118 if (dev->flush != NULL)
119 (*dev->flush)();
120 }
121
122
123 r_getcur() /* get and return cursor position */
124 {
125 int c;
126 int x, y;
127 /* get it if we can */
128 if (dev->getcur == NULL) {
129 c = ABORT;
130 x = y = 0;
131 } else
132 c = (*dev->getcur)(&x, &y);
133 /* reply */
134 putc(COM_GETCUR, devout);
135 putc(c, devout);
136 putw(x, devout);
137 putw(y, devout);
138 fflush(devout);
139 }
140
141
142 r_comout() /* print string to command line */
143 {
144 char str[256];
145
146 mygets(str, devin);
147 (*dev->comout)(str);
148 }
149
150
151 r_comin() /* read string from command line */
152 {
153 char buf[256], *prompt;
154 /* get prompt */
155 if (getc(devin)) {
156 mygets(buf, devin);
157 prompt = buf;
158 } else
159 prompt = NULL;
160 /* get string */
161 (*dev->comin)(buf, prompt);
162 /* reply */
163 putc(COM_COMIN, devout);
164 myputs(buf, devout);
165 fflush(devout);
166 /* reset notify */
167 notified = 0;
168 }
169
170
171 mygets(s, fp) /* get string from file (with nul) */
172 register char *s;
173 register FILE *fp;
174 {
175 register int c;
176
177 while ((c = getc(fp)) != EOF)
178 if ((*s++ = c) == '\0')
179 return;
180 *s = '\0';
181 }
182
183
184 myputs(s, fp) /* put string to file (with nul) */
185 register char *s;
186 register FILE *fp;
187 {
188 do
189 putc(*s, fp);
190 while (*s++);
191 }
192
193
194 stderr_v(s) /* put string to stderr */
195 register char *s;
196 {
197 static int inline = 0;
198
199 if (!inline++) {
200 fputs(progname, stderr);
201 fputs(": ", stderr);
202 }
203 fputs(s, stderr);
204 if (*s && s[strlen(s)-1] == '\n') {
205 fflush(stderr);
206 inline = 0;
207 }
208 }