mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
57 lines
2.3 KiB
C
57 lines
2.3 KiB
C
/***************************************************************************
|
|
*
|
|
* R e a d F u n c t i o n
|
|
* -------------------------
|
|
* Copyright 1982 by Digital Research Inc. All rights reserved.
|
|
*
|
|
* The read function simulates the UNIX read system call. Any
|
|
* arbitrary number of bytes may be read at any arbitrary offset in
|
|
* the file.
|
|
* The terminal handler for read has been set up to simulate some of
|
|
* the functions provided by "ioctl".
|
|
*
|
|
* Edits:
|
|
* 11-Dec-83 whf Divide into separate files, do PC-DOS I/O
|
|
*
|
|
* Calling Sequence:
|
|
* ret = read(fd,buffer,bytes);
|
|
* Where:
|
|
* ret Is the number of bytes which were actually read
|
|
* fd Is an open file descriptor
|
|
* buffer Is the buffer address
|
|
* bytes Is the number of bytes to read
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include "portab.h"
|
|
#include "osif.h"
|
|
#include "osiferr.h"
|
|
#include "errno.h"
|
|
|
|
UWORD read(fd,buff,bytes) /* CLEAR FUNCTION ***********/
|
|
WORD fd; /* File descriptor */
|
|
BYTE *buff; /* -> buffer start */
|
|
UWORD bytes; /* = byte count to read */
|
|
{ /****************************/
|
|
REG FD *fp; /* -> ccb to read from */
|
|
FD *_chkc(); /* Converts fd to fp */
|
|
UWORD _ttyin(); /* Read from tty rtn */
|
|
UWORD _rdasc(); /* Read ascii rtn */
|
|
UWORD _rdbin(); /* Read binary rtn */
|
|
/****************************/
|
|
if((fp=_chkc(fd)) == NULLFD) /* File open & OK?? */
|
|
return(FAILURE); /* No: EBADF */
|
|
if((fp->flags & ATEOF) != 0) /* End of file already? */
|
|
return(0); /* Yes, quit now */
|
|
if((fp->flags & ISLPT) != 0) /* A wise guy?? */
|
|
RETERR(FAILURE,EBADF); /* A wise guy!! */
|
|
/****************************/
|
|
if((fp->flags & ISTTY) != 0) /* TTY? */
|
|
return(_ttyin(fp,buff,bytes)); /* Yes, read 1 line */
|
|
/****************************/
|
|
if(fp->flags & ISASCII) /* ASCII?? */
|
|
return(_rdasc(fp,buff,(LONG)bytes)); /* Yes, read ascii */
|
|
else return(_rdbin(fp,buff,(LONG)bytes)); /* No, read binary */
|
|
/****************************/
|
|
}
|