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