#include <stdio.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <proto/exec.h>
#include <proto/dos.h>

APTR LoadinMem(char *filename)
{	/* LOAD FILE INTO MEMBUF OR RETURN 0 IF ERROR */

	BPTR mylock, myfile;
	struct FileInfoBlock *fib;
	BOOL success;
	long len, n;
	APTR membuf;

	if (!(mylock = Lock(filename,ACCESS_READ)))
	{	fprintf(stderr, "ERROR: Couldn't lock file\n");
		return NULL;
	}

	if (!(fib = AllocDosObject(DOS_FIB,NULL)))
	{	fprintf(stderr, "ERROR: Couldn't AllocDosObject FileinfoBlock\n");
		UnLock(mylock);
		return NULL;
	}

	if (!(success = Examine(mylock,fib)))
	{	fprintf(stderr, "ERROR: Couldn't Examine file\n");
		FreeDosObject(DOS_FIB,fib);
		UnLock(mylock);
		return NULL;
	}

	len = fib->fib_Size;
	FreeDosObject(DOS_FIB,fib);

	if (!(membuf = AllocVec(len, MEMF_ANY|MEMF_CLEAR)))
	{	fprintf(stderr, "ERROR: Could not allocate enough memory to read file!\n");
		UnLock(mylock);
		return NULL;
	}

	if (!(myfile = Open(filename,MODE_OLDFILE)))
	{	fprintf(stderr, "ERROR: Couldn't Open file\n");
		FreeVec(membuf);
		UnLock(mylock);
		return NULL;
	}

	if ((n = Read(myfile,membuf,len)) == -1)
	{	fprintf(stderr, "ERROR: Couldn't Read file\n");
		Close (myfile);
		FreeVec(membuf);
		UnLock(mylock);
		return NULL;
	}

	Close(myfile);
	UnLock(mylock);
	return membuf;
}
