/* Funcion principal - main()
 *
 * nitr0us
 *
 */

#include"myls.h"

extern int opterr;
extern int alphasort();

int mode= 0;

main(int argc, char **argv){
	struct dirent **dir;	/* $man 3 scandir */
	int opt, nfiles= 0;	/* numero de opcion y numero de archivos */
	opterr= 0;
	/* Esto para que cuando sea una opcion invalida no mande el error de getopt() */

	if( argc == 1 )
		mode|= NORMAL;	/* si solo se dio un parametro, modo=normal */
	else
		while( (opt= getopt(argc,argv,"la")) != EOF )
		/* leemos parametros con getopt(), y le decimos que scannee los parametros 'l' y 'a' */
			switch(opt){
				case 'l':
					mode|= LONG;
				/* si hay 'l' el modo se pone en modo LONG */
					break;
				case 'a':
					mode|= ALL;
				/* si hay 'a' se pone en modo de mostrar TODOS los archivos (incluyendo los que inicien con '.') */
					break;
				default:
					execve("/bin/ls", argv, NULL);
				/* si no se leyeron las opciones 'l' o 'a' mandamos a llamar al verdadero ls y le enviamos los parametros que recibimos en main */
			}

	nfiles= scandir(".", &dir, selector, alphasort);
/* scannea todos los archivos en el directorio actual ("."), guardalos en la estructura apuntada por dir (struct dirent), cada nombre de archivo que leas pasalo por la funcion selector() para ver cual mostrar y cual no y por ultimo ordenalos por nombre con la funcion alphasort() */

	print_ls(nfiles, dir, mode);
/* Por ultimo imprime nfiles, contenidos en la variable dir, y manda el modo de impresion a la funcion print_ls() */

	exit(EXIT_SUCCESS); /* terminar el programa */
}

int selector(struct dirent *filentry){
	if( (mode == NORMAL) || (mode == LONG) )
	/* Si el modo es normal o largo, entra al siguiente if */
		if( (strcmp(filentry->d_name, ".") == 0)
			|| (strcmp(filentry->d_name, "..") == 0)
			|| (filentry->d_name[0] == '.') )
		/* Si el nombre del archivo actual es "." o ".." o la primer letra del nombre del archivo es '.' entonces REGRESA 0 (no se mostrara el archivo) */
			return 0;

	return 1; /* Si el modo no es normal, ni largo, o si los nombres no inician con ".",  ".." o la primer letra del nombre es '.', entonces regresa 1 (mostrar el archivo) */
}

