ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/tty.c
Revision: 2.3
Committed: Tue Feb 25 02:47:23 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Changes since 2.2: +1 -56 lines
Log Message:
Replaced inline copyright notice with #include "copyright.h"

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.2 static const char RCSid[] = "$Id$";
3 greg 1.1 #endif
4     /*
5     * tty.c - i/o for terminal drivers.
6 greg 2.2 */
7    
8 greg 2.3 #include "copyright.h"
9 greg 1.1
10     #include <stdio.h>
11     #include <signal.h>
12     #include <fcntl.h>
13     #include <sys/ioctl.h>
14    
15     #include "driver.h"
16    
17     /*
18     * Drivers using these routines must call getch()
19     * for input from stdin.
20     */
21    
22     struct sgttyb ttymode; /* original tty modes */
23    
24     int ttyfd; /* tty file descriptor */
25    
26     struct driver *ttydev; /* tty device */
27    
28    
29     ttyset(dev, fd) /* set up raw tty device */
30     struct driver *dev;
31     int fd;
32     {
33     int ttyin(), newinp();
34     struct sgttyb flags;
35    
36     if (!isatty(fd))
37     return(-1);
38    
39     ttyfd = fd;
40     ioctl(ttyfd, TIOCGETP, &ttymode);
41     ioctl(ttyfd, TIOCGETP, &flags);
42     flags.sg_flags |= RAW; /* also turns output */
43     flags.sg_flags &= ~ECHO; /* processing off */
44     ioctl(ttyfd, TIOCSETP, &flags);
45     /* install input handler */
46     ttydev = dev;
47     ttydev->comin = ttyin;
48     ttydev->inpready = 0;
49     signal(SIGIO, newinp);
50     fcntl(ttyfd, F_SETFL, FASYNC);
51     return(0);
52     }
53    
54    
55     ttydone() /* restore tty modes */
56     {
57     fcntl(ttyfd, F_SETFL, 0);
58     signal(SIGIO, SIG_DFL);
59     ioctl(ttyfd, TIOCSETP, &ttymode);
60     ttydev->comin = NULL;
61     ttydev->inpready = 0;
62     ttydev = NULL;
63     }
64    
65    
66     int
67     getch() /* get a character in raw mode */
68     {
69     register int c;
70    
71     fcntl(ttyfd, F_SETFL, 0); /* allow read to block */
72     if (ttydev->inpready > 0)
73     ttydev->inpready--;
74     c = getchar();
75     fcntl(ttyfd, F_SETFL, FASYNC);
76     return(c);
77     }
78    
79    
80     static
81 greg 1.3 ttyin(buf, prompt) /* read a line in raw mode */
82     char *buf, *prompt;
83 greg 1.1 {
84     int getch();
85    
86 greg 1.3 if (prompt != NULL)
87     (*ttydev->comout)(prompt);
88 greg 1.2 editline(buf, getch, ttydev->comout);
89 greg 1.1 }
90    
91    
92     static
93     newinp() /* new input */
94     {
95     ttydev->inpready++;
96     }