[comp.lang.lisp.x] reading binary files in xlisp

hadden@SRC.Honeywell.COM (George D. Hadden) (10/31/89)

i'm doing some work with midi files in xlisp and have run into a
problem.  it appears that (read_byte foo), where foo is
an open file, thinks that it has reached end of file when it sees a
control-z.  questions:

1) am i using the right function for reading binary data?

2) is there a workaround?

any help would be greatly appreciated.  thanks.

the following code appears to be relevant:

****************************************************************
from xlftab.c:

{	"INT-CHAR",			S, xintchar		}, /* 244 */
{	"READ-BYTE",			S, xrdbyte  		}, /* 245 */
{	"WRITE-BYTE",			S, xwrbyte  		}, /* 246 */
****************************************************************
from xlfio.c:
/* xrdbyte - read a byte from a file */
LVAL xrdbyte()
{
    LVAL fptr;
    int ch;

    /* get file pointer */
    fptr = (moreargs() ? xlgetfile() : getvalue(s_stdin));
    xllastarg();

    /* get character and check for eof */
    return ((ch = xlgetc(fptr)) == EOF ? NIL : cvfixnum((FIXTYPE)ch));
}
****************************************************************
from xlio.c:
/* xlgetc - get a character from a file or stream */
int xlgetc(fptr)
  LVAL fptr;
{
    LVAL lptr,cptr;
    FILE *fp;
    int ch;

    /* check for input from nil */
    if (fptr == NIL)
	ch = EOF;

    /* otherwise, check for input from a stream */
    else if (ustreamp(fptr)) {
	if ((lptr = gethead(fptr)) == NIL)
	    ch = EOF;
	else {
	    if (!consp(lptr) || (cptr = car(lptr)) == NIL || !charp(cptr))
		xlfail("bad stream");
	    sethead(fptr,lptr = cdr(lptr));
	    if (lptr == NIL)
		settail(fptr,NIL);
	    ch = getchcode(cptr);
	}
    }

    /* otherwise, check for a buffered character */
    else if (ch = getsavech(fptr))
	setsavech(fptr,'\0');

    /* otherwise, check for terminal input or file input */
    else {
	fp = getfile(fptr);
	if (fp == stdin || fp == stderr)
	    ch = ostgetc();
	else
	    ch = osagetc(fp);
    }

    /* return the character */
    return (ch);
}
****************************************************************

-geo
---
George D. Hadden, Honeywell Systems and Research Center
       Where "Research" is our middle name!
PHONE:  (612)782-7769    ARPA:   hadden@src.honeywell.com
MAIL:   3660 Technology Drive MN65-2100, Minneapolis, MN 55418
UUCP:   {umn-cs, ems, bthpyd}!srcsip!hadden