/* Fonction principale */
int main(int argcchar **argv) {
  char *usage =
    "Usage: %s <file>\n";  /* Usage */
  char **lines;            /* Tableau de lignes */
  int size = INITIAL_SIZE/* Taille du tableau de lignes */
  int n = 0;               /* Nombre de lignes déjà lues */
  char *line;              /* Ligne courante */
  long fsize;              /* Taille du fichier */
  char *map_start;         /* Début de la zone référençant le fichier */
  char *end;               /* Adresse de fin du fichier initial */
  int i;                   /* Indice de travail */
  /* Vérification du nombre d'arguments */
  if (argc != 2) {
    (voidfprintf(stderrusageargv[0]);
    return EXIT_FAILURE;
  }
  /* Allocation initiale du tableau de lignes */
  lines  = (char **) malloc(size * sizeof(char*));
  if (lines == NULL) {
    fprintf(stderr,"No more memory available\n");
    return EXIT_FAILURE;
  }
  /* Référencement du fichier en mémoire et récupération de sa taille */
  map_start = (char *) map_file(argv[1], &fsize);
  if (map_start == NULL ) {
    fprintf(stderr"Abort\n");
    return EXIT_FAILURE;
  }
  /* Calcul du pointeur correspondant à la fin de fichier */
  end = map_start + fsize;
  /* Lecture des lignes du fichiers */
  line = map_start;
  do {
    /* Vérification qu'il y a assez de place dans le tableau de lignes */
    if (n == size) {
      size *= 2;
      lines = (char**) realloc(linessize * sizeof(char*));
      if (lines == NULL ) {
        fprintf(stderr"Abort\n");
        return EXIT_FAILURE;
      }
    }
    lines[n] = line;
    n++;
  } while ((line = next_line(line,end)) < end);
  /* Trier les lignes. */
  qsort(linesnsizeof(char*), map_strcmp);

  /* Afficher les lignes triees. */
  for (i = 0 ; i < n ; ++i) {
    printf("%s\n",lines[i]);
  }
  (void)fflush(stdout);
  if (munmap(map_start,fsize) < 0) {
    perror("munmap");
    return EXIT_FAILURE;
  }
  return EXIT_SUCCESS;
}