#define INCL_DOSFILEMGS
#include <os2.h>

typedef +++D/WORD+++ INT  FD;    /* file handle */
typedef LONG          LFO;       /* file offset */
typedef +++D/WORD+++ INT  WORD;
typedef CHAR FAR     *LPSTR;
typedef +++D/WORD+++ CHAR BYTE;

FD    APIENTRY FdCreate          (LPSTR) ;
FD    APIENTRY FdOpen            (LPSTR, BYTE) ;
WORD  APIENTRY CbWriteFdLpb      (FD, LPSTR, WORD);
WORD  APIENTRY CbReadFdLpb       (FD, LPSTR, WORD);
LFO   APIENTRY LSeekFd           (FD, LFO, BYTE);
INT   APIENTRY EnCloseFd         (FD);
INT   APIENTRY EnUnLinkSz        (LPSTR);
INT   APIENTRY EnRenameSzSz      (LPSTR, LPSTR);


FD  APIENTRY FdOpen(lpFileName, bMode)
    LPSTR lpFileName;
    BYTE  bMode;

{
    HFILE hf;
    USHORT usAction;

    if (DosOpen(lpFileName,
            &hf,
            &usAction,
            0L,
            FILE_NORMAL,
            FILE_OPEN,
            OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE,
            0l)) {
        return(-1);
    } else {
        return(hf);
    }
}

FD  APIENTRY FdCreate(lpFileName)
    LPSTR lpFileName;

{
    HFILE hf;
    USHORT usAction;


    if (DosOpen(lpFileName,
            &hf,
            &usAction,
            0L,
            FILE_NORMAL,
            FILE_CREATE | FILE_OPEN,
            OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE,
            0L)) {

        return(-1);
    } else {
        return(hf);
    }
}

INT   APIENTRY EnCloseFd(hf)
    HFILE hf;

{
    if (DosClose(hf)) {
        return(-1);
    } else {
        return(0);
    }
}

WORD  APIENTRY CbReadFdLpb (hf,lpBuffer,cbBuffer)
    HFILE hf;
    LPSTR lpBuffer;
    WORD  cbBuffer;

{
    USHORT cbBytesRead;
    INT errCode;

    errCode = DosRead(hf,lpBuffer,cbBuffer,&cbBytesRead);
    if (errCode) {
        return(-1);
    } else {
        return(cbBytesRead);
    }
}

WORD  APIENTRY CbWriteFdLpb (hf,lpBuffer,cbBuffer)
    HFILE hf;
    LPSTR lpBuffer;
    WORD  cbBuffer;

{
    USHORT cbBytesRead;
    INT errCode;

    errCode = DosWrite(hf,lpBuffer,cbBuffer,&cbBytesRead);

    if (errCode) {
        return(-1);
    } else {
        return(cbBytesRead);
    }
}

LFO  APIENTRY LSeekFd (hf, lDistance, fMethod)
    HFILE hf;
    ULONG lDistance;
    USHORT fMethod;

{
    ULONG lNewLocation;
    INT errCode;

    errCode = DosChgFilePtr(hf,lDistance,FILE_BEGIN,&lNewLocation);

    if (errCode) {
        return(-1);
    } else {
        return(lNewLocation);
    }
}

INT  APIENTRY EnUnLinkSz(lpFileName)
    LPSTR lpFileName;

{
    if (DosDelete(lpFileName,0L)) {
        return(-1);
    } else {
        return(0);
    }
}


INT  APIENTRY EnRenameSzSz (lpOldName,lpNewName)
    LPSTR lpOldName;
    LPSTR lpNewName;
{

    if (DosMove(lpOldName, lpNewName, 0L)) {
        return(-1);
    } else {
        return(0);
    }
}