
/*  Split.c  */


#include <exec/types.h>
#include <libraries/dos.h>

#define MINSIZE 10000L
#define NRMSIZE 100000L
#define MAXSIZE 1000000L

#define USAGE "\n\
    File splitter - V1.0\n\
       Copyright 1987\n\
    Richard Lee Stockton\n\
    21305 60th Ave. West\n\
    MtLkTerr, Wash 98043\n\
     (206)  776-1253\n\n\
USAGE: Split <path>filename <partsize>\n\n"

extern struct FileHandle *Open();
extern char *AllocMem();
extern long Seek(), Read(), Write(), Output(), atol();

Enable_Abort=1;

   struct FileHandle *infile=NULL, *outfile=NULL;
   long iosize, actual;
   char *buffer=NULL;
   char partname[2];
   int  partsuffix=1;

main(argc, argv)
   int argc;
   char *argv[];
{
   
   if(!(strcmp(argv[1],"?")))
   {
       Write(Output(),USAGE,(long)strlen(USAGE));
       exit();
   }
   
  /* open source file */
   if (!(infile=Open(argv[1],MODE_OLDFILE))) _abort();
   Seek(infile,0L,OFFSET_BEGINNING);
   
  /* check and set iosize from argv[2] */
   if (argv[2]) actual = atol(argv[2]);
   if (actual < MINSIZE) actual = NRMSIZE;
   if (actual > MAXSIZE) actual = NRMSIZE;
   iosize = actual;
   
  /* allocate buffer */
   if ((buffer=AllocMem(iosize,0L))==NULL) _abort();
   
   do
   {
     /* construct new partname */
      partname[0] = (long)partsuffix + '0';
      partname[1] = '\0';
      
     /* inform user of file creation */
      Write(Output(),"creating ",10L);
      Write(Output(),partname,(long)strlen(partname));
      Write(Output(),"\n",2L);
      
     /* fill buffer, write partfile */
      if ((actual=Read(infile,buffer,iosize))==-1L) _abort();
      if (!(outfile=Open(partname,MODE_NEWFILE)))    _abort();
      if (Write(outfile,buffer,actual)!=actual)
      {
         Close(outfile);
         _abort();
      }
      
      
     /* increment suffix index */
      partsuffix++;
      if (partsuffix>42)
      {
         Write(Output(),"\nMore than 35 parts!\n",22L);
         Close(outfile);
         _abort();
      }
     /* skip over punctuation to caps */
      if(partsuffix==10) partsuffix = 17;
      
      Close(outfile);
      Chk_Abort();
   }
   
     /* loop as long as we have a full size file */
      while(actual==iosize);

   _abort();
}

_abort()
{
   if (buffer  != NULL) FreeMem(buffer,iosize);
   if (infile  != NULL) Close(infile);
   exit(1);
}

      