home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2 / DJLSR201.ZIP / src / utils / split.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-12  |  1.5 KB  |  84 lines

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