mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
Upload
Digital Research
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
/***************************************************************************
|
||||
*
|
||||
* _ _ o p e n F u n c t i o n
|
||||
* -----------------------------
|
||||
* Copyright 1982 by Digital Research Inc. All rights reserved.
|
||||
*
|
||||
* Function "__open" is used to parse the CP/M fcb and open or create
|
||||
* the requested file. Created files are deleted first, to avoid
|
||||
* directory problems.
|
||||
*
|
||||
* Calling Sequence:
|
||||
*
|
||||
* ret = __open(ch,filnam,bdosfunc);
|
||||
*
|
||||
* Where:
|
||||
* ch Is a vacant channel number
|
||||
* filnam Is a null-terminated CP/M filename
|
||||
* bdosfunc Is the desired BDOS function to perform
|
||||
* ret Is SUCCESS if everything ok, FAILURE o.w. unless:
|
||||
* bdosfunc=SEARCHF/N, ret = dcnt (0-3)
|
||||
*
|
||||
* This routine may also be used to delete files as well.
|
||||
*
|
||||
* Modified 4-Nov-83 (whf) open files read-only if appropriate
|
||||
* Modified 8-Oct-83 (whf) handle user #s differently
|
||||
* Modified 5-Oct-83 (whf) added '_parsefn()'
|
||||
* Modified 11-Aug-83 (whf) for DRC
|
||||
* Modified 26-Jun-83 (sw) for wild cards and user # support
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "portab.h"
|
||||
#include "osif.h"
|
||||
#include "osiferr.h"
|
||||
#include "errno.h"
|
||||
#define HIBIT 0x80
|
||||
|
||||
WORD __open(ch,filnam,bdosfunc) /****************************/
|
||||
/* */
|
||||
WORD ch; /* Channel number */
|
||||
REG BYTE *filnam; /* -> filename */
|
||||
WORD bdosfunc; /* BDOS Function */
|
||||
{ /****************************/
|
||||
FD *fp; /* -> ccb area */
|
||||
REG struct fcbtab *fcbp; /* -> FCB area in ccb */
|
||||
REG BYTE *p; /* Temp character pointer */
|
||||
REG WORD rv; /* Return value */
|
||||
REG WORD xuser; /* User number */
|
||||
BYTE *_parsefn(); /* Parse filename function */
|
||||
/****************************/
|
||||
/* */
|
||||
fp = _getccb(ch); /* Fetch ccb pointer */
|
||||
fcbp = &(fp ->fcb); /* Fetch fcb pointer */
|
||||
rv = SUCCESS; /* Default to success */
|
||||
/****************************/
|
||||
if( _parsefn(filnam,fcbp) != NULLPTR ) /* Parse filnam into fcb */
|
||||
RETERR(FAILURE,EINVAL); /* Quit if name not ok */
|
||||
#if CPM /* Handling user numbers? */
|
||||
if(fcbp->fuser) /* User # specified? */
|
||||
fp->user = fcbp->fuser; /* put it where we use it */
|
||||
#endif /****************************/
|
||||
if( bdosfunc == CREATE && /* Creating file? */
|
||||
index(fcbp->fname,'?')) /* Wild cards @!@#$!!! */
|
||||
RETERR(FAILURE,EINVAL); /* Just quit */
|
||||
/* */
|
||||
xuser = _chkuser(fp->user); /* Change user # if needed */
|
||||
/* */
|
||||
if(bdosfunc == CREATE) /* Creating file? */
|
||||
__OSIF(DELETE,fcbp); /* delete it first */
|
||||
/* */
|
||||
#if CPM /* running some brand of CPM*/
|
||||
if(bdosfunc == OPEN) /* Opening a file? */
|
||||
{ /* Yes... */
|
||||
if( fp->flags & ISREAD ) /* Open file Read-Only? */
|
||||
(fcbp->fname)[5] |= HIBIT; /* Turn on F6' attribute bit*/
|
||||
} /* */
|
||||
#endif /* */
|
||||
/****************************/
|
||||
rv = __OSIF(bdosfunc,fcbp); /* Do requested operation */
|
||||
/****************************/
|
||||
/* */
|
||||
_uchkuser(fp->user,xuser); /* Change back if needed */
|
||||
/* */
|
||||
if(bdosfunc == SEARCHF || bdosfunc == SEARCHN) /* */
|
||||
return(rv); /* return directory count */
|
||||
return((rv<=3) ? SUCCESS : FAILURE); /* Binary return code */
|
||||
} /****************************/
|
||||
Reference in New Issue
Block a user