ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/devmain.c
(Generate patch)

Comparing ray/src/rt/devmain.c (file contents):
Revision 1.2 by greg, Wed Oct 25 16:49:45 1989 UTC vs.
Revision 2.6 by greg, Thu Feb 9 21:54:11 2023 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines