#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#ifndef O_BINARY
#define O_BINARY 0
#endif

char *pname="split";

p_open(ob, p)
char *ob;
int p;
{
  char partname[1024];
  sprintf(partname, "%s.%03d", ob, p);
  return open(partname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 438);
}

main(argc, argv)
int argc;
char **argv;
{
  char buf[16384];
  long chunksize, left, r;
  int partnum;
  int inf, f;
  char *endp;

  if (argc != 4)
	{
	fprintf(stderr,"\nUSAGE : %s inputFile Size outputBase\n",pname);
	fprintf(stderr,"\nSize in INTEGER bytes, kbytes or mbytes (ex: 1440k, 3m)\ncreates outputBase.000, outputBase.001, etc.\n");
	fprintf(stderr,"\n    Christos  Iossifides :  SPLIT v1.01 for UNIX and MsDos  @ 16/05/1994\n\n                  e-mail : chiossif@atlas.central.ntua.gr\n\n");
	return 1;
	}

  inf = open(argv[1], O_RDONLY|O_BINARY);
  if (inf < 0)
	{
	fprintf(stderr,"\nUSAGE : %s inputFile Size outputBase\n",pname);
	fprintf(stderr,"\nSize is integer bytes, kbytes or mbytes (ex: 1440k, 3m)\ncreates outputBase.000, outputBase.001, etc.\n");
	fprintf(stderr,"\n    Christos  Iossifides :  SPLIT v1.01 for UNIX and MsDos  @ 16/05/1994\n\n                  e-mail : chiossif@atlas.central.ntua.gr\n\n");
	return 1;
	}

  chunksize = strtol(argv[2], &endp, 0);
  if (chunksize < 1)
	{
	fprintf(stderr,"\nUSAGE : %s inputFile Size outputBase\n",pname);
	fprintf(stderr,"\nSize is integer bytes, kbytes or mbytes (ex: 1440k, 3m)\ncreates outputBase.000, outputBase.001, etc.\n");
	fprintf(stderr,"\n    Christos  Iossifides :  SPLIT v1.01 for UNIX and MsDos  @ 16/05/1994\n\n                  e-mail : chiossif@atlas.central.ntua.gr\n\n");
	return 1;
	}

  switch (*endp)
  {
    case 'k':
    case 'K':
      chunksize *= 1024L;
      break;
    case 'm':
    case 'M':
      chunksize *= 1048576L;
      break;
  }

  partnum = 0;
  left = chunksize;
  f = p_open(argv[3], partnum);
  while (1)
  {
    if (left < 16384)
      r = read(inf, buf, left);
    else
      r = read(inf, buf, 16384);
    if (r <= 0)
    {
      close(f);
      close(inf);
      exit(0);
    }

    write(f, buf, r);
    left -= r;

    if (left == 0)
    {
      close(f);
      partnum++;
      f = p_open(argv[3], partnum);
      left = chunksize;
    }
  }
}

