home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / djgpp / split.c < prev    next >
C/C++ Source or Header  |  1994-03-04  |  1KB  |  87 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4.  
  5. #ifndef O_BINARY
  6. #define O_BINARY 0
  7. #endif
  8.  
  9. #define BUFS  16384
  10.  
  11. usage()
  12. {
  13.   fprintf(stderr,"Usage: split [inputFile] [chunkSize] [outputBase]\n");
  14.   fprintf(stderr, "chunksize is bytes or kbytes (ex: 1440k), creates <outputBase>.000, <outputBase>.001, etc\n");
  15.   exit(1);
  16. }
  17.  
  18. p_open(ob, p)
  19. char *ob;
  20. int p;
  21. {
  22.   char partname[1024];
  23.   sprintf(partname, "%s.%03d", ob, p);
  24.   return open(partname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
  25. }
  26.  
  27. main(argc, argv)
  28. int argc;
  29. char **argv;
  30. {
  31.   char buf[BUFS];
  32.   long chunksize, left, r;
  33.   int partnum;
  34.   int inf, f;
  35.   char *endp;
  36.   
  37.   if (argc != 4)
  38.     usage();
  39.  
  40.   inf = open(argv[1], O_RDONLY|O_BINARY);
  41.   if (inf < 0)
  42.     usage();
  43.  
  44.   chunksize = strtol(argv[2], &endp, 0);
  45.   if (chunksize < 1)
  46.     usage();
  47.   switch (*endp)
  48.   {
  49.     case 'k':
  50.     case 'K':
  51.       chunksize *= 1024L;
  52.       break;
  53.     case 'm':
  54.     case 'M':
  55.       chunksize *= 1048576L;
  56.       break;
  57.   }
  58.  
  59.   partnum = 0;
  60.   left = chunksize;
  61.   f = p_open(argv[3], partnum);
  62.   while (1)
  63.   {
  64.     if (left < BUFS)
  65.       r = read(inf, buf, left);
  66.     else
  67.       r = read(inf, buf, BUFS);
  68.     if (r <= 0)
  69.     {
  70.       close(f);
  71.       close(inf);
  72.       exit(0);
  73.     }
  74.     
  75.     write(f, buf, r);
  76.     left -= r;
  77.     
  78.     if (left == 0)
  79.     {
  80.       close(f);
  81.       partnum++;
  82.       f = p_open(argv[3], partnum);
  83.       left = chunksize;
  84.     }
  85.   }
  86. }
  87.