#include #include #include #include #include #include #include #include #include // necesar pentru PATH_MAX #define SECTOR_SIZE 4096 void reverse(char *sir) { int lg = strlen(sir) - 1; for (int i = 0; i <= lg / 2; i++) { char aux = sir[i]; sir[i] = sir[lg - i]; sir[lg - i] = aux; } } void afiseaza(char *map_addr, int length) { char aux[SECTOR_SIZE] = {0}; for (int i = length - 1; i >= 0; i--) if (map_addr[i] != '\n') { int lg = strlen(aux); aux[lg++] = map_addr[i]; aux[lg] = '\0'; } else { if (strlen(aux) > 0) { reverse(aux); printf("%s\n", aux); } aux[0] = '\0'; } if (strlen(aux) > 0) { reverse(aux); printf("%s\n", aux); } } void recursive(int f, int length, int offset, int PageSize) { int ok = 0; if (length > PageSize) { recursive(f, length - PageSize, offset + PageSize, PageSize); ok = 1; } if (ok == 1) length = PageSize; char *map_addr = mmap(NULL, length, PROT_READ, MAP_PRIVATE, f, offset); afiseaza(map_addr, length); if (munmap(map_addr, length) == -1) { perror("Erroare la munmap."); exit(4); } } void scrieFisier(char *numeFisier) { int f = open(numeFisier, O_RDONLY); if (f == -1) { perror("A aparut o eroare cand am incercat sa deschide fisierul"); exit(2); } long PageSize = sysconf(_SC_PAGE_SIZE); struct stat sb; if (PageSize == -1) { perror("Eroare la sysconf"); exit(1); } if (fstat(f, &sb) == -1) { perror("Eroare la fstat"); exit(2); } recursive(f, sb.st_size, 0, PageSize); } int main(int argc, char **argv) { if (argc < 2) { printf("Introdu numele unui sau mai multor fisiere."); exit(1); } for (int i = 1; i < argc; i++) scrieFisier(argv[i]); printf("\n"); }