175 lines
3.0 KiB
C
175 lines
3.0 KiB
C
|
// calback.c
|
||
|
//
|
||
|
// these are the default callbacks for the library
|
||
|
//
|
||
|
#include <string.h>
|
||
|
#include <stdio.h>
|
||
|
#include <malloc.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <io.h>
|
||
|
#if defined(OS2)
|
||
|
#define INCL_NOCOMMON
|
||
|
#define INCL_DOSPROCESS
|
||
|
#define INCL_DOSSEMAPHORES
|
||
|
#define INCL_DOSFILEMGR
|
||
|
#define INCL_DOSERRORS
|
||
|
#define INCL_DOSMISC
|
||
|
#include <os2.h>
|
||
|
#else
|
||
|
#include <windows.h>
|
||
|
#endif
|
||
|
|
||
|
#include <dos.h>
|
||
|
|
||
|
#include "hungary.h"
|
||
|
#include "bsc.h"
|
||
|
|
||
|
typedef char bscbuf[2048];
|
||
|
|
||
|
// you must define the following callbacks for the library to use
|
||
|
|
||
|
LPV BSC_API LpvAllocCb(WORD cb)
|
||
|
// allocate a block of memory
|
||
|
//
|
||
|
{
|
||
|
return malloc(cb);
|
||
|
}
|
||
|
|
||
|
VOID BSC_API FreeLpv(LPV lpv)
|
||
|
// free a block of memory
|
||
|
//
|
||
|
{
|
||
|
free(lpv);
|
||
|
}
|
||
|
|
||
|
VOID BSC_API SeekError(LSZ lszFileName) // do not return!
|
||
|
// error handling
|
||
|
//
|
||
|
{
|
||
|
BSCPrintf("BSC Library: Error seeking in file '%s'\n", lszFileName);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
VOID BSC_API ReadError(LSZ lszFileName) // do not return!
|
||
|
// error handling
|
||
|
//
|
||
|
{
|
||
|
BSCPrintf("BSC Library: Error reading in file '%s'\n", lszFileName);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
VOID BSC_API BadBSCVer(LSZ lszFileName) // do not return!
|
||
|
// error handling
|
||
|
//
|
||
|
{
|
||
|
BSCPrintf("BSC Library: '%s' not in current .bsc format\n", lszFileName);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
FILEHANDLE BSC_API
|
||
|
BSCOpen(LSZ lszFileName, FILEMODE mode)
|
||
|
// open the specified file
|
||
|
//
|
||
|
{
|
||
|
#if defined (OS2)
|
||
|
bscbuf b;
|
||
|
strcpy(b, lszFileName);
|
||
|
return open(b, mode);
|
||
|
#else
|
||
|
return OpenFile( lszFileName, mode, FALSE, FILE_SHARE_READ);
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
int BSC_API
|
||
|
BSCRead(FILEHANDLE handle, LPCH lpchBuf, WORD cb)
|
||
|
// read in the specified number of bytes
|
||
|
//
|
||
|
{
|
||
|
#if defined (OS2)
|
||
|
bscbuf b;
|
||
|
|
||
|
while (cb > sizeof(b)) {
|
||
|
if (read(handle, b, sizeof(b)) == -1) return -1;
|
||
|
memcpy(lpchBuf, b, sizeof(b));
|
||
|
cb -= sizeof(b);
|
||
|
lpchBuf += sizeof(b);
|
||
|
}
|
||
|
|
||
|
if (read(handle, b, cb) == -1) return -1;
|
||
|
memcpy(lpchBuf, b, cb);
|
||
|
return cb;
|
||
|
#else
|
||
|
return ReadFile(handle, lpchBuf, cb);
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
int BSC_API
|
||
|
BSCClose(FILEHANDLE handle)
|
||
|
// close the specified handle
|
||
|
//
|
||
|
{
|
||
|
#if defined (OS2)
|
||
|
return close(handle);
|
||
|
#else
|
||
|
return !CloseHandle( handle );
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
int BSC_API
|
||
|
BSCSeek(FILEHANDLE handle, long lPos, FILEMODE mode)
|
||
|
// seek on the specified handle
|
||
|
//
|
||
|
{
|
||
|
#if defined (OS2)
|
||
|
if (lseek(handle, lPos, mode) == -1)
|
||
|
return -1;
|
||
|
else
|
||
|
return 0;
|
||
|
#else
|
||
|
if (SetFilePointer( handle, lPos, 0L, mode) == -1) {
|
||
|
return -1;
|
||
|
} else {
|
||
|
return 0;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
VOID BSC_API
|
||
|
BSCOutput(LSZ lsz)
|
||
|
// write the given string to the standard output
|
||
|
//
|
||
|
{
|
||
|
bscbuf b;
|
||
|
int cb;
|
||
|
|
||
|
cb = strlen(lsz);
|
||
|
|
||
|
while (cb > sizeof(b)) {
|
||
|
memcpy(b, lsz, sizeof(b));
|
||
|
|
||
|
if (write(1, b, sizeof(b)) == -1) return;
|
||
|
|
||
|
cb -= sizeof(b);
|
||
|
lsz += sizeof(b);
|
||
|
}
|
||
|
|
||
|
memcpy(b, lsz, cb);
|
||
|
write(1, b, cb);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
VOID BSC_API
|
||
|
BSCDebugOut(LSZ lsz)
|
||
|
// ignore debug output by default
|
||
|
//
|
||
|
{
|
||
|
// unreferenced lsz
|
||
|
lsz = NULL;
|
||
|
}
|
||
|
#endif
|