home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / bbs / amigalib / d999 / asplit.lha / ASplit / Asplit2.c < prev    next >
C/C++ Source or Header  |  1994-04-05  |  4KB  |  217 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <sys/dir.h>
  5. #include <sys/stat.h>
  6. #define DEFAULT_SIZE 1024
  7. #define ShowError(a) ShowErrorFunc(__LINE__,a)
  8.  
  9. #ifndef O_BINARY
  10. #define O_BINARY 0
  11. #endif
  12.  
  13. void ShowErrorFunc (int line,char *s);
  14.  
  15. static char* _ver="$VER: Asplit 2.0";
  16.  
  17. extern int errno;
  18.  
  19. void ShowErrorFunc(int line,char *s)
  20. {
  21.   fprintf(stderr,"%s: Error on line %d,",s,line);
  22.   perror("");
  23.   exit(errno);
  24. }
  25.  
  26.  
  27. void usage(char *s)
  28. {
  29.   fprintf(stderr,"%s by MENDEZ Marc. (%s %s) All right reserved. Copyright 1994\n",s,__DATE__,__TIME__);
  30.   fprintf(stderr,"Usage: %s [-b buffer] -s size filein [fileout]\n",s);
  31.   exit(1);
  32. }
  33.  
  34.  
  35. int OpenOutputFile(char *root, int num,char *StrTemplate)
  36. {
  37.   int Ptr;
  38.   char *EffectiveFileNameOut;  
  39.  
  40. #ifndef AMIGA
  41.   int mask;
  42.   
  43.   umask(mask=umask(0));
  44.   mask=(~mask)&(S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
  45.   
  46. #endif
  47.   
  48.   if ((EffectiveFileNameOut=(char*)malloc(sizeof(char)*(MAXNAMLEN+1)))==NULL)
  49.     ShowError("malloc");
  50.  
  51.   sprintf(EffectiveFileNameOut,StrTemplate,root,num);
  52.  
  53. #ifndef AMIGA
  54.   if ( (Ptr =
  55.     open(EffectiveFileNameOut,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,mask))<0)  
  56. #else
  57.   if ( (Ptr =
  58.     open(EffectiveFileNameOut,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY))<0)  
  59. #endif
  60.     ShowError("open");
  61.  
  62.   free(EffectiveFileNameOut);
  63.   return Ptr;
  64.   
  65. }
  66.  
  67.  
  68. int main(int argc, char *argv[])
  69. {
  70.   int In, Out;
  71.   long Size=0;
  72.   char *Buffer;
  73.   long BufferSize=DEFAULT_SIZE;
  74.   char *FileNameIn=NULL, *FileNameOut=NULL;
  75.   struct stat StatBuffer;
  76.   
  77.   int i=1;
  78.   int End=0;
  79.   int NumberOfCharRead;
  80.   int NumberOfCharToRead;
  81.   long FileNumber=0;
  82.   char *StringTemplate;
  83.   
  84.  
  85.   if (argc==1)
  86.     usage(argv[0]);
  87.   
  88.  
  89.   while (i<=(argc-1))
  90.     {
  91.       switch(argv[i][0])
  92.     {
  93.     case '-':
  94.       {
  95.         switch(argv[i][1])
  96.           {
  97.           case 'b':
  98.         {
  99.           long t;
  100.           if (i+1>(argc-1))
  101.             usage(argv[0]);
  102.           if ((t=atol(argv[i+1]))<=0)
  103.             usage(argv[0]);
  104.           BufferSize=t;
  105.           i++;
  106.           break;
  107.         }        /* case 'b' */
  108.           case 's':
  109.         {
  110.           long t;
  111.           if (i+1>(argc-1))
  112.             usage(argv[0]);
  113.           if ((t=atol(argv[i+1]))<=0)
  114.             usage(argv[0]);
  115.           Size=t;
  116.           i++;        
  117.           break;
  118.         }        /* case 's' */
  119.           default:
  120.           usage(argv[0]);
  121.                 /* default */
  122.           }            /* switch(argv[i][1]) */
  123.         break;
  124.       }            /* case '-' */
  125.     default:
  126.       {
  127.         char *t;
  128.         if ((t=(char*)strdup(argv[i]))==NULL)
  129.           ShowError(argv[0]);
  130.  
  131.         if (FileNameIn==NULL)
  132.           {
  133.         if ((FileNameIn=(char*)strdup(t))==NULL)
  134.           ShowError(argv[0]);
  135.           }
  136.         else
  137.           {
  138.         if (FileNameOut==NULL)
  139.           {
  140.             if ((FileNameOut=(char*)strdup(t))==NULL)
  141.               ShowError(argv[0]);
  142.           }
  143.         else
  144.           usage(argv[0]);
  145.           }
  146.         free(t);
  147.         break;
  148.       }            /* default: */
  149.     }            /* switch(argv[i][0]) */
  150.       i++;
  151.     }                /* while (i<=argc) */
  152.  
  153.   if (FileNameOut==NULL && FileNameIn==NULL)
  154.     usage(argv[0]);
  155.   
  156.  
  157.   if (FileNameOut==NULL)
  158.     {
  159.       if ((FileNameOut=(char*)strdup(FileNameIn))==NULL)
  160.     ShowError(argv[0]);
  161.     }
  162.  
  163.   if (FileNameIn==NULL | Size==0)
  164.     usage(argv[0]);
  165.  
  166.   if ((In=open(FileNameIn,O_RDONLY|O_BINARY))<0)
  167.     ShowError(argv[0]);
  168.  
  169.   if (stat(FileNameIn,&StatBuffer)==0)
  170.     {
  171.       long OriginalSize;
  172.       char t[256];
  173.       
  174.       OriginalSize= StatBuffer.st_size;
  175.       sprintf(t,"%d",(OriginalSize/Size)+(OriginalSize%Size == 0 ? 0 : 1));
  176.       if ((StringTemplate=(char *)malloc(strlen("%0d")+strlen(t)+1))==NULL)
  177.     ShowError(argv[0]);
  178.       sprintf(StringTemplate,"%%s%%0%dd",strlen(t));      
  179.     }
  180.   else
  181.     ShowError(argv[0]);
  182.   
  183.   if ((Buffer=(char*)malloc(sizeof(char)*BufferSize))==NULL)
  184.     ShowError(argv[0]);
  185.   
  186.   while (!End)
  187.     {
  188.       Out=OpenOutputFile(FileNameOut,FileNumber,StringTemplate);
  189.       
  190.       for(i=1;(i<=(int)(Size/BufferSize)+((Size % BufferSize) > 1 ? 1 : 0)) &&
  191.       (!End);i++)
  192.     {
  193.       NumberOfCharToRead=(int)(Size/(BufferSize*i)) >=1 ?
  194.         BufferSize : Size % BufferSize;
  195.       
  196.       if ((NumberOfCharRead=read(In,Buffer,NumberOfCharToRead))!=NumberOfCharToRead)
  197.         {
  198.           if (NumberOfCharRead<0)
  199.         ShowError(argv[0]);
  200.           else
  201.         End=1;
  202.         }
  203.  
  204.       if (write(Out,Buffer,NumberOfCharRead)!=NumberOfCharRead)
  205.         ShowError(argv[0]);
  206.     }
  207.       close(Out);
  208.       FileNumber++;
  209.       
  210.     }
  211.   
  212.   close(In);
  213.   return 0;
  214.  
  215.   
  216. }
  217.