/* Copy n bytes from the source-file to a dest-file
**
** Rudolph Riedel <rudolph-riedel@t-online.de> 
** 
** V1.0 02-07-05
**
** This is public-domain, do whatever you like with this code.
**
**
*/

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/alib_stdio_protos.h>


UBYTE VerstrA[]="$VER: CopyHead 1.0 (02-07-05) R.Riedel";

int main(void)
{
struct RDArgs *rda;
LONG vec[3], length=1000, buffersize, readlength, status, i=0, filesize;
BPTR  fIn,fOut;
UBYTE *Globuff;
struct FileInfoBlock *fib;

vec[0]=vec[1]=0;
vec[2]=(LONG)&length;
buffersize=readlength=32000;

if((rda = ReadArgs("Source/A,Dest/A,Length/N",vec,NULL)) != NULL)
 {
  length = *(const LONG *) vec[2];

  if(fIn=Lock((STRPTR)vec[0], ACCESS_READ))
   {
    if(fib=AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC))
     {
      if(Examine(fIn,fib))
       {
        filesize=fib->fib_Size;
        UnLock(fIn);
        if(filesize < length) length=filesize;
        if(length < buffersize) readlength=length;
        filesize=0;
        if(fIn=Open((STRPTR)vec[0],MODE_OLDFILE))
         {
          if(fOut=Open((STRPTR)vec[1],MODE_NEWFILE))
           {
            if(Globuff=(UBYTE *)AllocMem(buffersize,MEMF_PUBLIC|MEMF_CLEAR))
             {
              status=1;
              while(status>0&&(i=Read(fIn,Globuff,readlength))>0)
               {
                status=Write(fOut,Globuff,i);
                if(status!=i)
                 {
                  status=(-1);
                 }
                filesize+=i;
                if(filesize == length) status=0;
                if((filesize+buffersize)>length) readlength=length-filesize;
               }
              Close(fOut);
              if(status==-1||i==-1)
               {
                Fault(IoErr(),NULL,Globuff,FAULT_MAX);
                Printf(Globuff,0);
                DeleteFile((STRPTR)vec[1]);
               }
              FreeMem(Globuff,buffersize);
             }
           }
          Close(fIn);
         }
       }
      FreeMem(fib,sizeof(struct FileInfoBlock));
     }
   }
  FreeArgs(rda);
 }
return 1;
}
