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

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

 Fonctionnement : recolle les fichiers coupes avec Cut dont le format est compatible avec la version DOS 
  (un nom, 3 chiffres . cut), puis le detarre.

 A ajouter :
   parametres en ligne de commande : annulation du detarrage et donc entree du nom de sortie,
  effacement des fichiers.
*/


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

#define TAILLEBLOC  30368              /* Taille du buffer */
#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'; 

}


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

main(int argc, char **argv)
{
 
 /* ########################## Declarations ################### */
 FILE *infile,*outfile;
 unsigned long TailleFin,nbblocs,dernier;
 char Tab[8];                                 /* pour recuperer la taille du fichier a coller, et le nombre */
 char *outname, *basename, *sst;
 int i,nbdisk,disk;
 char Tmp;
 char Buff[TAILLEBLOC];

 outname = (char *)malloc(92*sizeof(char));
 basename = (char *)malloc(85*sizeof(char));
 sst = (char *)malloc(120*sizeof(char));


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

 if (argc == 2)
   strcpy(basename,argv[1]);
 else
   strcpy(basename,FNAME);
 /* ## base du nom d'entree */

 /* ## Creation du fichier de sortie */

  outfile = fopen("RCt3G42.4G6","wb");

  /* ## Calcul du nombre de fichiers */
    strcpy(sst,"ls -l ");
    strcat(sst,basename);
    strcat(sst,"???.cut | wc -l > 34F32245.5D");
    system(sst);
    infile = fopen("34F32245.5D","r");
    Tmp = getc(infile);
     while ( Tmp == 32 )
      {
       Tmp = getc(infile);
      }
    i=0;
    while ( (i < 3) && (Tmp != 32))
      {
       Tab[i] = Tmp;
       i++;
       Tmp = getc(infile);
      }
    fclose(infile); 
    unlink("34F32245.5D");
 
    nbdisk = atoi(Tab);

 disk = 1;
 while (disk <(nbdisk+1))
  {
   getname(outname,basename,disk);

   /* ## Recupere la taille du fichier a decouper */
    strcpy(sst,"ls -l ");
    strcat(sst,outname);
    strcat(sst," > 34F32245.5D");
    system(sst);
    infile = fopen("34F32245.5D","r");
    fseek(infile,33,0);
    Tmp = getc(infile);
     while ( Tmp == 32 )
      {
       Tmp = getc(infile);
      }
     i = 0;
     
    /* Remet la taille a zero */
       Tab[0] = 0;

     while ( (i < 8) && (Tmp != 32))
      {
      Tab[i] = Tmp;
       i++;
       Tmp = getc(infile);
      }
    fclose(infile); 
    unlink("34F32245.5D");

    TailleFin = atoi(Tab);

   nbblocs = TailleFin/TAILLEBLOC;
   dernier = TailleFin % TAILLEBLOC;

   infile = fopen(outname,"rb");

   for (i = 1; i <= nbblocs; 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));
     }

   /* copie de ce qui reste */
   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(infile);
   disk++;
 }

 fclose(outfile);

 system("tar -xf RCt3G42.4G6");
unlink("RCt3G42.4G6");
} 




