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