#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAXLIGNE 1024
#define MAX 32

typedef char CHAINE[MAX];

typedef struct pers_ {
  CHAINE nom, prenom;
  char sexe;
  int  jour, mois, an;
  struct pers_ *pere, *mere;
} PERSONNE;

typedef struct ens_ {
    PERSONNE * premier;
  struct ens_* reste;
} ENRENS, *ENSEMBLE;


PERSONNE * persligne( char ligne[MAX], CHAINE np, CHAINE nm, CHAINE pp, CHAINE pm )
{ PERSONNE * res;
  CHAINE n, p;
  char s;
  int j, m, a;
  if ( sscanf(ligne, "%s %s %c %d %d %d %s %s %s %s", p, n, &s, &j, &m, &a, pp, np, pm, nm) != 10 )
     return NULL;
  res = ( PERSONNE * ) malloc( sizeof(PERSONNE) );
  strcpy(res->nom, n);
  strcpy(res->prenom, p); 
  res->sexe = s;
  res->jour = j;
  res->mois = m;
  res->an   = a;
  res->pere = NULL;
  res->mere = NULL;
  return res;
}

void printpers( PERSONNE * p )
{
  printf("\n%s %s %c %d %d %d", p->prenom, p->nom, p->sexe, p->jour, p->mois, p->an);
  if ( p->pere)
    printf(" %s %s", p->pere->nom, p->pere->prenom);
  else  printf(" * *");
  if ( p->mere)  
    printf(" %s %s", p->mere->nom, p->mere->prenom);  
  else  printf(" * *");
}


void AfficherEnsemble( ENSEMBLE ens)
{ 
  while ( ens ) {
    printpers( ens->premier);
    ens =ens->reste;
    } 
}

PERSONNE * idpers( char *nom, char *pre, ENSEMBLE ens)
{ while ( ens ) {
    if ( strcmp( nom, ens->premier->nom) == 0 )
      if ( strcmp( pre, ens->premier->prenom) == 0 )
	return ens->premier;
    ens = ens->reste;
    } 
  return NULL;
}


ENSEMBLE LireEnsemble( FILE *src) 
{ char ligne[MAXLIGNE];
  CHAINE np, nm, pp, pm;
  PERSONNE *pers, *px;
  ENSEMBLE aux, res = NULL;

  while ( ! feof( src) ) {
      fgets( ligne, MAXLIGNE, src );
      pers = persligne( ligne, np, nm, pp, pm );
      if ( pers ) {
	aux = ( ENSEMBLE) malloc( sizeof(ENRENS) );
	aux->premier = pers;
        aux->reste    = res;
	res = aux;
      } else fgetc( src );
    }

  rewind( src );

  while ( ! feof( src) ) {
      fgets( ligne, MAXLIGNE, src );
      pers = persligne( ligne, np, nm, pp, pm );
      if ( pers ) {
	px = idpers( pers->nom, pers->prenom, res);
	px->pere = idpers( np , pp, res);
	px->mere = idpers( nm , pm, res);
	free( pers );
      } else fgetc( src );
    }

  return res;
}

int main( int argc, char* argv[] )
{
  FILE *src;
  ENSEMBLE ens;
  src = fopen( argv[1] , "r");
  if ( ! src ) {
    printf("\nFichier %s : introuvable!\n", argv[1]);
    return(1);
  }  
  ens = LireEnsemble(src ); 
  AfficherEnsemble( ens );
  fclose(src);
  return 0;
}
