/*---------------------------------------------------------------- myls Il programma e' un'implementazione del comando ls. Vengono li- stati tutti i file presenti nella directory da dove il programma viene lanciato. Non vengono listati i 2 dot files d'ordinanza (. e ..). La directory path (1^ parametro) viene scorsa; per ogni entry trovata viene invocata la funzione passata come 3^ parametro. Tale funzione restituisce 0 (zero) oppure 1 (uno). Nel secondo caso il file viene accettato. I file che superano il test vengono ordinati tramite la funzione alphasort (4^ parametro) e memoriz- zati in un array apposito (2^ parametro). La funzione alphasort e' predefinita e dovrebbe basarsi sull'algoritmo Boyer-Moore, particolarmente efficiente nell'ordinare stringhe. La funzione puo' essere sostituita con una propria ma operativamente equiva- lente. Configurazione La variabile d'ambiente LS_VERB se posta a yes oppure si oppure 1 provoca la stampa della directory di partenza e del numero totale dei files. In caso contrario oppure in sua mancanza tali stampe vengono soppresse. Messaggistica punto partenza errato scandir errata autoesplicativo ----------------------------------------------------------------*/ #include <dirent.h> #include <regex.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/dir.h> #include <sys/param.h> #include <sys/stat.h> #include <sys/types.h> #include <time.h> #include <unistd.h> #define False 0 #define True !False int main (void) { char *p, path [MAXPATHLEN]; int count, i, (*pf)(), scegli (struct direct *), stampa; extern int match (char *, char *, regmatch_t *); regmatch_t pmatch; void prtdate (time_t); struct direct **entry; if (getcwd (path, MAXPATHLEN) == NULL) { fprintf (stderr, "punto partenza errato\n"); exit (EXIT_FAILURE); } p = getenv ("LS_VERB"); if (p == NULL) stampa = 0; else stampa = match (p, "[yY][eE][Ss]|[Ss][iI]|^1$", &pmatch); pf = scegli; if (stampa) printf ("dove sono: %s\n", path); count = scandir (path, &entry, pf, alphasort); if (count < 0) { fprintf (stderr, "scandir errata\n"); exit (EXIT_FAILURE); } else { if (stampa) printf ("numero file: %d\n", count); for (i = 0; i < count; i++) printf ("%s\n", entry[i]->d_name); } exit (EXIT_SUCCESS); } int scegli (struct direct *riga) { if (!strcmp (riga->d_name, ".") || !strcmp (riga->d_name, "..")) return False; else return True; }