mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-22 16:04:18 +00:00
87 lines
3.5 KiB
C
87 lines
3.5 KiB
C
/*****************************************************************************
|
||
*
|
||
* f r e o p e n F u n c t i o n
|
||
* -------------------------------
|
||
* Copyright 1982 by Digital Research Inc. All rights reserved.
|
||
*
|
||
* "freopen" opens a buffered stream file, either on disk, console, or
|
||
* line printer. It first closes the given stream, and reuses that slot.
|
||
* Comes in 3 flavors, like "fopen".
|
||
*
|
||
* Calling sequence:
|
||
* stream = freopen(name,mode,stream)
|
||
* stream = freopa(name,mode,stream)
|
||
* stream = freopb(name,mode,stream)
|
||
* stream = _freopen(name,mode,stream,ascii)
|
||
* Where:
|
||
* stream -> file reopened (FILE *), NULLPTR if failure
|
||
* name -> NULL terminated string containing filename,
|
||
* name="CON:" means the console,
|
||
* name="LST:" goes to the line printer, and
|
||
* otherwise a disk file is assumed.
|
||
* mode -> "r" for read only,
|
||
* "w" for write only,
|
||
* "a" to append (write only) to end of file.
|
||
* ascii = 0 if the file is handled as a CP/M text file
|
||
* (newline -> CRLF xlation, ^Z EOF convention).
|
||
* Otherwise, file is treated as a binary file.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
#include "stdio.h" /****************************/
|
||
#define READ 0 /* read mode val */
|
||
#define WRITE 1 /* write mode val */
|
||
|
||
FILE *_freope(name,mode,sp,ascii) /****************************/
|
||
REG BYTE *name, /* file name */
|
||
*mode; /* "r","w", or "a" */
|
||
REG FILE *sp; /* stream pointer */
|
||
BOOLEAN ascii; /* CP/M text file */
|
||
{ /****************************/
|
||
REG WORD fd; /* file descriptor */
|
||
/****************************/
|
||
if( fclose(sp) == FAILURE ) /* try closing the file 1st */
|
||
return(NULLFILE); /* oops, it failed */
|
||
if( *mode == 'w' || *mode == 'W' ) /* 'w'rite mode? */
|
||
fd=_creat(name,0,ascii); /* create file *********/
|
||
|
||
else if( *mode == 'a' || *mode == 'A' ) /* 'a'ppend mode? */
|
||
{ /* */
|
||
if( (fd=_open(name,WRITE,ascii)) < 0 ) /* try open */
|
||
fd=_creat(name,0,ascii);/* do create if needed */
|
||
else lseek(fd,0L,2); /* its out there, seef EOF */
|
||
} /* ************************/
|
||
else if( *mode == 'r' || *mode == 'R' ) /* 'r'ead mode? */
|
||
fd=_open(name,READ,ascii); /* try open ************/
|
||
else return(NULLFILE); /* bad mode barf... */
|
||
/****************************/
|
||
if(fd<0) /* did one of those work? */
|
||
return(NULLFILE); /* no, oh well */
|
||
sp->_cnt = 0; /* init count */
|
||
sp->_fd = fd; /* and file des */
|
||
sp->_base = sp->_ptr = NULLPTR; /* and buffer pointers */
|
||
if( *mode == 'r' || *mode == 'R' ) /* 'r'ead mode? */
|
||
sp->_flag = _IOREAD; /* say so */
|
||
else sp->_flag = _IOWRT; /* else 'w'rite mode */
|
||
if( ascii == 0 ) /* ascii file? */
|
||
sp->_flag |= _IOASCI; /* */
|
||
/****************************/
|
||
return(sp); /* return the stream ptr */
|
||
} /****************************/
|
||
|
||
FILE * freopen(name,mode,sp) /* CLEAR FUNCTION ***********/
|
||
BYTE *name, *mode; FILE *sp;
|
||
{ return(_freope(name,mode,sp,0)); } /* reopen ascii file */
|
||
|
||
FILE * freopa(name,mode,sp) /* CLEAR FUNCTION ***********/
|
||
BYTE *name, *mode; FILE *sp;
|
||
{ return(_freope(name,mode,sp,0)); } /* reopen ascii file */
|
||
|
||
FILE * freopb(name,mode,sp) /* CLEAR FUNCTION ***********/
|
||
BYTE *name, *mode; FILE *sp;
|
||
{ return(_freope(name,mode,sp,1)); } /* reopen binary file */
|
||
E *sp;
|
||
{ return(_freope(name,mode,sp,1)); } /* reopen binary file */
|
||
E *sp;
|
||
{ return(_freope(name,mode,sp,1)); } /* reopen binary file */
|