/*----------------------------------------------------------------
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;
}