Files
Digital-Research-Source-Code/CPM OPERATING SYSTEMS/CPM 68K/1.0X SOURCES/v101/klib/xopen.c
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

74 lines
2.9 KiB
C

/****************************************************************************/
/* */
/* _ o p e n F u n c t i o n */
/* --------------------------- */
/* */
/* 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 */
/* */
/* This routine may also be used to delete files as well. */
/* */
/****************************************************************************/
#include "stdio.h"
#include "cpm.h"
WORD _open(ch,filnam,bdosfunc) /****************************/
/* */
WORD ch; /* Channel number */
REG BYTE *filnam; /* -> filename */
WORD bdosfunc; /* BDOS Function */
{ /****************************/
EXTERN FILE *_getc(); /* fd -> fp xlate routine */
REG FILE *fp; /* -> ccb area */
REG struct xfcb *fcbp; /* -> FCB area in ccb */
REG BYTE *p; /* Temp character pointer */
REG WORD i; /* Character index */
/****************************/
fp = _getc(ch); /* Fetch ccb pointer */
fcbp = &(fp ->fcb); /* Fetch fcb pointer */
/****************************/
if(*(filnam+1) == ':') /* Drive ID present? */
{ /* If here, yes */
fcbp->drive = toupper(*filnam) /* Load drive ID */
- 'A' + 1; /* 1 for a:, 2 for b:, ... */
filnam += 2; /* Bump past ':' */
} /****************************/
/* */
i = 0; /* index */
/****************************/
while (*filnam > ' ' && i < 8 && /* */
*filnam != '.') /* Terminate on ext. */
{ /* */
fcbp -> fname[i++] = /* Load next character */
toupper(*filnam); /* */
filnam++; /* Increment */
} /* */
/****************************/
if (*filnam == '.') /* Extension specified? */
{ /* Yes */
filnam++; /* Bump past '.' */
i = 0; /* set index to 0 */
while(*filnam > ' ' && i < 3) /* copy */
{ /* */
fcbp -> ftype[i++] = /* */
toupper(*filnam); /* file type */
filnam++; /* */
} /* */
} /****************************/
/* */
if(bdosfunc == CREATE) /* Creating file? */
__BDOS(DELETE,fcbp); /* Yes, delete it first */
/****************************/
i = __BDOS(bdosfunc,fcbp); /* Do requested operation */
return((i<=3) ? SUCCESS : FAILURE); /* Binary return code */
} /****************************/