home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum23.lzh / f23b / SOFTWARE / SPLIT / split.c < prev    next >
C/C++ Source or Header  |  1992-07-01  |  7KB  |  283 lines

  1. # include <stdio.h>
  2. # include <math.h>
  3.  
  4. # ifdef OSK
  5. # include <modes.h>
  6. extern char *malloc();
  7. # endif
  8.  
  9. # ifdef __TURBOC__
  10. # include <fcntl.h>
  11. # include <sys/stat.h>
  12. # include <io.h>
  13. # include <string.h>
  14. # define _gs_size(X) filelength(X)
  15. # define _gs_eof(X) eof(X)
  16. # define read _read
  17. # define write _write
  18. # include <alloc.h>
  19. # endif
  20.  
  21. # define FALSE 0
  22. # define TRUE 1
  23. # define ERR -1
  24. # define LINEBUF 1024
  25. # define BLOCKBUF 4096
  26.  
  27. char help[]=
  28. "Supplementary file maintenance utility\n\
  29. Written by Carsten Emde, may be copied for non-commercial use\n\
  30. Syntax: split [<opts>] <path> [<opts>]\n\
  31. Function: split file <path> into several parts\n\
  32. Options:\n\
  33.     -o=<path>   output files will be named <path>aa, <path>ab, ...,\n\
  34.                   <path>zz (default <path> is input file name)\n\
  35.     -c=<num>    line number to cut at\n\
  36.     -b=<num>    file length in byte to cut at\n\
  37.     -n          output files will be named <path>00, <path>01, ...,\n\
  38.                   <path>99\n\n";
  39.  
  40. extern int              errno;
  41. void prmiss();
  42.  
  43. void main(argc,argv)
  44. int argc;
  45. char *argv[];
  46. {
  47.   char                 *p, *s, *fs, unknown = FALSE, quest = FALSE, nomatch = FALSE,
  48.                         numeric = FALSE;
  49.   char                 *outfilnam = NULL, *buffer, outnam[32];
  50.   unsigned long         binary = 0, lines = 0, bufferlen, toread, actread,
  51.                         blockremaining, allremaining;
  52.   int                   fn = 0;
  53.   int                   infile, outfile;
  54.   register              int i, j;
  55.   
  56.   while(--argc > 0 && (*++argv)[0] != '\0') {
  57.     s = argv[0];
  58.     if(*s == '-')
  59.       for (s++; *s != '\0' && !unknown && !nomatch; s++) {
  60.         switch(*s) {
  61.           case 'b':
  62.             if ((*++s)!='=') {
  63.               nomatch = TRUE;
  64.               prmiss(s);
  65.             }
  66.             else {
  67.               binary = (unsigned long) atoi(++s);
  68.               if (binary == 0) {
  69.                 nomatch = TRUE;
  70.                 prmiss(s - 1);
  71.               }
  72.               for(; *s!='\0'; ++s); s--;
  73.             }
  74.           break;
  75.           case 'c':
  76.             if ((*++s) != '=') {
  77.               nomatch = TRUE;
  78.               prmiss(s);
  79.             } else {
  80.               lines = (unsigned long) atoi(++s);
  81.               if (lines == 0) {
  82.                 nomatch = TRUE;
  83.                 prmiss(s - 1);
  84.           }
  85.               for (; *s!='\0'; ++s); s--;
  86.         }
  87.             break;
  88.           case 'n':
  89.             numeric = TRUE;
  90.             break;
  91.           case 'o':
  92.             if ((*++s) != '=') {
  93.               nomatch = TRUE;
  94.               prmiss(s);
  95.         } else {
  96.               outfilnam = ++s;
  97.               for(; *s!='\0'; ++s); s--;
  98.         }
  99.             break;
  100.           case '?':
  101.             quest = TRUE;
  102.             break;
  103.           default:
  104.             unknown = TRUE;
  105.             p=s;
  106.             break;
  107.     }
  108.       } else {
  109.       if (fn > 0)
  110.         exit(_errmsg(0,"too many file names\n"));
  111.       else {
  112.         fs = s;
  113.         fn++;
  114.       }
  115.     }
  116.     if (quest || unknown) break;
  117.   }
  118.     
  119.   if (quest) {
  120.     printf(help);
  121.     exit(0);
  122.   }
  123.   
  124.   if (unknown) {
  125.     fprintf(stderr,help);
  126.     exit(_errmsg(1, "unrecognized symbol '%c'.\n",*p));
  127.   }
  128.  
  129.   if (lines && binary)
  130.     exit(_errmsg(1, "-b and -c options are mutually exclusive.\n"));
  131.  
  132.   if (!lines && !binary)
  133.     exit(_errmsg(1, "either -b or -c option MUST be specified.\n"));
  134.  
  135.   if (fn==0)
  136.     exit(_errmsg(1, "at least one filename must be given.\n"));
  137.  
  138. # ifdef OSK
  139.   if ((infile = open(fs, S_IREAD)) == ERR)
  140.     exit(_errmsg(errno, "can't open '%s' due to ", fs));
  141. # endif
  142.  
  143. # ifdef __TURBOC__
  144.   if ((infile = open(fs, O_RDONLY | O_BINARY)) == ERR)
  145.     exit(_errmsg(errno, "can't open '%s' due to ", fs));
  146. # endif
  147.     
  148.   if (binary) {
  149.     bufferlen = BLOCKBUF;
  150.     allremaining = _gs_size(infile);
  151.   }
  152.   else
  153.     bufferlen = LINEBUF;
  154.   
  155.   if ((buffer = malloc(bufferlen)) == NULL)
  156.     exit(_errmsg(errno,"can't get enough memory, program aborted.\n"));
  157.  
  158.   if (outfilnam == NULL)
  159.     outfilnam = fs;
  160.   
  161.   i = 0;  
  162.   for (;;) {
  163.     if (numeric)
  164.       sprintf(outnam, "%s%02d", outfilnam, i + 1);
  165.     else
  166.       sprintf(outnam, "%s%c%c", outfilnam, 'a' + i / ('z'-'a'), 'a' + i % ('z' - 'a'));
  167.     
  168. # ifdef OSK
  169.     outfile = create(outnam, S_ISIZE, S_IWRITE + S_IREAD + S_IOREAD, bufferlen * 32);
  170.     if(outfile == ERR)
  171.       exit(_errmsg(errno, "can't create '%s' due to ", outnam));
  172.     close(outfile);
  173.     outfile = open(outnam, S_IWRITE);
  174. # endif
  175.  
  176. # ifdef __TURBOC__
  177.   if((outfile = open(outnam, O_CREAT | O_EXCL | O_WRONLY | O_BINARY,
  178.     S_IREAD | S_IWRITE)) == ERR)
  179.       exit(_errmsg(errno, "can't create '%s' due to ", outnam));
  180. # endif
  181.  
  182.     if(binary) {
  183.       if (allremaining < binary)
  184.         blockremaining = allremaining;
  185.       else
  186.          blockremaining = binary;
  187.       for(;;) {
  188.         if (blockremaining < bufferlen)
  189.           toread = blockremaining;
  190.         else
  191.           toread = bufferlen;
  192.         if ((actread = read(infile, buffer, (unsigned) toread)) != (unsigned) toread)
  193.           if (!_gs_eof(infile))
  194.             exit(_errmsg(errno, "can't read all data from '%s' due to ", outnam));
  195.         if ((write(outfile, buffer, (unsigned) actread)) != (unsigned) actread)
  196.           exit(_errmsg(errno, "can't write all data to '%s' due to ", fs));
  197.         blockremaining -= actread;
  198.         allremaining -= actread;
  199.         if (blockremaining == 0) break;
  200.       }
  201.     }
  202.     else {
  203.       for (j = 0; j < lines; j++) {
  204.         if ((actread = (unsigned long) readln(infile, buffer, (unsigned) bufferlen)) == 0)
  205.           if (!_gs_eof(infile))
  206.             exit(_errmsg(errno, "can't read from '%s' due to ", fs));
  207.         if ((writeln(outfile, buffer, (unsigned) actread)) == 0)
  208.             exit(_errmsg(errno, "can't write to '%s' due to ", outnam));
  209.         if (_gs_eof(infile))
  210.           break;
  211.       }
  212.     }
  213.     close(outfile);
  214.     if (binary) {
  215.       if (allremaining == 0)
  216.       break;
  217.     }
  218.     else {
  219.       if (_gs_eof(infile))
  220.       break;
  221.     }
  222.     i++;
  223.   }
  224.   close(infile);
  225. }
  226.  
  227.  
  228. void prmiss(cp)
  229. char *cp; {
  230.   fprintf(stderr, help);
  231.   exit(_errmsg(1, "missing or illegal size for '-%c' option\n", *(cp - 1)));
  232. }
  233.  
  234. # ifdef __TURBOC__
  235.  
  236. int readln(handle, buf, len)
  237. int                 handle;
  238. char               *buf;
  239. unsigned            len;
  240. {
  241.   int               r;
  242.   char             *cp;
  243.  
  244.   cp = buf;
  245.   do
  246.     r = read(handle, cp, 1);
  247.   while (r == 1 && *(cp++) != '\n' && cp-buf < len);
  248.   *cp = '\0';
  249.   if (r >= 0)
  250.     return(cp - buf);
  251.   else
  252.     return(ERR);
  253. }
  254.  
  255.  
  256. int writeln(handle, buf, len)
  257. int                 handle;
  258. char               *buf;
  259. unsigned            len;
  260. {
  261.   int               towrite;
  262.  
  263.   towrite = strchr(buf, '\n') - buf + 1;
  264.   if(towrite > len)
  265.     towrite = len;
  266.   if(write(handle, buf, towrite) != towrite)
  267.     towrite = ERR;
  268.   return(towrite);
  269. }
  270.  
  271.  
  272. int _errmsg(err, str, arg)
  273. char               *str;
  274. int                 err, arg;
  275. {
  276.   fprintf(stderr, "split: ");
  277.   fprintf(stderr, str, arg);
  278.   if(err)
  279.     perror("");
  280.   return(err);
  281. }
  282. # endif
  283.