1 /* Support routines for terminal I/O. This module defines the following
2 Fortran-callable routines: GROTER, GRCTER, GRWTER, GRRTER. */
3
4 #include <sys/ioctl.h>
5
groter_(cdev,ldev,cdev_len)6 long int groter_(cdev, ldev, cdev_len)
7 char *cdev;
8 long int *ldev;
9 int cdev_len;
10
11 /* Open a channel to the device specified by 'cdev'.
12 *
13 * cdev I The name of the device to be opened
14 * ldev I Number of valid characters in cdev
15 * cdev_len I Used by Fortran compiler to pass character length
16 * groter O The open channel number (-1 indicates an error)
17 */
18 {
19 int fd, n;
20 char name[64];
21
22 n = *ldev;
23 if (n > 63)
24 n = 63;
25 strncpy(name, cdev, n);
26 name[n] = '\0';
27 if ((fd = open(name, 2)) == -1)
28 {
29 /* perror("Cannot access graphics device");
30 */
31 perror(name);
32 return -1;
33 }
34 else
35 {
36 return fd;
37 }
38 }
39
grcter_(fd)40 grcter_(fd)
41 int *fd;
42
43 /* Close a previously opened channel.
44 *
45 * fd I The channel number to be closed
46 */
47 {
48 close(*fd);
49 }
50
grwter_(fd,cbuf,lbuf,cbuf_len)51 grwter_(fd, cbuf, lbuf, cbuf_len)
52 int *fd;
53 char *cbuf;
54 long int *lbuf;
55 int cbuf_len;
56
57 /* Write lbuf bytes from cbuf to the channel fd. Data is written in
58 * CBREAK mode.
59 *
60 * fd I The channel number
61 * cbuf I Character array of data to be written
62 * lbuf I/O The number of bytes to write, set to zero on return
63 * cbuf_len I Used by Fortran compiler to pass character length
64 */
65 {
66 int nwritten;
67 struct sgttyb tty;
68 int save_flags;
69
70 /* printf ("writing %d bytes on unit %d\n", *lbuf, *fd); */
71
72 ioctl(*fd, TIOCGETP, &tty);
73 save_flags = tty.sg_flags;
74 tty.sg_flags |= CBREAK;
75 ioctl(*fd, TIOCSETP, &tty);
76 tty.sg_flags = save_flags;
77
78 nwritten = write (*fd, cbuf, *lbuf);
79 ioctl(*fd, TIOCSETP, &tty);
80 if (nwritten != *lbuf)
81 perror("Error writing to graphics device");
82 *lbuf = 0;
83 return;
84 }
85
grpter_(fd,cprom,lprom,cbuf,lbuf,cprom_len,cbuf_len)86 grpter_(fd, cprom, lprom, cbuf, lbuf, cprom_len, cbuf_len)
87 int *fd;
88 char *cprom, *cbuf;
89 long int *lprom, *lbuf;
90 int cprom_len, cbuf_len;
91
92 /* Write prompt string on terminal and then read response. This version
93 * will try to read lbuf characters.
94 *
95 * fd I The channel number
96 * cprom I An optional prompt string
97 * lprom I Number of valid characters in cprom
98 * cbuf O Character array of data read
99 * lbuf I/O The number of bytes to read, on return number read
100 * cbuf_len I Used by Fortran compiler to pass character length
101 */
102 {
103 int i0, nread, ntry;
104 struct sgttyb tty;
105 int save_flags;
106
107 ioctl(*fd, TIOCGETP, &tty);
108 save_flags = tty.sg_flags;
109 tty.sg_flags |= CBREAK;
110 ioctl(*fd, TIOCSETP, &tty);
111 tty.sg_flags = save_flags;
112
113 if( *lprom>0)
114 write (*fd, cprom, *lprom);
115 i0=0;
116 ntry=*lbuf;
117 do {
118 nread = read (*fd, &cbuf[i0], ntry);
119 /* printf("Nread=%d, Ntry=%d\n",nread,ntry); */
120 i0=i0+nread;
121 ntry=*lbuf-i0-1;
122 } while (nread>0 && ntry>0);
123
124 ioctl(*fd, TIOCSETP, &tty);
125 *lbuf=i0;
126 return;
127 }
128