home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / new / util / cli / msplit / msplit.c < prev    next >
C/C++ Source or Header  |  1994-02-06  |  10KB  |  407 lines

  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2.  *                                                                             *
  3.  *              msplit  --  Version 1.3  -- from  Feb 07, 1994                 *
  4.  *                                                                             *
  5.  *                     Copyright (c) by Rene Tschirley                         *
  6.  *                                                                             *
  7.  *                           All rights reserved                               *
  8.  *                                                                             *
  9.  *                                                                             *
  10.  * This is not public domain but freeware!                                     *
  11.  *                                                                             *
  12.  *   Permission is granted to make and  distribute  verbatim  copies  of  this *
  13.  * program's code and documentation as you receive it, in any medium, provided *
  14.  * that  you  conspicuously  and  appropriately  publish  only  the  original, *
  15.  * unmodified  program  and  documentation,  with  all  copyright  notices  of *
  16.  * warranty intact and including anything else that came with the original.    *
  17.  *                                                                             *
  18.  *   There is no warranty for this software package. Although the  author  has *
  19.  * tried to prevent errors, he  can't  guarantee  that  the  software  package *
  20.  * described in this document is 100% reliable. You are therefore  using  this *
  21.  * material at your own risk. The author cannot be made  responsible  for  any *
  22.  * damage which is caused by using this software package.                      *
  23.  *                                                                             *
  24.  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  25.  
  26.  
  27. /* these three should be existant on EVERY system    */
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <string.h>
  31. #include <ctype.h>
  32.  
  33. /* we use an Amiga, UNIX System-V or ConvexOS system, this file should be included */
  34. #include <fcntl.h>
  35.  
  36. /* we have a BSD4.3 UNIX like Sun-OS, include this */
  37. /*
  38. #include <sys/file.h>
  39. */
  40.  
  41. /* if we use a MS-DOS machine, include this */
  42. /*
  43. #include <fcntl.h>
  44. #include <sys/stat.h>
  45. #include <io.h>
  46. */
  47.  
  48. /* for VMS usage, use this */
  49. /*
  50. #include <file.h>
  51. */
  52.  
  53. /* if we have anything else, hope that fcntl.h */
  54. /* will fit it. Look at the error messages concerning undefined functions...  */
  55. /*
  56. #include <fcntl.h>
  57. */
  58.  
  59.  
  60.  
  61.  
  62. /* here some other used macros...                                             */
  63.  
  64. #
  65. #ifndef FILENAME_MAX
  66. #define FILENAME_MAX 256
  67. #endif
  68. #
  69. #ifndef S_IREAD
  70. #define S_IREAD  0
  71. #endif
  72. #ifndef S_IWRITE
  73. #define S_IWRITE 0
  74. #endif
  75. #
  76. #ifdef BUFSIZ
  77. #if BUFSIZ < 1024
  78. #define BUFFERSIZE 1024
  79. #else
  80. #define BUFFERSIZE BUFSIZ
  81. #endif
  82. #else
  83. #define BUFFERSIZE 1024
  84. #endif
  85. #
  86. #define M_CONCAT    1
  87. #define M_DELETE    2
  88. #define S_VERSION   "MSPLIT  Version 1.3 from Feb 07, 1994  (c) by R.Tschirley\n"
  89. #define S_USAGE     "msplit -h | [-s]|-c [-n <size>[k]] [-d] <file> [to <dest>]\n"
  90. #
  91.  
  92.  
  93. /**
  94.  ** Prototypes
  95.  **/
  96.  
  97. char *  Parse_command(int targc, char **targv);
  98. void    Split_file(char *filename);
  99. void    Concat_file(char *filename);
  100. void    error(int code, char *string);
  101. void    Usage(void);
  102. void    Help(void);
  103.  
  104.  
  105. /**
  106.  ** global variables
  107.  **/
  108.  
  109. int                 mode =0;
  110. unsigned long int   size =720000;
  111. char *              destdir = "";
  112.  
  113.  
  114.  
  115.  
  116. /**
  117.  ** Function: main
  118.  **/
  119.  
  120. int main(int argc, char **argv)
  121. {
  122.   char *filename = NULL;
  123.  
  124.   if (!(filename = Parse_command(argc,argv)))
  125.     error(3,NULL);
  126.  
  127.   printf("%s",S_VERSION);
  128.  
  129.   if (mode & M_CONCAT)
  130.     Concat_file(filename);
  131.   else
  132.     Split_file(filename);
  133.  
  134.   return 1;
  135. }
  136.  
  137.  
  138.  
  139. /**
  140.  ** Function: Parse_command
  141.  **
  142.  ** Parses the commandline options. 'size', 'destdir' and 'mode' are defined
  143.  ** global, the filename will be returned to avoid some confusion. Commandline
  144.  ** is checked for logical sence.
  145.  **/
  146.  
  147. char *Parse_command(int targc, char **targv)
  148. {
  149.   char *filename = NULL;
  150.   int   i = 1, c, d;
  151.                                          
  152.   while (targc > i)
  153.     {
  154.       if (targv[i][0] == '-')
  155.         {
  156.           switch (targv[i][1])
  157.             {
  158.             case 'c':
  159.               mode = mode | M_CONCAT; break;
  160.             case 'd':
  161.               mode = mode | M_DELETE; break;
  162.             case 's':
  163.               mode = mode ^ M_CONCAT ; break;
  164.             case 'n':
  165.               i++;
  166.               if (isdigit( c = targv[i][d = strlen(targv[i])-1] ))
  167.                 size = (atol(targv[i]) / BUFFERSIZE) * BUFFERSIZE;
  168.               else
  169.                 {
  170.                   targv[i][d] = '\0';
  171.                   if (c == 'k' || c == 'K')
  172.                         size = (atol(targv[i]) * 1000 / BUFFERSIZE) * BUFFERSIZE;
  173.                   else
  174.                         error(6,(char *)c);
  175.                 }
  176.               if (!size) error(7, NULL);
  177.               break;
  178.             case 'h': case '?':
  179.               Help();
  180.             default:
  181.               error(4,&targv[i][1]);
  182.             }
  183.         }
  184.       else
  185.         {
  186.           if (!(strcmp(targv[i],"to")))
  187.             destdir = targv[++i];
  188.           else
  189.             filename = targv[i];
  190.         }
  191.       i++;
  192.     }
  193.   return filename;
  194. }
  195.  
  196.  
  197.  
  198. /**
  199.  ** Function: Split_file
  200.  **
  201.  ** Does the whole splitting of the large masterfile.
  202.  **/
  203.  
  204. void Split_file(char *filename)
  205. {
  206.   int  infile, outfile;
  207.   char buffer[BUFFERSIZE];
  208.   char outfilename[FILENAME_MAX];
  209.   register unsigned int i=0;
  210.   register unsigned long int j=0;
  211.   register int result;
  212.   
  213.   if (-1 == (infile = open(filename, O_RDONLY, 0))) error(1,filename);
  214.   
  215.   do
  216.     {
  217.       sprintf(outfilename,"%s%s.M%d",destdir,filename,++i);
  218.       printf("Writing file %s\n",outfilename);
  219.       if (-1 == (outfile = creat(outfilename, S_IREAD | S_IWRITE)))
  220.         error(0,outfilename);
  221.       
  222.       do
  223.         {
  224.           if (-1 == (result = read(infile, buffer, BUFFERSIZE)))
  225.             {
  226.               close(infile); close(outfile);
  227.               error(1, filename);
  228.             }
  229.           if (-1 == (result = write(outfile, buffer, result)))
  230.             {
  231.           close(infile); close(outfile);
  232.               error(0, outfilename);
  233.             }
  234.           j += result;
  235.  
  236.         }
  237.  
  238.       while(result && (j + BUFFERSIZE <= size));
  239.       
  240.       close(outfile);
  241.       j=0;
  242.     }
  243.   while(result);
  244.  
  245.   close(infile);
  246.   printf("Split file %s into %d parts.\n",filename,i);
  247.     if (mode & M_DELETE)
  248.         {
  249.         printf("Deleting input file %s.\n",filename);
  250.         unlink(filename);
  251.         }
  252.   return;
  253. }
  254.  
  255.  
  256.     
  257. /**
  258.  ** Function: Concat_file
  259.  **
  260.  ** The complete concatenation of the files.
  261.  **/
  262.     
  263. void Concat_file(char *filename)
  264. {
  265.   int  infile, outfile;
  266.   char buffer[BUFFERSIZE];
  267.   char infilename[FILENAME_MAX];
  268.   register unsigned int i=0;
  269.   register int result;
  270.   
  271.   sprintf(infilename,"%s%s",destdir,filename);
  272.   if (-1 == (outfile = creat(infilename, S_IREAD | S_IWRITE)))
  273.     error(0,infilename);
  274.   
  275.   while(1)
  276.     {
  277.       sprintf(infilename,"%s.M%d",filename,++i);
  278.       printf("Reading file %s\n",infilename);
  279.       if (-1 == (infile = open(infilename,O_RDONLY))) break;
  280.       
  281.       do
  282.         {
  283.           if (-1 == (result = read(infile, buffer, BUFFERSIZE)))
  284.             {
  285.               close(infile); close(outfile);
  286.               error(1, infilename);
  287.             }
  288.           if (-1 == (result = write(outfile, buffer, result)))
  289.             {
  290.               close(infile); close(outfile);
  291.               error(0,filename);
  292.             }
  293.         }
  294.       while(result);
  295.       close(infile);
  296.         if (mode & M_DELETE)
  297.             {
  298.             printf("Deleting input file %s.\n",infilename);
  299.             unlink(infilename);
  300.             }
  301.     }
  302.   
  303.   close(outfile);
  304.   if (!(--i)) error(2,NULL);
  305.   printf("Concated file %s from %d parts.\n",filename,i);
  306.   return;
  307. }
  308.  
  309.  
  310.  
  311. /**
  312.  ** Function: error
  313.  **
  314.  ** Here are all exits caused by any error.
  315.  **/
  316.  
  317. void error(int code, char *string)
  318. {
  319.   char msg[256];
  320.   
  321.   switch (code)
  322.     {
  323.     case 0:
  324.       perror(strcat(strcpy(msg,"MSPLIT: error on output file "),string));
  325.       break;
  326.     case 1:
  327.       perror(strcat(strcpy(msg,"MSPLIT: error on input file "),string));
  328.       break;
  329.     case 2:
  330.       printf("MSPLIT:\tFound to files to concat.\n");
  331.       break;
  332.     case 3:
  333.       printf("MSPLIT:\tNo input file specified.\n");
  334.       Usage();
  335.       break;
  336.     case 4:
  337.       printf("Unknown commandline option %s!\n",string);
  338.       Usage();
  339.       break;
  340.     case 5:
  341.       printf("MSPLIT: No file specified.\n");
  342.       Usage();
  343.