#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

/*------------------------------------------------------------------------
  saisie d'une chaine
------------------------------------------------------------------------*/
char *saisie(void)
{
 char car;
 char *temp;
 int i=0;

 printf("\nSaisie de la chaŒne \n ");

 temp=(char *)malloc(sizeof(char));
 car=getche();
 do
 {
  if (car!=8)
  {
    temp[i]=car;
    i++;
    temp=(char *)realloc(temp,i+1);
  }
  else
  {
    printf(" \x8");
    i--;
    temp=(char *)realloc(temp, i+1);
  }
  car=getche();

 }while(car!=13);

 temp[i]='\0';

return(temp);
}

/*------------------------------------------------------------------------
  cr‚ation du tableau
------------------------------------------------------------------------*/
char **creat_tab(int nb)
{
  int i;
  char **temp;

   temp=(char **)malloc((nb+1)*sizeof(char *));

   for (i=0;i<nb;i++)
       temp[i]=saisie();

   temp[nb]=NULL;
   return(temp);
}

/*------------------------------------------------------------------------
  affiche le tableau
------------------------------------------------------------------------*/
void aff_tab(char **tab)
{
 int i=0,j=0;

do{
 j=0;
       do{
	 putch(tab[i][j]);
	 j++;

       }while(tab[i][j]!='\0');
 i++;
 printf("\n");
}while(tab[i]!=NULL);
}

/*------------------------------------------------------------------------
  libŠre la m‚moire allou‚e au tableau
------------------------------------------------------------------------*/
void libre( char **tab)
{
 int i=0;

 do
 {
  free(tab[i]);
  i++;
 }
 while(tab[i]!=NULL);

 free(tab);
}

/*------------------------------------------------------------------------
  supprime un caractŠre dans une chaine
------------------------------------------------------------------------*/
char *suppr_car(char *chaine, char a_sup)
{
int i=0,j;
int longueur;
longueur=strlen(chaine);

do{

   if (chaine[i]==a_sup)
    {
      longueur--;
      for (j=i;j<=longueur;j++)
      {
       chaine[j]=chaine[j+1];
      }
    }
     else
	 i++;

   }while(chaine[i]!='\0');
  chaine=(char *)realloc(chaine,longueur);
  return chaine;
}

/*------------------------------------------------------------------------
  supprime un caractŠre dans toutes les chaines du tableau
------------------------------------------------------------------------*/
void eff_car_tab(char ***tab, char a_sup)
{
  int i=0;

  do
  {
    (*tab)[i]=suppr_car((*tab)[i], a_sup);
    i++;
  }while ((*tab)[i]!=NULL);
}

/*------------------------------------------------------------------------
  double un caractŠre dans une chaine
------------------------------------------------------------------------*/
char *double_car(char *chaine, char a_dbl)
{
  int i=0, j, longueur;

  do
  {
    longueur=strlen(chaine);
    if ((chaine[i]&223)==(a_dbl&223))
    {
      chaine=(char *)realloc(chaine, longueur+1);
      for(j=longueur+1;j>i;j--)
	chaine[j]=chaine[j-1];
      i++;
    }
    i++;
  }while(chaine[i]!='\0');

  return chaine;
}

/*------------------------------------------------------------------------
  double un caractŠre dans toutes les chaines du tableau
------------------------------------------------------------------------*/
char **dbl_car_tab(char **tab, char a_dbl)
{
  int i=0;

  do
  {
    tab[i]=double_car(tab[i], a_dbl);
    i++;
  }while (tab[i]!=NULL);
  return tab;
}

/*------------------------------------------------------------------------
  supprime une chaine commen‡ant par un caractŠre donn‚
------------------------------------------------------------------------*/
char **suppr_chaine(char **tab, char cardeb)
{
  int i=0,j;

  do
  {
    if (tab[i][0]==cardeb)
    {
      j=i;
      free(tab[i]);
      do
      {
	tab[j]=tab[j+1];
	j++;
      }while(tab[j]!=NULL);
      tab=(char **)realloc(tab, sizeof(char *)*j);
    }
    else
      i++;
  }while (tab[i]!=NULL);

  return tab;
}


/*------------------------------------------------------------------------
  fonction principale
------------------------------------------------------------------------*/
void main(void)
{
char **tableau, choix, car;
int nb;

  tableau=NULL;

  do
  {
    clrscr();
    printf("---- TP1 -----");
    printf("\n1 - Saisie des chaines (d‚truit le tableau pr‚c‚dent)");
    printf("\n2 - Affichage des chaines");
    printf("\n3 - Suppression d'un caractŠre dans les chaines");
    printf("\n4 - Doublement d'un caractŠre dans les chaines");
    printf("\n5 - Suppression des chaines commen‡ant par un caractŠre");
    printf("\nq - Quitter");
    printf("\n\nVotre choix : ");

    fflush(0);
    choix=getche();
    switch (choix)
    {
      case '1' : printf("\nNombre de chaines … cr‚er : ");
		 scanf("%d", &nb);
		 if (tableau!=NULL)
		   libre(tableau);
		 tableau=creat_tab(nb);
		 break;
      case '2' : printf("\nVoici les chaines entr‚es\n");
		 aff_tab(tableau);
		 getch();
		 break;
      case '3' : printf("\nCaractŠre … supprimer : ");
		 scanf("%c", &car);
		 eff_car_tab(&tableau, car);
		 break;
      case '4' : printf("\nCaractŠre … doubler : ");
		 scanf("%c", &car);
		 tableau=dbl_car_tab(tableau, car);
		 break;
      case '5' : printf("\nIndiquez le caractŠre de d‚but de chaine : ");
		 scanf("%c", &car);
		 tableau=suppr_chaine(tableau, car);
		 break;
      case 'q' :
      case 'Q' : break;
    }
  }while ((choix!='Q')&&(choix!='q'));
  libre(tableau);
}

