#include <stdio.h>
#include <errno.h>

/* ###### Programme de decoupage Cut version 0.80b pour Unix
   ###### '95-97 JBR.

 Fonctionnement : tar du repertoire ou cut est lance et decoupage du tar en 
 fichiers de TFICHIER octets.

 A ajouter :
   parametres en ligne de commande : fichier a couper, taille des morceaux, 
   nombre de morceaux, nom des fichiers coupes, zippage du tar,...
  option -v (affiche un compteur,...
*/


/* *******************************************
            CONSTANTES GENERALES
   ******************************************* */

#define TAILLEBLOC  30368              /* Taille du buffer */
#define NBLOCS 48                      /* nombre de bloc sur une disquette de 
                                         1.44Mo */
#define TFICHIER (NBLOCS * TAILLEBLOC) /* Taille du fichier, multiple de
                                          TAILLEBLOC */
#define FNAME "coupe"                  /* 5 maxi pour compatibilite avec 
                                          version DOS*/


/* ************************************************************************* */
/* Fonctions */
/* --------- */ 

/* ******************************************* */
/* Tranforme un entier en chaine de caracteres */
/* ------------------------------------------- */
int itostr(char *str, int n)
{
 if ((n/100) != 0)
   {
    *str++ = '0'+(n/100);
    *str++ = '0'+(n % 100)/10;
    *str++ = '0'+(n % 10);
    return 3;
   }
 else
   {
    if ((n/10) != 0)
      {
       *str++ = '0'+(n/10);
       *str++ = '0'+(n % 10);
       return 2;
      }
    else
      {
       *str++ = '0'+n;
       return 1;
      }
   }
}
    
/* ******************************************* */
/* Retourne dans out le nom du fichier #b      */
/* ------------------------------------------- */
void getname(char *out, char *base,  int b)
{
 for (; (*out = *base) != '\0' ; out++ , base++ )
      *out = *base;
 if (b<100)
   *out++ = '0';

 if (b<10)
   *out++ = '0';
 
 out+=itostr(out,b);
 
 *out++ = '.';
 *out++ = 'c';
 *out++ = 'u';
 *out++ = 't';
 *out++ = '\0';

}


/* ************************************************************************* */
/*    Main   */
/* --------- */ 

main(int argc, char **argv)
{
 
 /* ########################## Declarations ################### */
 FILE *infile,*outfile;
 unsigned long TailleFin,bloc,nbdisk,dernier;
 char Tab[8];                                 /* pour recuperer la taille du
                                                 fichier a couper */
 char *outname, *baseout;
 int i;
 char Tmp;
 char Buff[TAILLEBLOC];


 outname = (char *)malloc(90*sizeof(char));
 baseout = (char *)malloc(85*sizeof(char));


 /* ################# Parametres en ligne de commande ##################### */

 if (argc == 2)
   strcpy(baseout,argv[1]);
 /* ## Base du nom de destination */

 /* ## Tar du repertoire (c'est mieux pour conserver les noms) */
 system("tar -cf RCt3G42.4G6 *");

 /* ## Recupere la taille du fichier a decouper */
  system("ls -l RCt3G42.4G6 > 34F32245.5D");
  infile = fopen("34F32245.5D","r");
  fseek(infile,33,0);
  Tmp = getc(infile);
   while ( Tmp == 32 )
    {
     Tmp = getc(infile);
    }

    /* Initialise la taille a zero */
   /*    for (i = 0; i <8; i++)
     Tab[i] = 0;*/
 
    i = 0;
    while ( (i < 8) && (Tmp != 32))
     {
      Tab[i] = Tmp;
      i++;
      Tmp = getc(infile);
     }
    fclose(infile); 
   unlink("34F32245.5D");
 
   TailleFin = atoi(Tab);
 
  /* ## Calcul du nombre de fichiers */

  nbdisk = 0;
  nbdisk = TailleFin/TFICHIER;
  dernier = TailleFin % TFICHIER;


 infile = fopen("RCt3G42.4G6","rb");

 bloc = 1;            
 while (bloc <= nbdisk)
   {
    if (argc == 2)
      getname(outname,baseout,bloc);
     else
      getname(outname,FNAME,bloc);

    outfile = fopen(outname,"wb");
    for (i = 1; i <= NBLOCS; i++)
       {
        fread(&Buff,TAILLEBLOC,1,infile);
        if (ferror(infile))
           fprintf(stderr,"Error reading file :\n%s",strerror(errno));
        fwrite(&Buff,TAILLEBLOC,1,outfile); 
        if (ferror(outfile))
           fprintf(stderr,"Error writing file :\n%s",strerror(errno));
       }
    fclose(outfile);
    bloc++;
   }      

  /* copie de ce qui reste */
  if (dernier != 0)
   {
    if (argc == 2)
      getname(outname,baseout,bloc);
     else
      getname(outname,FNAME,bloc);  

    outfile = fopen(outname,"wb");
    nbdisk = dernier/TAILLEBLOC;
    dernier = dernier % TAILLEBLOC;
    bloc = 1;
    while (bloc <=nbdisk)
     {
      fread(&Buff,TAILLEBLOC,1,infile);
      if (ferror(infile))
          fprintf(stderr,"Error reading file :\n%s",strerror(errno));
      fwrite(&Buff,TAILLEBLOC,1,outfile);
      if (ferror(outfile))
          fprintf(stderr,"Error writing file :\n%s",strerror(errno));
     bloc++;
     }
     if (dernier!=0)
      {
       fread(&Buff,dernier,1,infile);
      if (ferror(infile))
          fprintf(stderr,"Error reading file :\n%s",strerror(errno));
       fwrite(&Buff,dernier,1,outfile);
     if (ferror(outfile))
          fprintf(stderr,"Error writing file :\n%s",strerror(errno));
      }
    fclose(outfile);
   }
 fclose(infile);

 unlink("RCt3G42.4G6");
} 




