/* Fonction principale */ int main(int argc, char **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) { (void) fprintf(stderr, usage, argv[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(lines, size * 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(lines, n, sizeof(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; } |