#include "bbs.h"

static ULONG GetFileSize(char *s);
/****************************************************************************\
                                 DynAllocate
\****************************************************************************/

ULONG DynAllocate(char **pbuf,ULONG maxbufsize)
{
 /* first try Fast mem allocate */
 do {
	    *pbuf=(char *)AllocMem((ULONG)maxbufsize,MEMF_PUBLIC|MEMF_CLEAR);
	    maxbufsize=maxbufsize>>1; if(*pbuf==NULL) Delay(5L);
	} while(*pbuf == NULL && maxbufsize > 8192);

 maxbufsize=maxbufsize<<1;
 if(*pbuf!=NULL)	return(maxbufsize);
 return(0L);
}

             /* s = from file, d = to file */
ULONG FileCopy(char *from,char *to)
{
 UBYTE *buf;
 long bufsize,stat1,stat2;
 BPTR fhs,fhd;
 //if(Rename(from,to)) return(2);
 
 if(bufsize=DynAllocate(&buf,GetFileSize(from)+8192L)) {
      /* got a buffer full of mem */
	    if(fhs=Open(to,MODE_OLDFILE)) {
		    Close(fhs);                 /* file exists so return */
 	    FreeMem(buf,bufsize);       
		    return(0);
		}

	    if(fhs=Open(from,MODE_OLDFILE)) {
		    if(fhd=Open(to,MODE_NEWFILE)) {
			    do {
				    stat1=Read(fhs,buf,bufsize);   /* Read from file */
				    if(stat1>0)		stat2=Write(fhd,buf,stat1); /* write to file*/
				} while(stat1>0&&stat2>0);

 			if(stat1<0) {
    				sprintf(GSTR3,"\r\nERROR while reading from %s!\r\n",from);
 				AEPutStr(GSTR3);
				}
	    		if(stat2<0)	{
 				sprintf(GSTR3,"\r\nERROR while writing to %s!\r\n",to);
	    			AEPutStr(GSTR3);
				}
 			Close(fhd);
			}
	    	Close(fhs);
		}
	    FreeMem(buf,bufsize);
	}

 if((stat1>=0&&stat2>=0))	{
    return(1);
 }
 return(0);
}

static ULONG GetFileSize(char *s)
{
struct FileInfoBlock *FBlock;
 BPTR FLock;
  ULONG fsize=8192L;
  if((FLock = Lock(s,ACCESS_READ)) == NULL) {
              return(8192L);
             }

             if((FBlock=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL)) == NULL) {
                 UnLock(FLock);
                 return(8192L);
             }
             if( Examine(FLock,FBlock) )     fsize = FBlock->fib_Size;
             UnLock(FLock);
             FreeDosObject(DOS_FIB,FBlock);
 return(fsize);
}