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