home *** CD-ROM | disk | FTP | other *** search
- /* rawread - read in raw mode and perform special processing
-
- Copyright (c) 1984 by JMI Software Consultants, Inc.
- */
- #include "acom.h"
- #include "host.h"
- #include "rrd.h"
- #define BUFSIZE 512
-
-
- IMPORT RR rdc;
- LOCAL TEXT rawbuf[BUFSIZE] = {0}; /* raw data resides here */
- LOCAL TEXT *s = rawbuf; /* pointer to next character in rawbuf */
- LOCAL TEXT *eob = rawbuf; /* pointer past last character in rawbuf */
- LOCAL TEXT stdecho[2] = {0}; /* buffer for echoing input character */
- LOCAL BOOL backslash = NO;
-
- INT rawread(fd, buf, len, mode)
- INT fd; /* file descriptor */
- TEXT *buf; /* pointer to a buffer where input data will be put */
- INT len; /* maximum number of characters to be input */
- BITS mode; /* special processing modes (see rrd.h) */
- {
- FAST TEXT c, *t;
- FAST INT l;
- INT n;
- BOOL skip;
- TEXT *echo;
- REGVAL ri, ro;
-
- t = buf;
- l = 0;
- FOREVER
- {
- skip = NO;
- if (s >= eob)
- {
- ri.dx = 0x00ff;
- ri.ax = 0x0600;
- if (!(mode & RR_WAIT))
- {
- if (kbhit() == 0)
- break;
- intdos(&ri, &ro);
- }
- else
-
- FOREVER
- {
- if (kbhit() != 0)
- {
- intdos(&ri, &ro);
- break;
- }
- }
- s = rawbuf;
- n = 0;
- rawbuf[n++] = ro.ax & 0x00ff;
- while (n <= BUFSIZE)
- {
- if (kbhit() == 0)
- break;
- intdos(&ri, &ro);
- rawbuf[n++] = ro.ax & 0x00ff;
- }
- eob = rawbuf + n;
- }
- c = *s++;
- if (mode & RR_7BIT)
- c &= 0x7f;
- if (mode & RR_CRMOD && c == '\r')
- c = '\n';
- if (mode & RR_UCASE)
- c = toupper(c);
- if (mode & RR_LCASE)
- c = tolower(c);
- stdecho[0] = c;
- echo = stdecho;
- if (c == '\n')
- echo = "\r\n";
- if (mode & RR_ERASE && c == rdc.rr_erase)
- {
- echo = "\b \b";
- if (!backslash)
- {
- skip = YES;
- if (--t < buf)
- {
- ++t;
- echo = "";
- }
- else
- --l;
- }
- }
- if (mode & RR_KILL && c == rdc.rr_kill)
- {
- if (!backslash)
- {
- skip = YES;
- t = buf;
- l = 0;
- }
- echo = "\r\n";
- }
- if (mode & RR_NECR && (c == '\r' || c == '\n'))
- echo = "";
- if (mode & RR_INTR && c == rdc.rr_intr)
- {
- exit();
- break;
- }
- if (mode & RR_QUIT && c == rdc.rr_quit)
- {
- exit();
- break;
- }
- if (mode & RR_EOT && c == rdc.rr_eot)
- {
- l = 0;
- break;
- }
- if (mode & RR_BSLSH && c == '\\')
- {
- backslash = YES;
- continue;
- }
- if (mode & RR_ECHO)
- {
- if (backslash)
- write(1, "\\", 1);
- write(1, echo, strlen(echo));
- }
- if (backslash)
- {
- *t++ = '\\';
- if (++l >= len)
- {
- --s;
- break;
- }
- backslash = NO;
- }
- if (!skip)
- {
- *t++ = c;
- ++l;
- }
- if (mode & RR_LINE && c == '\n')
- break;
- if (l >= len)
- break;
- }
- return (l);
- }