commit ba4072119327cde975e2682854c13431848a025a
Author: jdg <jd@infdj.com>
Date:   Wed Sep 8 21:24:42 2021 +0200

    First commit 05/09/1999

diff --git a/JDIR.BAK b/JDIR.BAK
new file mode 100644
index 0000000..8706189
--- /dev/null
+++ b/JDIR.BAK
@@ -0,0 +1,1013 @@
+ /*////////////////////////////////////////////////////////////////////////*\*/
+/*
+///    Nombre:        JDIR    .CPP                                         ///
+///    Modulo:                                                             ///
+///    Descripci�n:   Dir especial, para mostrar en color los archivos     ///
+///                                                                        ///
+///    Autor:    Jos� David Guill�n Dominguez                              ///
+///    Fecha:    06 - 07  - 1995                                           ///
+///              05 - 11  - 1995 ( fixed bugs )                            ///
+///              19 - 12  - 1995 ( re_coded all )                          ///
+///                                                                        ///
+///    Comentario:                                                         ///
+///                                                                        ///
+///                                                                        ///
+///                                                                        ///
+///    Compilador Borland C++ 3.0                                          ///
+*/
+ /* //////////////////////////////////////////////////////////////////////// */
+
+#include <io.h>
+#include <dir.h>
+#include <stdio.h>
+#include <conio.h>
+#include <alloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "Jdirect.h"          /*para funciones de acceso a directorio*/
+
+
+#define  MAXLDIR  90          /*longitud m�xima nombre directorio*/
+
+#define UNA_COLUMNA       1
+#define DOS_COLUMNAS      2
+#define TRES_COLUMNAS     3
+#define CUATRO_COLUMNAS   4
+#define CINCO_COLUMNAS    5
+#define SEIS_COLUMNAS     6
+
+#define POR_TAMANYO       1
+#define POR_NOMBRE        2
+#define POR_EXTENCION     3
+
+
+void Help( void );
+void Que_Color( void );
+void Muestra_Archivos( int Columnas );
+void CargaDatosFich( FileInfo far *fp );
+void informe_final( char Unidad, char tipo );
+void formatea_u_long( unsigned long Numero, char *Inter_Chg );
+
+int Carga_Archivos( char *Comodin, int atr );
+char Rellena_path( char *path, char *half_path );
+int sort_function( const void far *a, const void far *b );
+
+unsigned int Numero_Archivos = 0, Numero_rArchivos = 0;
+unsigned long Espacio_T_consumido, Espacio_Tr_consumido = 0;
+
+char Directorio, oculto;
+FileInfo far *fi, far *fi_TMP, ftmp;
+
+long Longitud, L1, L2;
+char BufferA[13], BufferB[13];
+char Nombre_archivo[13], Extension[5], Fecha_Larga[10], Fecha_Corta[10],
+	HORA[10], ATRIBUTO_L[10], ATRIBUTO_C[6], Columnas;
+int Ordenado;
+char Recursivo = 0, NoPausar = 0, Buffer[255];
+
+// ����������������������������������������������������������������������
+// ����������������������������������������������������������������������
+// ����������������������������������������������������������������������
+// ����������������������������������������������������������������������
+void EsperarTecla(void)
+{
+  if ( !NoPausar )
+  {
+   textcolor(YELLOW);
+   cprintf("< Presione una tecla para continuar >\r");
+   while( !kbhit() ); getch();
+   cprintf("                                     \r");
+  }
+};
+
+
+void RestaurarEntorno()
+{
+ char *p;
+
+ if ( ( p = getenv("JD_DIR") ) == NULL )
+ {
+   Columnas = TRES_COLUMNAS;    Ordenado = POR_NOMBRE;
+ } else {
+   switch( p[0] )
+   {
+    case 'N':         Ordenado = POR_NOMBRE;         break;
+    case 'E':         Ordenado = POR_EXTENCION;      break;
+    case 'S':         Ordenado = POR_TAMANYO;        break;
+    default:          Ordenado = POR_NOMBRE;         break;
+   }
+   if ( ( p[1] - '0' ) > 0 && ( p[1] - '0' ) <= 6 ) Columnas = ( p[1] - '0' );
+ }
+};
+
+int ProcesarLineaComandos( int argc, char *argv[] )
+{
+ char i, cont;  /* Contador de par�metro   */
+
+    cont = 0;
+    for(i = 1; i != argc; i++)
+	if ( *argv[i] == '/' ) /* Comandos internos   */
+	 {
+	  if ( *(argv[i]+1) >= '1' && *(argv[i]+1) <= '6' ) Columnas  = *(argv[i]+1) - '0';
+	  if ( *(argv[i]+1) == 'e' || *(argv[i]+1) == 'E' ) Ordenado  = POR_EXTENCION;
+	  if ( *(argv[i]+1) == 's' || *(argv[i]+1) == 'S' ) Ordenado  = POR_TAMANYO;
+	  if ( *(argv[i]+1) == 'r' || *(argv[i]+1) == 'R' )
+          {
+            Recursivo = 1;
+  	    if ( *(argv[i]+2) == 'c' || *(argv[i]+1) == 'C' )
+                        NoPausar = 1;
+          }
+	  if ( *(argv[i]+1) == 'c' || *(argv[i]+1) == 'C' ) NoPausar = 1;
+	  if ( *(argv[i]+1) == '?' ) { Help(); return -1; }
+	  cont++;
+	 }
+   if ( argc == 1 ) argc = 2; else
+   if ( cont == argc -1 ) { strcpy( argv[1], "*.*"); }
+
+   return argc;
+};
+
+
+void MuestraDirectorio( char *path )    // DEBE SER UN PATH COMPLETO
+{
+ int Entrada, i;
+
+ textcolor(CYAN);  cprintf("Path: %s\r\n", path );
+ if ( Carga_Archivos( path, 0xF7 ) != -1 )
+ {
+    qsort((void *)fi, Numero_Archivos, sizeof(FileInfo), sort_function);
+    Muestra_Archivos( Columnas );           informe_final( path[0]-'A' ,  0);
+    Espacio_Tr_consumido += Espacio_T_consumido; Numero_rArchivos += Numero_Archivos;
+  }
+
+ if ( Recursivo )
+ {
+   // BEGIN 05-10-99
+   fnsplit(path,ATRIBUTO_C,Buffer,Nombre_archivo,Extension);
+   fnmerge(path,ATRIBUTO_C,Buffer,"*","*");
+   // END 05-10-99
+   if ( Carga_Archivos( path, 0x10 ) == -1 )  return;
+   if ( strcmp( fi[1].name, ".." ) == 0 )  Entrada = 2; else Entrada = 0;
+   for( ; Entrada < Numero_Archivos; Entrada++)
+   {
+                                     // BEGIN 05-10-99 (NULL,NULL)
+     fnsplit(path,ATRIBUTO_C,Buffer, NULL,NULL ); //Nombre_archivo,Extension);
+                                     // END 05-10-99
+     strcat( Buffer, fi[Entrada].name );
+     fnmerge(path,ATRIBUTO_C,Buffer,Nombre_archivo,Extension);
+                              EsperarTecla();
+                              MuestraDirectorio( path );
+                                     // BEGIN 05-10-99 (NULL,NULL)
+     fnsplit(path,ATRIBUTO_C,Buffer, NULL, NULL );//Nombre_archivo,Extension);
+                                    // END 05-10-99
+     i = strlen( Buffer );
+     while ( i > 1 && Buffer[--i] != '\\' );
+     if ( Buffer[i-1] != '\0' ) while ( i > 1 && Buffer[--i] != '\\' ); Buffer[i] = '\0';
+     fnmerge(path,ATRIBUTO_C,Buffer,Nombre_archivo,Extension);
+
+     if ( Carga_Archivos( path, 0x10 ) == -1 )  return;
+    }
+ }
+};
+
+
+/********************************************************************
+ * main
+ ********************************************************************/
+void main(int argc, char *argv[])
+{
+ char i, path[255];
+
+ highvideo();	 textcolor(YELLOW);    cprintf("\r\nJD_Dir\r\n");
+
+ RestaurarEntorno();
+ argc = ProcesarLineaComandos( argc, argv );
+
+  for(i = 1; i < argc; i++)
+	if ( *argv[i] != '/' ) // Filtramos los comandos internos
+        {
+          Rellena_path( path, argv[i] );
+          MuestraDirectorio( path );
+          informe_final( path[0]-'A',  1);
+        }
+
+}
+ /*����������������������������������������������������������������������*/
+
+ /*����������������������������������������������������������������������*/
+ /*����������������������������������������������������������������������*/
+
+ /*����������������������������������������������������������������������*/
+
+int Carga_Archivos(char *Comodin, int atr )
+{
+ int contador;
+
+ farfree(fi);
+ if( (fi = (FileInfo far *)farcalloc(50, sizeof(FileInfo) )) == NULL )
+ {
+	  textcolor(BLUE); cprintf("\r\nError buscando memoria.\r\n");
+	  normvideo();     textcolor(LIGHTGRAY);               return -1;
+ }
+
+ Espacio_T_consumido = 0;
+ Numero_Archivos = contador = 0;
+
+if ( findfirst(Comodin, &ftmp, atr) != 0)
+{
+	textcolor(LIGHTGREEN);	cprintf("Fichero/s no encontrado/s\n\r");
+	textcolor(LIGHTGRAY);
+	cprintf("\r\n");	return -1;
+}
+
+    {
+	fi[Numero_Archivos] = ftmp;
+	Numero_Archivos++;
+	while (findnext(&ftmp) == 0)
+        {
+          if ( atr != 0x10 || ftmp.atrib & atr )
+          {
+		fi[Numero_Archivos] = ftmp;
+		Numero_Archivos++;
+		contador++;
+		if(contador==49)
+                {
+		 if( ( fi = (FileInfo far *)farrealloc(fi, sizeof(FileInfo)*(Numero_Archivos + 50) ) )==NULL )
+                 {
+		    textcolor(BLUE);		    cprintf("\r\nError buscando memoria.\r\n");
+		    normvideo();		    textcolor(WHITE);
+		    return -1;
+		 }
+		 contador = 0;
+		}
+          }
+	}
+
+    }
+    return 0;
+}
+
+void Muestra_Archivos( int Columnas )
+{
+
+int i, lineas = 0, PartCol;
+//char Buffer[80];
+textcolor(BLUE);
+
+switch( Columnas )
+{
+ case 1:
+	cprintf("��������������������������������������������������������������������������������");
+	for(i=0; i < Numero_Archivos; i++)
+	{
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf("   <dir>    ");
+		 else
+		 {
+		  textcolor(YELLOW);    formatea_u_long( (unsigned long) Longitud, Buffer );
+					cprintf(" %11s",  Buffer );
+		 }
+		textcolor(CYAN);        cprintf("  %s  ",   Fecha_Larga);
+		textcolor(LIGHTBLUE);   cprintf("%s",   HORA);
+		textcolor(BLUE);        cprintf("%s\r\n",   ATRIBUTO_L);
+		lineas++;
+		if(lineas==21)
+                {
+                        EsperarTecla();
+                        lineas = 0;
+                }
+	}
+	textcolor(BLUE);
+	cprintf("��������������������������������������������������������������������������������");
+	break;
+
+ case TRES_COLUMNAS:
+
+	cprintf("��������������������������������������������������������������������������������");
+
+	PartCol = (Numero_Archivos/3);
+	PartCol += ( ( Numero_Archivos - (PartCol*3) )!=0 ? 1: 0 );
+ 	for(i=0; i < PartCol; i++)
+	{
+/*             /////////////////////// Columna 1*/
+	       if ( i < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf("    <dir>    "); else
+		{
+		  textcolor(YELLOW);    formatea_u_long( (unsigned long) Longitud, Buffer );
+					cprintf(" %11s ",  Buffer );
+		}
+	       }
+/*             /////////////////////// Columna 2*/
+	       if( (i+PartCol) < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i+PartCol]);
+		textcolor(BLUE);        cprintf("�");
+		Que_Color();            cprintf(" %s",   Nombre_archivo);
+		if( Directorio )        cprintf("    <dir>    "); else
+		{
+		  textcolor(YELLOW);    formatea_u_long( (unsigned long) Longitud, Buffer );
+					cprintf(" %11s ",  Buffer );
+		}
+/*                      /////////////////////// Columna 3*/
+			if( (i+(PartCol*2)) < Numero_Archivos )
+			{
+			 CargaDatosFich(&fi[i+(PartCol*2)]);
+			 textcolor(BLUE);       cprintf("�");
+			 Que_Color();           cprintf(" %s",   Nombre_archivo);
+			 if( Directorio )       cprintf("    <dir>    \r\n"); else
+			 {
+			  textcolor(YELLOW);    formatea_u_long( (unsigned long) Longitud, Buffer );
+						cprintf(" %11s\r\n",  Buffer );
+			 }
+			} else {                textcolor(BLUE); cprintf("�\r\n"); }
+	       } else {                         textcolor(BLUE);
+						strcpy( BufferA, "�                          �\r\n");
+						cprintf("%s", BufferA);
+	       }
+
+	       lineas++;
+	       if(lineas==21)
+	       {
+EsperarTecla();
+lineas = 0;
+
+/*
+			cprintf("< Presione una tecla para continuar >");
+			while( !kbhit() );  getch(); lineas = 0;
+			cprintf("\r\n");
+*/
+	       }
+	}
+	textcolor(BLUE);
+	cprintf("��������������������������������������������������������������������������������");
+	break;
+
+ case CUATRO_COLUMNAS:
+
+	cprintf("��������������������������������������������������������������������������������");
+
+	PartCol = (Numero_Archivos/4);
+	PartCol += ( ( Numero_Archivos - (PartCol*4) )!=0 ? 1: 0 );
+	for(i=0; i < PartCol; i++)
+	{
+/*             /////////////////////// Columna 1*/
+	       if ( i < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf(" <dir> "); else
+		{
+		  textcolor(YELLOW);    cprintf("% 7ld",  Longitud );
+		}
+	       }
+/*             /////////////////////// Columna 2*/
+	       if( (i+PartCol) < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i+PartCol]);
+		textcolor(BLUE);        cprintf("�");
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf(" <dir> "); else
+		{
+		  textcolor(YELLOW);    cprintf("% 7ld",  Longitud );
+		}
+/*                      /////////////////////// Columna 3*/
+			if( (i+(PartCol*2)) < Numero_Archivos )
+			{
+			 CargaDatosFich(&fi[i+(PartCol*2)]);
+			 textcolor(BLUE);       cprintf("�");
+			 Que_Color();           cprintf("%s",   Nombre_archivo);
+			 if( Directorio )       cprintf(" <dir> "); else
+			 {
+			  textcolor(YELLOW);    cprintf("% 7ld",  Longitud );
+			 }
+/*                       /////////////////////// Columna 4 */
+			 if( (i+(PartCol*3)) < Numero_Archivos )
+			 {
+			   CargaDatosFich(&fi[i+(PartCol*3)]);
+			   textcolor(BLUE);       cprintf("�");
+			   Que_Color();         cprintf("%s",   Nombre_archivo);
+			   if( Directorio )       cprintf(" <dir> \r\n"); else
+			   {
+			    textcolor(YELLOW);  cprintf("% 7ld\r\n", Longitud );
+			   }
+			 } else {               textcolor(BLUE); cprintf("�\r\n"); }
+
+			} else {                textcolor(BLUE);
+						cprintf("� 		    �		    �\r\n");
+			}
+	       } else {                         textcolor(BLUE);
+						cprintf("�                   �                   �               \r\n");
+	       }
+
+	       lineas++;
+	       if(lineas==21)
+	       {
+EsperarTecla();
+lineas = 0;
+
+/*
+ 			cprintf("< Presione una tecla para continuar >");
+			while( !kbhit() );  getch(); lineas = 0;
+			cprintf("\r\n");
+*/
+	       }
+	}
+	textcolor(BLUE);
+	cprintf("��������������������������������������������������������������������������������");
+	break;
+
+ case CINCO_COLUMNAS:
+	cprintf("��������������������������������������������������������������������������������");
+
+	PartCol = (Numero_Archivos/5);
+	PartCol += ( ( Numero_Archivos - (PartCol*5) )!=0 ? 1: 0 );
+	for(i=0; i < PartCol; i++)
+	{
+/*             /////////////////////// Columna 1     */
+	       if ( i < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf(" D"); else cprintf("  ");
+	       }
+/*                /////////////////////// Columna 2*/
+		  if( (i+PartCol) < Numero_Archivos )
+		  {
+		   CargaDatosFich(&fi[i+PartCol]);
+		   textcolor(BLUE);        cprintf("�  ");
+		   Que_Color();         cprintf("%s",   Nombre_archivo);
+		   if( Directorio )        cprintf(" D"); else cprintf("  ");
+/*                    /////////////////////// Columna 3*/
+		      if( (i+(PartCol*2)) < Numero_Archivos )
+		      {
+		       CargaDatosFich(&fi[i+(PartCol*2)]);
+		       textcolor(BLUE);       cprintf("�  ");
+		       Que_Color();             cprintf("%s",   Nombre_archivo);
+		       if( Directorio )       cprintf(" D"); else cprintf("  ");
+/*                        /////////////////////// Columna 4*/
+			  if( (i+(PartCol*3)) < Numero_Archivos )
+			  {
+			    CargaDatosFich(&fi[i+(PartCol*3)]);
+			    textcolor(BLUE);       cprintf("�  ");
+			    Que_Color();            cprintf("%s",   Nombre_archivo);
+			    if( Directorio )       cprintf(" D"); else cprintf("  ");
+
+/*                           /////////////////////// Columna 5*/
+			     if( (i+(PartCol*4)) < Numero_Archivos )
+			     {
+			      CargaDatosFich(&fi[i+(PartCol*4)]);
+			      textcolor(BLUE);       cprintf("�  ");
+			      Que_Color();          cprintf("%s",   Nombre_archivo);
+			      if( Directorio )       cprintf(" D\r"); else cprintf("  \r");
+			     } else {           textcolor(BLUE); cprintf("�\r\n"); }
+			   } else {             textcolor(BLUE);
+						cprintf("�                �\r\n");
+						}
+			} else {                textcolor(BLUE);
+						cprintf("�                �                �\r\n");
+						}
+	       } else {                         textcolor(BLUE);
+						cprintf("�                �                �                �\r\n");
+						}
+
+	       lineas++;
+	       if(lineas==21)
+	       {
+EsperarTecla();
+lineas = 0;
+/*
+			cprintf("< Presione una tecla para continuar >");
+			while( !kbhit() );  getch(); lineas = 0;
+			cprintf("\r\n");
+*/
+	       }
+	}
+	textcolor(BLUE);
+	cprintf("��������������������������������������������������������������������������������");
+	break;
+
+ case SEIS_COLUMNAS:
+/*      //        12345678.123 12345678.123 12345678.123 12345678.123 12345678.123 12345678.123*/
+	cprintf(" ������������ ������������ ������������ ������������ ������������ ������������\r\n");
+
+	PartCol = (Numero_Archivos/6);
+	PartCol += ( ( Numero_Archivos - (PartCol*6) )!=0 ? 1: 0 );
+	for(i=0; i < PartCol; i++)
+	{
+/*             /////////////////////// Columna 1             */
+	       if ( i < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf(" %s",   Nombre_archivo);
+	       }
+/*                /////////////////////// Columna 2*/
+		  if( (i+PartCol) < Numero_Archivos )
+		  {
+		   CargaDatosFich(&fi[i+PartCol]);
+		   Que_Color();         cprintf(" %s",   Nombre_archivo);
+/*                    /////////////////////// Columna 3      */
+		      if( (i+(PartCol*2)) < Numero_Archivos )
+		      {
+		       CargaDatosFich(&fi[i+(PartCol*2)]);
+		       Que_Color();             cprintf(" %s",   Nombre_archivo);
+/*                        /////////////////////// Columna 4*/
+			  if( (i+(PartCol*3)) < Numero_Archivos )
+			  {
+			    CargaDatosFich(&fi[i+(PartCol*3)]);
+			    Que_Color();            cprintf(" %s",   Nombre_archivo);
+/*                           /////////////////////// Columna 5*/
+			     if( (i+(PartCol*4)) < Numero_Archivos )
+			     {
+			      CargaDatosFich(&fi[i+(PartCol*4)]);
+			      Que_Color();          cprintf(" %s",   Nombre_archivo);
+/*                            /////////////////////// Columna 6*/
+			      if( (i+(PartCol*5)) < Numero_Archivos )
+			      {
+			       CargaDatosFich(&fi[i+(PartCol*5)]);
+			       Que_Color();         cprintf(" %s",   Nombre_archivo);
+			      }
+			     }
+			   }
+			}
+	       }
+	       cprintf("\r\n");
+	       lineas++;
+	       if(lineas==21)
+	       {
+                EsperarTecla();
+                lineas = 0;
+	       }
+	}
+	textcolor(BLUE);
+	cprintf(" ������������ ������������ ������������ ������������ ������������ ������������");
+	break;
+
+ default:
+	break;
+
+ }
+
+
+}
+
+
+    /********************************************************************\
+   |*           MuestraDatosFich: datos sobre el fichero *fi.            *|
+    \********************************************************************/
+void CargaDatosFich(FileInfo far *fp)
+{
+    static char *meses[] = { "Ene", "Feb", "Mar", "Abr", "May", "Jun",
+			     "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" };
+    char n[13];  /*nombre*/
+    char s[4];   /*y sufijo*/
+    char *p;
+
+    /*_f*/strcpy(n,fp->name);                             /*copia nombre <2>*/
+    s[0] = 0;                                       /*ning�n sufijo*/
+    p = strchr(n,'.');                              /*busca separador*/
+    if (p != NULL && p > n) {                       /*si lo encuentra <3>*/
+	*p = 0;                                     /*termina nombre en n[]*/
+	strcpy(s,p+1);                              /*y copia sufijo*/
+    }
+sprintf(Nombre_archivo, "%-9s%-3s",n,s);
+sprintf(Extension, "%s", s);
+
+    if (fp->atrib & FA_DIREC) {                     /*si directorio <4>*/
+    Directorio = 1;
+    } else {                                        /*si fichero normal*/
+
+    Directorio = 0;
+    Longitud = fp -> size;
+    Espacio_T_consumido += Longitud;
+    }
+
+
+   if( fp->date.month-1 >=1 && fp->date.month-1 <= 12 )
+    sprintf(Fecha_Larga, "%2d %3s %2d",fp->date.day,           /*muestra fecha <6>*/
+	   meses[fp->date.month-1],fp->date.year+80);
+
+   if( fp->date.month-1 >=1 && fp->date.month-1 <= 12 )
+    sprintf(Fecha_Corta, "% 2d-% 2d-% 2d",fp->date.day,           /*muestra fecha <6>*/
+	     fp->date.month,fp->date.year+80);
+
+
+     sprintf(HORA, "%2d:%02d:%02d   ",fp->time.hours,     /*muestra hora*/
+	   fp->time.min,fp->time.sec*2);
+
+    if (fp->atrib & FA_SYSTEM) {                    /*muestra atributos <7>*/
+	strcpy(ATRIBUTO_L, "System ");
+	strcpy(ATRIBUTO_C, "S");
+    } else {
+		strcpy(ATRIBUTO_L, "       ");
+		strcpy(ATRIBUTO_C, " ");
+	    }
+
+    if (fp->atrib & FA_HIDDEN) {
+	strcpy(ATRIBUTO_L, "Oculto ");
+	strcpy(ATRIBUTO_C, "O");
+	oculto = 1;
+    } else {
+		oculto = 0;
+		strcpy(ATRIBUTO_L, "       ");
+		strcpy(ATRIBUTO_C, " ");
+	    }
+    if (fp->atrib & FA_RDONLY) {
+	strcpy(ATRIBUTO_L, "Protegido ");
+	strcpy(ATRIBUTO_C, "P");
+    }
+
+}
+
+
+
+
+void Que_Color(void)
+{
+
+/*// Todo lo que este oculto*/
+ if ( oculto )                     { textcolor(GREEN); return; }
+/*// Directorios*/
+ if ( Directorio )                 { textcolor(LIGHTMAGENTA); return; }
+/*// Ejecutables *.BAT dee proceso por Lotes*/
+ if ( !strcmpi(Extension, "BAT") ) { textcolor(RED); return; }
+/*// Ejecutables *.EXE*/
+ if ( !strcmpi(Extension, "EXE") ) { textcolor(LIGHTCYAN); return; }
+/*// Ejecutables  *.COM*/
+ if ( !strcmpi(Extension, "COM") ) { textcolor(LIGHTGREEN); return; }
+
+/* //Texto*/
+ if ( !strcmpi(Extension, "TXT") ) { textcolor(WHITE); return; }
+ if ( !strcmpi(Extension, "DOC") ) { textcolor(WHITE); return; }
+/*// Texto con formatos especiales*/
+ if ( !strcmpi(Extension, "WRI") ) { textcolor(WHITE); return; }
+ if ( !strcmpi(Extension, "WPC") ) { textcolor(WHITE); return; }
+ if ( !strcmpi(Extension, "RTF") ) { textcolor(WHITE); return; }
+
+/*// M�sica*/
+ if ( !strcmpi(Extension, "MID") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "MOD") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "VOC") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "CMF") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "WAV") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "S3M") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "MP1") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "MP2") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "MP3") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "QPV") ) { textcolor(BLUE); return; }
+
+/* // Imagenes y videos*/
+ if ( !strcmpi(Extension, "FLI") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "FLC") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "MPG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "MOV") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "AVI") ) { textcolor(MAGENTA); return; }
+
+ if ( !strcmpi(Extension, "CEL") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "PNG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "PCX") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "GIF") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "JPG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "LBM") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "TGA") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "DIB") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "MAC") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "WPG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "BMP") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "PIC") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "RLE") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "CUT") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "TIF") ) { textcolor(MAGENTA); return; }
+
+/* // Lenguajes*/
+ if ( !strcmpi(Extension, "C") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "CPP") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "C++") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "PAS") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "ASM") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "VBX") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "LIB") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "BAS") ) { textcolor(BROWN); return; }
+
+/*// Compresores*/
+ if ( !strcmpi(Extension, "ZIP") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "ARJ") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "ARC") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "AIN") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "LZH") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "TGZ") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "RAR") ) { textcolor(LIGHTBLUE); return; }
+
+/*
+ if ( !strcmpi(Extension, "") ) { textcolor(); return; }
+ if ( !strcmpi(Extension, "") ) { textcolor(); return; }
+ if ( !strcmpi(Extension, "") ) { textcolor(); return; }
+*/
+
+ textcolor(LIGHTGRAY);
+}
+/*
+//
+//                       �  �     ����    �       ����
+//                       �  �     �       �       �   �
+//                       ����     ���     �       ����
+//                       �  �     �       �       �
+//                       �  �     ����    ����    �
+*/
+void Help(void)
+{
+ int i;
+
+	clrscr();       textcolor(WHITE); textbackground(BLUE);
+
+	cprintf("Copyright (c) J.D. Soft.  1994-98. Jos� David Guill�n Dominguez... JD_DIR  v�2.5");
+	textbackground(BLACK);
+
+  textcolor(LIGHTBLUE);
+  for ( i=2; i<12; i++ )
+  {
+    gotoxy(1,i); cprintf("�"); gotoxy(80,i); cprintf("�");
+  }
+  textcolor(BLUE);       gotoxy(1,12); cprintf("�"); gotoxy(80,12); cprintf("�");
+  textcolor(LIGHTBLUE);
+                         gotoxy(1,13); cprintf("�"); gotoxy(80,13); cprintf("�");
+                         gotoxy(1,14); cprintf("�"); gotoxy(80,14); cprintf("�");
+  textcolor(BLUE);
+                         gotoxy(1,15); cprintf("�"); gotoxy(80,15); cprintf("�");
+                         gotoxy(1,16); cprintf("�"); gotoxy(80,16); cprintf("�");
+  textcolor(LIGHTBLUE);  gotoxy(1,17); cprintf("�"); gotoxy(80,17); cprintf("�");
+  textcolor(BLUE);
+  for ( i=18; i<22; i++ )
+  {
+    gotoxy(1,i); cprintf("�"); gotoxy(80,i); cprintf("�\r\n");
+  }
+                         gotoxy(1,23); cprintf("�"); gotoxy(80,23); cprintf("�");
+
+  textcolor(DARKGRAY); gotoxy(60,15); cprintf("   �       ��  �  � ");
+                       gotoxy(60,16); cprintf("        ��   �  �  �");
+                       gotoxy(60,17); cprintf(" �   ��   �   ������");
+                       gotoxy(60,18); cprintf(" ���   �   ���������");
+                       gotoxy(60,19); cprintf("��  �   ������������");
+                       gotoxy(60,20); cprintf("  ��  ��������������");
+                       gotoxy(60,21); cprintf("���  ���������������");
+                       gotoxy(60,22); cprintf("    ��������������  ");
+                       gotoxy(60,23); cprintf("�� �������������     ");
+
+  textcolor(YELLOW); gotoxy( 2,15); cprintf("Par�metros:");
+                     gotoxy( 2,16); cprintf("  /#       N�mero de columnas [1,3,4,5,6]");
+                     gotoxy( 2,17); cprintf("  /S � /E  Ordenar por Tam�o � Extensi�n");
+                     gotoxy( 2,18); cprintf("  /R[c]    Recursivo [Sin realizar pausas]");
+  textcolor(RED);    gotoxy( 2,20); cprintf(" �Para configurar la ordenaci�n y columnas por defecto");
+                     gotoxy( 2,21); cprintf("  puedes usar la variable de entorno 'JD_DIR'");
+  textcolor(YELLOW); gotoxy( 2,22); cprintf("  -->   set JD_DIR=[Ordenacion>N|S|E][Columnas]");
+
+  textcolor(LIGHTRED); gotoxy( 3,4); cprintf("Rev.5");
+  textcolor(RED); gotoxy( 3,5); cprintf("Dedico el par�metro /R a OSCAR, al fin y al cabo");
+                  gotoxy( 3,6); cprintf("lo puse por �l.");
+
+  textcolor(LIGHTRED);
+                       gotoxy(55, 4); cprintf("Saludos a:");
+  textcolor(RED);
+                       gotoxy(56, 5); cprintf("Alvaro  Joshua  Marcial");
+                       gotoxy(56, 6); cprintf("Israel  Millan  Oscar  ");
+                       gotoxy(56, 7); cprintf("Lopez   VD      Zapper ");
+                       gotoxy(56, 8); cprintf("Manolo  Carlos  Fernan ");
+  textcolor(LIGHTRED);
+                       gotoxy(55,10); cprintf("Y a todos a los que no ");
+                       gotoxy(55,11); cprintf("recuerdo ahora mismo ;-)");
+  textcolor(WHITE);
+
+  gotoxy(20, 6); cprintf( "    __            ");
+  gotoxy(10, 7); cprintf( "      ____   / / \\          ");
+  gotoxy(10, 8); cprintf( "     /   /� ���� /|         ");
+  gotoxy(10, 9); cprintf( "     ���� | �   �/ ___---�� ");
+  gotoxy(10,10); cprintf( "     //\\� �_���� ��  �����  ");
+  gotoxy(10,11); cprintf( "   __����/      ������  ___ ");
+  gotoxy(10,12); cprintf( "  �-__     ������    ,-, |  ");
+  gotoxy(10,13); cprintf( "     / ����� /-- /�\\ |_  | .");
+  gotoxy(10,14); cprintf( "    ���      �-, \\_/ |      ");
+  gotoxy(10,15); cprintf( "             --�            ");
+/*
+              __
+      ____   / / \
+     /   /� ���� /|
+     ���� | �   �/ ___---��
+     //\� �_���� ��  �����
+   __����/      ������  /
+  �-__     ������ ,/\ /^\
+      / ����� ,/ �\  `\  `\
+     ���      \/�\ `\/�
+                /�
+*/
+/*
+              __
+      ____   / / \
+     /   /� ���� /|
+     ���� | �   �/ ___---��
+     //\� �_���� ��  �����
+   __����/      ������  ___
+  �-__     ������    ,-, |
+     / ����� /-- /�\ |_  | .
+    ���      �-, \_/ |
+             --�
+*/
+  gotoxy(1,24);
+
+}
+
+/*
+//
+// ���� ���� ���  �   �  ��  ��� ���  ��           �    ���� �   � �����
+// �    �  � �  � ����� �  �  �  �   �  �          �    �  � ��  � �
+// ���  �  � ���  �   � ����  �  ��  ����   � �    �    �  � � � � � ���
+// �    �  � � �  �   � �  �  �  �   �  �   � � �� �    �  � �  �� �   �
+// �    ���� �  � �   � �  �  �  ��� �  �   ���    ���� ���� �   � �����
+*/
+void formatea_u_long( unsigned long Numero, char *Inter_Chg) {
+
+	char Buffer1[80];
+	char Buffer2[80];
+	int c;
+
+		sprintf(Buffer1, "%lu", Numero);
+			strcpy(Buffer2, "\0");
+			strrev(Buffer1);
+			c = strlen( Buffer1 );
+		      while( c >= 3 ){
+			c -= 3;
+			strncat( Buffer2, Buffer1, 3);
+			strrev(Buffer1);
+			Buffer1[c] = '\0';
+			strrev(Buffer1);
+			if(strlen(Buffer1)!=0)
+				strcat( Buffer2, "." );
+		      }
+			strcat( Buffer2, Buffer1);
+strrev(Buffer2);
+strcpy(Inter_Chg, Buffer2);
+
+/*// return Buffer2;*/
+}
+
+/*
+//
+// ����� �   � ���� ����� ����  �   � ����      ���� ����� �   �  ���  �
+//   �   ��  � �    �   � �   � ����� �         �      �   ��  � �   � �
+//   �   � � � ���  �   � ����  �   � ���       ���    �   � � � ����� �
+//   �   �  �� �    �   � �  �  �   � �         �      �   �  �� �   � �
+// ����� �   � �    ����� �   � �   � ����      �    ����� �   � �   � ����
+*/
+void informe_final(char Unidad, char tipo)
+{
+    int   unidad;      /*unidad a examinar (0=A:, 1=B:, etc.)*/
+    union REGS r;      /*registros para llamada a DOS*/
+    long   ctot;        /*n�mero total clusters en el disco <1>*/
+    unsigned int   clib;        /*n�mero de clusters libres*/
+    int   scl;         /*n�mero de sectores por cluster*/
+    unsigned long  bcl;         /*n�mero de bytes por cluster*/
+    long  btot;        /*n�mero de bytes totales <2>*/
+    long  blib;        /*n�mero de bytes libres*/
+
+char Buffer[80];
+char ID_Volumen[13] = "JD ComputeR";
+float E_Total;
+
+	if ( (unidad = Unidad) == -1 )
+		unidad = bdos(0x19,0,0);            /*utiliza actual */;
+
+	r.h.ah = 0x36;                              /*Get Disk Free Space*/
+	r.h.dl = unidad+1;
+	intdos(&r,&r);                              /*llama a DOS <6>*/
+
+	    scl = r.x.ax;                           /*sectores por cluster*/
+	    bcl = (long)scl*r.x.cx;                 /*bytes por cluster*/
+	    ctot = r.x.dx;                          /*clusters total*/
+	    clib = r.x.bx;                          /*clusters libres*/
+if ( tipo == 0 )
+{
+    textcolor(YELLOW);        cprintf("%13d", Numero_Archivos);
+    textcolor(LIGHTBLUE);     cprintf(" Archivo/s, consumen un total de ");
+    textcolor(YELLOW);        formatea_u_long(Espacio_T_consumido, Buffer);
+			      cprintf("%s", Buffer );
+    textcolor(LIGHTBLUE);     cprintf(" bytes");
+    if ( Recursivo ) cprintf( "\r\n" );
+   } else {
+    if ( Recursivo )
+    {
+     textcolor(YELLOW);        cprintf("\n\r%13d", Numero_rArchivos);
+     textcolor(LIGHTBLUE);     cprintf(" Archivo/s, consumen un TOTAL de ");
+     textcolor(YELLOW);
+     if ( Espacio_Tr_consumido > 1048576 )
+     {
+      sprintf( Buffer, "%.2f", (float)Espacio_Tr_consumido/1048576 );
+     } else
+      formatea_u_long(Espacio_Tr_consumido, Buffer);
+   			       cprintf("%s", Buffer );
+     textcolor(LIGHTBLUE);
+     if ( Espacio_Tr_consumido > 1048576 )
+                               cprintf(" Mbytes");
+     else
+                               cprintf(" bytes");
+    }
+    textcolor(LIGHTBLUE);     cprintf(" de ");
+    E_Total = ( ( (float)(ctot*bcl) ) / 1048576 );
+    textcolor(YELLOW);        cprintf("%.1f", E_Total );
+    textcolor(LIGHTBLUE);     cprintf(" Mbytes\r\n"); /*\n*/
+
+
+    textcolor(YELLOW);        formatea_u_long( (unsigned long)(clib*bcl), Buffer );
+			      cprintf("%13s", Buffer );
+    textcolor(LIGHTBLUE);     cprintf(" bytes de espacio libre en ");
+    textcolor(YELLOW);        cprintf("%c:", (unidad + 65) );
+    textcolor(LIGHTBLUE);     cprintf("     Volumen:");
+
+    sprintf( ID_Volumen, "%c:\*.*", (unidad + 65) );
+    findfirst( ID_Volumen, &fi[0], FA_LABEL );
+    if ( fi[0].atrib & FA_LABEL )
+    {
+     strncpy( ID_Volumen, fi[0].name, 8 );      ID_Volumen[8] = '\0';
+     Buffer[0]=0;
+     while( ID_Volumen[Buffer[0]] != NULL && Buffer[0]<8) Buffer[0]++;
+     if ( Buffer[0]==8 )
+	     strncat( ID_Volumen, &(fi[0].name[9]), 3);
+
+     textcolor(LIGHTRED);      cprintf(" %s", ID_Volumen );
+    }
+    textcolor(LIGHTGRAY);
+    cprintf("\r\n");
+ }
+
+}
+
+
+int sort_function( const void far *a, const void  far *b)
+{
+
+   switch( Ordenado ){
+    case POR_NOMBRE:
+	fi_TMP = (FileInfo *)a;
+	/*_f*/strncpy( BufferA, fi_TMP -> name, 12);
+	fi_TMP = (FileInfo *)b;
+	/*_f*/strncpy( BufferB, fi_TMP -> name, 12);
+	BufferA[12] = '\0';
+	BufferB[12] = '\0';
+	return( strcmp(BufferA, BufferB) );
+    case POR_TAMANYO:
+	fi_TMP = (FileInfo *)a; L1 = fi_TMP -> size;
+	fi_TMP = (FileInfo *)b; L2 = fi_TMP -> size;
+	if ( L1 <  L2 ) return -1;
+	if ( L1 == L2 ) return 0;
+	if ( L1 >  L2 ) return 1;
+	break;
+    case POR_EXTENCION:
+	fi_TMP = (FileInfo *)a;
+	/*_f*/strncpy( BufferA, strrev(fi_TMP -> name), 3);
+	strrev(fi_TMP -> name);
+	fi_TMP = (FileInfo *)b;
+	/*_f*/strncpy( BufferB, strrev(fi_TMP -> name), 3);
+	strrev(fi_TMP -> name);
+	BufferA[3] = '\0';      BufferB[3] = '\0';
+	strrev(BufferA);        strrev(BufferB);
+	return( strcmp(BufferA, BufferB) );
+   }
+   return 0;
+
+}
+
+
+
+char Rellena_path( char *path, char *half_path )
+{
+ char unidad[5], directorio[255], nombre[15], ext[6], flags;
+ char *ptr, cont, Buffer[255];
+
+	  flags = fnsplit( half_path, unidad, directorio, nombre, ext );
+	  *unidad = toupper( *unidad );
+	  if ( !(flags & DRIVE) )        *unidad=getdisk() + 'A';
+	  if ( !(flags & DIRECTORY)  )
+				       {
+					 if ( getcurdir( *unidad - 'A'+ 1, Buffer ) != -1 )
+                                           sprintf( directorio, "\\%s", Buffer );
+                                         else
+                                           sprintf( directorio, "\\NO ESTA DISPONIBLE" );
+				       }
+	  if ( strcmp( directorio, ":") == 0 )
+					 strcpy( directorio, "\\");
+
+	  if ( !(flags & FILENAME) )   { strcpy( nombre, "*"); strcpy( ext, ".*");  }
+
+	  fnmerge( path, unidad, directorio, nombre, ext );
+
+	  if ( strchr( path, '*' ) == NULL && strchr( path, '?' ) == NULL &&
+		findfirst( path, &ftmp, (FA_HIDDEN | FA_DIREC) ) == 0 )
+			if (ftmp.atrib & FA_DIREC)
+				    strcat(path, "\\*.*");
+
+ return *unidad;
+}
+
diff --git a/JDIR.CPP b/JDIR.CPP
new file mode 100644
index 0000000..37f841e
--- /dev/null
+++ b/JDIR.CPP
@@ -0,0 +1,1015 @@
+ /*////////////////////////////////////////////////////////////////////////*\*/
+/*
+///    Nombre:        JDIR    .CPP                                         ///
+///    Modulo:                                                             ///
+///    Descripci�n:   Dir especial, para mostrar en color los archivos     ///
+///                                                                        ///
+///    Autor:    Jos� David Guill�n Dominguez                              ///
+///    Fecha:    06 - 07  - 1995                                           ///
+///              05 - 11  - 1995 ( fixed bugs )                            ///
+///              19 - 12  - 1995 ( re_coded all )                          ///
+///                                                                        ///
+///    Comentario:                                                         ///
+///                                                                        ///
+///                                                                        ///
+///                                                                        ///
+///    Compilador Borland C++ 3.0                                          ///
+*/
+ /* //////////////////////////////////////////////////////////////////////// */
+
+#include <io.h>
+#include <dir.h>
+#include <stdio.h>
+#include <conio.h>
+#include <alloc.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "Jdirect.h"          /*para funciones de acceso a directorio*/
+
+
+#define  MAXLDIR  90          /*longitud m�xima nombre directorio*/
+
+#define UNA_COLUMNA       1
+#define DOS_COLUMNAS      2
+#define TRES_COLUMNAS     3
+#define CUATRO_COLUMNAS   4
+#define CINCO_COLUMNAS    5
+#define SEIS_COLUMNAS     6
+
+#define POR_TAMANYO       1
+#define POR_NOMBRE        2
+#define POR_EXTENCION     3
+
+
+void Help( void );
+void Que_Color( void );
+void Muestra_Archivos( int Columnas );
+void CargaDatosFich( FileInfo far *fp );
+void informe_final( char Unidad, char tipo );
+void formatea_u_long( unsigned long Numero, char *Inter_Chg );
+
+int Carga_Archivos( char *Comodin, int atr );
+char Rellena_path( char *path, char *half_path );
+int sort_function( const void far *a, const void far *b );
+
+unsigned int Numero_Archivos = 0, Numero_rArchivos = 0;
+unsigned long Espacio_T_consumido, Espacio_Tr_consumido = 0;
+
+char Directorio, oculto;
+FileInfo far *fi, far *fi_TMP, ftmp;
+
+long Longitud, L1, L2;
+char BufferA[13], BufferB[13];
+char Nombre_archivo[13], Extension[5], Fecha_Larga[10], Fecha_Corta[10],
+	HORA[10], ATRIBUTO_L[10], ATRIBUTO_C[6], Columnas;
+int Ordenado;
+char Recursivo = 0, NoPausar = 0, Buffer[255];
+
+// ����������������������������������������������������������������������
+// ����������������������������������������������������������������������
+// ����������������������������������������������������������������������
+// ����������������������������������������������������������������������
+void EsperarTecla(void)
+{
+  if ( !NoPausar )
+  {
+   textcolor(YELLOW);
+   cprintf("< Presione una tecla para continuar >\r");
+   while( !kbhit() ); getch();
+   cprintf("                                     \r");
+  }
+};
+
+
+void RestaurarEntorno()
+{
+ char *p;
+
+ if ( ( p = getenv("JD_DIR") ) == NULL )
+ {
+   Columnas = TRES_COLUMNAS;    Ordenado = POR_NOMBRE;
+ } else {
+   switch( p[0] )
+   {
+    case 'N':         Ordenado = POR_NOMBRE;         break;
+    case 'E':         Ordenado = POR_EXTENCION;      break;
+    case 'S':         Ordenado = POR_TAMANYO;        break;
+    default:          Ordenado = POR_NOMBRE;         break;
+   }
+   if ( ( p[1] - '0' ) > 0 && ( p[1] - '0' ) <= 6 ) Columnas = ( p[1] - '0' );
+ }
+};
+
+int ProcesarLineaComandos( int argc, char *argv[] )
+{
+ char i, cont;  /* Contador de par�metro   */
+
+    cont = 0;
+    for(i = 1; i != argc; i++)
+	if ( *argv[i] == '/' ) /* Comandos internos   */
+	 {
+	  if ( *(argv[i]+1) >= '1' && *(argv[i]+1) <= '6' ) Columnas  = *(argv[i]+1) - '0';
+	  if ( *(argv[i]+1) == 'e' || *(argv[i]+1) == 'E' ) Ordenado  = POR_EXTENCION;
+	  if ( *(argv[i]+1) == 's' || *(argv[i]+1) == 'S' ) Ordenado  = POR_TAMANYO;
+	  if ( *(argv[i]+1) == 'r' || *(argv[i]+1) == 'R' )
+          {
+            Recursivo = 1;
+  	    if ( *(argv[i]+2) == 'c' || *(argv[i]+1) == 'C' )
+                        NoPausar = 1;
+          }
+	  if ( *(argv[i]+1) == 'c' || *(argv[i]+1) == 'C' ) NoPausar = 1;
+	  if ( *(argv[i]+1) == '?' ) { Help(); return -1; }
+	  cont++;
+	 }
+   if ( argc == 1 ) argc = 2; else
+   if ( cont == argc -1 ) { strcpy( argv[1], "*.*"); }
+
+   return argc;
+};
+
+
+void MuestraDirectorio( char *path )    // DEBE SER UN PATH COMPLETO
+{
+ int Entrada, i;
+
+ textcolor(CYAN);  cprintf("Path: %s\r\n", path );
+ if ( Carga_Archivos( path, 0xF7 ) != -1 )
+ {
+    qsort((void *)fi, Numero_Archivos, sizeof(FileInfo), sort_function);
+    Muestra_Archivos( Columnas );           informe_final( path[0]-'A' ,  0);
+    Espacio_Tr_consumido += Espacio_T_consumido; Numero_rArchivos += Numero_Archivos;
+  }
+
+ if ( Recursivo )
+ {
+   // BEGIN 05-10-99
+   fnsplit(path,ATRIBUTO_C,Buffer,Nombre_archivo,Extension);
+   fnmerge(path,ATRIBUTO_C,Buffer,"*","*");
+   // END 05-10-99
+   if ( Carga_Archivos( path, 0x10 ) == -1 )  return;
+   if ( strcmp( fi[1].name, ".." ) == 0 )  Entrada = 2; else Entrada = 0;
+   for( ; Entrada < Numero_Archivos; Entrada++)
+   {
+                                     // BEGIN 05-10-99 (NULL,NULL)
+     fnsplit(path,ATRIBUTO_C,Buffer, NULL,NULL ); //Nombre_archivo,Extension);
+                                     // END 05-10-99
+     strcat( Buffer, fi[Entrada].name );
+     fnmerge(path,ATRIBUTO_C,Buffer,Nombre_archivo,Extension);
+                              EsperarTecla();
+                              MuestraDirectorio( path );
+                                     // BEGIN 05-10-99 (NULL,NULL)
+     fnsplit(path,ATRIBUTO_C,Buffer, NULL, NULL );//Nombre_archivo,Extension);
+                                    // END 05-10-99
+     i = strlen( Buffer );
+     while ( i > 1 && Buffer[--i] != '\\' );
+     if ( Buffer[i-1] != '\0' ) while ( i > 1 && Buffer[--i] != '\\' ); Buffer[i] = '\0';
+                                     // BEGIN 05-10-99 ("*","*")
+     fnmerge(path,ATRIBUTO_C,Buffer, "*", "*" );//Nombre_archivo,Extension);
+                                    // END 05-10-99
+
+     if ( Carga_Archivos( path, 0x10 ) == -1 )  return;
+    }
+ }
+};
+
+
+/********************************************************************
+ * main
+ ********************************************************************/
+void main(int argc, char *argv[])
+{
+ char i, path[255];
+
+ highvideo();	 textcolor(YELLOW);    cprintf("\r\nJD_Dir\r\n");
+
+ RestaurarEntorno();
+ argc = ProcesarLineaComandos( argc, argv );
+
+  for(i = 1; i < argc; i++)
+	if ( *argv[i] != '/' ) // Filtramos los comandos internos
+        {
+          Rellena_path( path, argv[i] );
+          MuestraDirectorio( path );
+          informe_final( path[0]-'A',  1);
+        }
+
+}
+ /*����������������������������������������������������������������������*/
+
+ /*����������������������������������������������������������������������*/
+ /*����������������������������������������������������������������������*/
+
+ /*����������������������������������������������������������������������*/
+
+int Carga_Archivos(char *Comodin, int atr )
+{
+ int contador;
+
+ farfree(fi);
+ if( (fi = (FileInfo far *)farcalloc(50, sizeof(FileInfo) )) == NULL )
+ {
+	  textcolor(BLUE); cprintf("\r\nError buscando memoria.\r\n");
+	  normvideo();     textcolor(LIGHTGRAY);               return -1;
+ }
+
+ Espacio_T_consumido = 0;
+ Numero_Archivos = contador = 0;
+
+if ( findfirst(Comodin, &ftmp, atr) != 0)
+{
+	textcolor(LIGHTGREEN);	cprintf("Fichero/s no encontrado/s\n\r");
+	textcolor(LIGHTGRAY);
+	cprintf("\r\n");	return -1;
+}
+
+    {
+	fi[Numero_Archivos] = ftmp;
+	Numero_Archivos++;
+	while (findnext(&ftmp) == 0)
+        {
+          if ( atr != 0x10 || ftmp.atrib & atr )
+          {
+		fi[Numero_Archivos] = ftmp;
+		Numero_Archivos++;
+		contador++;
+		if(contador==49)
+                {
+		 if( ( fi = (FileInfo far *)farrealloc(fi, sizeof(FileInfo)*(Numero_Archivos + 50) ) )==NULL )
+                 {
+		    textcolor(BLUE);		    cprintf("\r\nError buscando memoria.\r\n");
+		    normvideo();		    textcolor(WHITE);
+		    return -1;
+		 }
+		 contador = 0;
+		}
+          }
+	}
+
+    }
+    return 0;
+}
+
+void Muestra_Archivos( int Columnas )
+{
+
+int i, lineas = 0, PartCol;
+//char Buffer[80];
+textcolor(BLUE);
+
+switch( Columnas )
+{
+ case 1:
+	cprintf("��������������������������������������������������������������������������������");
+	for(i=0; i < Numero_Archivos; i++)
+	{
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf("   <dir>    ");
+		 else
+		 {
+		  textcolor(YELLOW);    formatea_u_long( (unsigned long) Longitud, Buffer );
+					cprintf(" %11s",  Buffer );
+		 }
+		textcolor(CYAN);        cprintf("  %s  ",   Fecha_Larga);
+		textcolor(LIGHTBLUE);   cprintf("%s",   HORA);
+		textcolor(BLUE);        cprintf("%s\r\n",   ATRIBUTO_L);
+		lineas++;
+		if(lineas==21)
+                {
+                        EsperarTecla();
+                        lineas = 0;
+                }
+	}
+	textcolor(BLUE);
+	cprintf("��������������������������������������������������������������������������������");
+	break;
+
+ case TRES_COLUMNAS:
+
+	cprintf("��������������������������������������������������������������������������������");
+
+	PartCol = (Numero_Archivos/3);
+	PartCol += ( ( Numero_Archivos - (PartCol*3) )!=0 ? 1: 0 );
+ 	for(i=0; i < PartCol; i++)
+	{
+/*             /////////////////////// Columna 1*/
+	       if ( i < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf("    <dir>    "); else
+		{
+		  textcolor(YELLOW);    formatea_u_long( (unsigned long) Longitud, Buffer );
+					cprintf(" %11s ",  Buffer );
+		}
+	       }
+/*             /////////////////////// Columna 2*/
+	       if( (i+PartCol) < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i+PartCol]);
+		textcolor(BLUE);        cprintf("�");
+		Que_Color();            cprintf(" %s",   Nombre_archivo);
+		if( Directorio )        cprintf("    <dir>    "); else
+		{
+		  textcolor(YELLOW);    formatea_u_long( (unsigned long) Longitud, Buffer );
+					cprintf(" %11s ",  Buffer );
+		}
+/*                      /////////////////////// Columna 3*/
+			if( (i+(PartCol*2)) < Numero_Archivos )
+			{
+			 CargaDatosFich(&fi[i+(PartCol*2)]);
+			 textcolor(BLUE);       cprintf("�");
+			 Que_Color();           cprintf(" %s",   Nombre_archivo);
+			 if( Directorio )       cprintf("    <dir>    \r\n"); else
+			 {
+			  textcolor(YELLOW);    formatea_u_long( (unsigned long) Longitud, Buffer );
+						cprintf(" %11s\r\n",  Buffer );
+			 }
+			} else {                textcolor(BLUE); cprintf("�\r\n"); }
+	       } else {                         textcolor(BLUE);
+						strcpy( BufferA, "�                          �\r\n");
+						cprintf("%s", BufferA);
+	       }
+
+	       lineas++;
+	       if(lineas==21)
+	       {
+EsperarTecla();
+lineas = 0;
+
+/*
+			cprintf("< Presione una tecla para continuar >");
+			while( !kbhit() );  getch(); lineas = 0;
+			cprintf("\r\n");
+*/
+	       }
+	}
+	textcolor(BLUE);
+	cprintf("��������������������������������������������������������������������������������");
+	break;
+
+ case CUATRO_COLUMNAS:
+
+	cprintf("��������������������������������������������������������������������������������");
+
+	PartCol = (Numero_Archivos/4);
+	PartCol += ( ( Numero_Archivos - (PartCol*4) )!=0 ? 1: 0 );
+	for(i=0; i < PartCol; i++)
+	{
+/*             /////////////////////// Columna 1*/
+	       if ( i < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf(" <dir> "); else
+		{
+		  textcolor(YELLOW);    cprintf("% 7ld",  Longitud );
+		}
+	       }
+/*             /////////////////////// Columna 2*/
+	       if( (i+PartCol) < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i+PartCol]);
+		textcolor(BLUE);        cprintf("�");
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf(" <dir> "); else
+		{
+		  textcolor(YELLOW);    cprintf("% 7ld",  Longitud );
+		}
+/*                      /////////////////////// Columna 3*/
+			if( (i+(PartCol*2)) < Numero_Archivos )
+			{
+			 CargaDatosFich(&fi[i+(PartCol*2)]);
+			 textcolor(BLUE);       cprintf("�");
+			 Que_Color();           cprintf("%s",   Nombre_archivo);
+			 if( Directorio )       cprintf(" <dir> "); else
+			 {
+			  textcolor(YELLOW);    cprintf("% 7ld",  Longitud );
+			 }
+/*                       /////////////////////// Columna 4 */
+			 if( (i+(PartCol*3)) < Numero_Archivos )
+			 {
+			   CargaDatosFich(&fi[i+(PartCol*3)]);
+			   textcolor(BLUE);       cprintf("�");
+			   Que_Color();         cprintf("%s",   Nombre_archivo);
+			   if( Directorio )       cprintf(" <dir> \r\n"); else
+			   {
+			    textcolor(YELLOW);  cprintf("% 7ld\r\n", Longitud );
+			   }
+			 } else {               textcolor(BLUE); cprintf("�\r\n"); }
+
+			} else {                textcolor(BLUE);
+						cprintf("� 		    �		    �\r\n");
+			}
+	       } else {                         textcolor(BLUE);
+						cprintf("�                   �                   �               \r\n");
+	       }
+
+	       lineas++;
+	       if(lineas==21)
+	       {
+EsperarTecla();
+lineas = 0;
+
+/*
+ 			cprintf("< Presione una tecla para continuar >");
+			while( !kbhit() );  getch(); lineas = 0;
+			cprintf("\r\n");
+*/
+	       }
+	}
+	textcolor(BLUE);
+	cprintf("��������������������������������������������������������������������������������");
+	break;
+
+ case CINCO_COLUMNAS:
+	cprintf("��������������������������������������������������������������������������������");
+
+	PartCol = (Numero_Archivos/5);
+	PartCol += ( ( Numero_Archivos - (PartCol*5) )!=0 ? 1: 0 );
+	for(i=0; i < PartCol; i++)
+	{
+/*             /////////////////////// Columna 1     */
+	       if ( i < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf("%s",   Nombre_archivo);
+		if( Directorio )        cprintf(" D"); else cprintf("  ");
+	       }
+/*                /////////////////////// Columna 2*/
+		  if( (i+PartCol) < Numero_Archivos )
+		  {
+		   CargaDatosFich(&fi[i+PartCol]);
+		   textcolor(BLUE);        cprintf("�  ");
+		   Que_Color();         cprintf("%s",   Nombre_archivo);
+		   if( Directorio )        cprintf(" D"); else cprintf("  ");
+/*                    /////////////////////// Columna 3*/
+		      if( (i+(PartCol*2)) < Numero_Archivos )
+		      {
+		       CargaDatosFich(&fi[i+(PartCol*2)]);
+		       textcolor(BLUE);       cprintf("�  ");
+		       Que_Color();             cprintf("%s",   Nombre_archivo);
+		       if( Directorio )       cprintf(" D"); else cprintf("  ");
+/*                        /////////////////////// Columna 4*/
+			  if( (i+(PartCol*3)) < Numero_Archivos )
+			  {
+			    CargaDatosFich(&fi[i+(PartCol*3)]);
+			    textcolor(BLUE);       cprintf("�  ");
+			    Que_Color();            cprintf("%s",   Nombre_archivo);
+			    if( Directorio )       cprintf(" D"); else cprintf("  ");
+
+/*                           /////////////////////// Columna 5*/
+			     if( (i+(PartCol*4)) < Numero_Archivos )
+			     {
+			      CargaDatosFich(&fi[i+(PartCol*4)]);
+			      textcolor(BLUE);       cprintf("�  ");
+			      Que_Color();          cprintf("%s",   Nombre_archivo);
+			      if( Directorio )       cprintf(" D\r"); else cprintf("  \r");
+			     } else {           textcolor(BLUE); cprintf("�\r\n"); }
+			   } else {             textcolor(BLUE);
+						cprintf("�                �\r\n");
+						}
+			} else {                textcolor(BLUE);
+						cprintf("�                �                �\r\n");
+						}
+	       } else {                         textcolor(BLUE);
+						cprintf("�                �                �                �\r\n");
+						}
+
+	       lineas++;
+	       if(lineas==21)
+	       {
+EsperarTecla();
+lineas = 0;
+/*
+			cprintf("< Presione una tecla para continuar >");
+			while( !kbhit() );  getch(); lineas = 0;
+			cprintf("\r\n");
+*/
+	       }
+	}
+	textcolor(BLUE);
+	cprintf("��������������������������������������������������������������������������������");
+	break;
+
+ case SEIS_COLUMNAS:
+/*      //        12345678.123 12345678.123 12345678.123 12345678.123 12345678.123 12345678.123*/
+	cprintf(" ������������ ������������ ������������ ������������ ������������ ������������\r\n");
+
+	PartCol = (Numero_Archivos/6);
+	PartCol += ( ( Numero_Archivos - (PartCol*6) )!=0 ? 1: 0 );
+	for(i=0; i < PartCol; i++)
+	{
+/*             /////////////////////// Columna 1             */
+	       if ( i < Numero_Archivos )
+	       {
+		CargaDatosFich(&fi[i]);
+		Que_Color();            cprintf(" %s",   Nombre_archivo);
+	       }
+/*                /////////////////////// Columna 2*/
+		  if( (i+PartCol) < Numero_Archivos )
+		  {
+		   CargaDatosFich(&fi[i+PartCol]);
+		   Que_Color();         cprintf(" %s",   Nombre_archivo);
+/*                    /////////////////////// Columna 3      */
+		      if( (i+(PartCol*2)) < Numero_Archivos )
+		      {
+		       CargaDatosFich(&fi[i+(PartCol*2)]);
+		       Que_Color();             cprintf(" %s",   Nombre_archivo);
+/*                        /////////////////////// Columna 4*/
+			  if( (i+(PartCol*3)) < Numero_Archivos )
+			  {
+			    CargaDatosFich(&fi[i+(PartCol*3)]);
+			    Que_Color();            cprintf(" %s",   Nombre_archivo);
+/*                           /////////////////////// Columna 5*/
+			     if( (i+(PartCol*4)) < Numero_Archivos )
+			     {
+			      CargaDatosFich(&fi[i+(PartCol*4)]);
+			      Que_Color();          cprintf(" %s",   Nombre_archivo);
+/*                            /////////////////////// Columna 6*/
+			      if( (i+(PartCol*5)) < Numero_Archivos )
+			      {
+			       CargaDatosFich(&fi[i+(PartCol*5)]);
+			       Que_Color();         cprintf(" %s",   Nombre_archivo);
+			      }
+			     }
+			   }
+			}
+	       }
+	       cprintf("\r\n");
+	       lineas++;
+	       if(lineas==21)
+	       {
+                EsperarTecla();
+                lineas = 0;
+	       }
+	}
+	textcolor(BLUE);
+	cprintf(" ������������ ������������ ������������ ������������ ������������ ������������");
+	break;
+
+ default:
+	break;
+
+ }
+
+
+}
+
+
+    /********************************************************************\
+   |*           MuestraDatosFich: datos sobre el fichero *fi.            *|
+    \********************************************************************/
+void CargaDatosFich(FileInfo far *fp)
+{
+    static char *meses[] = { "Ene", "Feb", "Mar", "Abr", "May", "Jun",
+			     "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" };
+    char n[13];  /*nombre*/
+    char s[4];   /*y sufijo*/
+    char *p;
+
+    /*_f*/strcpy(n,fp->name);                             /*copia nombre <2>*/
+    s[0] = 0;                                       /*ning�n sufijo*/
+    p = strchr(n,'.');                              /*busca separador*/
+    if (p != NULL && p > n) {                       /*si lo encuentra <3>*/
+	*p = 0;                                     /*termina nombre en n[]*/
+	strcpy(s,p+1);                              /*y copia sufijo*/
+    }
+sprintf(Nombre_archivo, "%-9s%-3s",n,s);
+sprintf(Extension, "%s", s);
+
+    if (fp->atrib & FA_DIREC) {                     /*si directorio <4>*/
+    Directorio = 1;
+    } else {                                        /*si fichero normal*/
+
+    Directorio = 0;
+    Longitud = fp -> size;
+    Espacio_T_consumido += Longitud;
+    }
+
+
+   if( fp->date.month-1 >=1 && fp->date.month-1 <= 12 )
+    sprintf(Fecha_Larga, "%2d %3s %2d",fp->date.day,           /*muestra fecha <6>*/
+	   meses[fp->date.month-1],fp->date.year+80);
+
+   if( fp->date.month-1 >=1 && fp->date.month-1 <= 12 )
+    sprintf(Fecha_Corta, "% 2d-% 2d-% 2d",fp->date.day,           /*muestra fecha <6>*/
+	     fp->date.month,fp->date.year+80);
+
+
+     sprintf(HORA, "%2d:%02d:%02d   ",fp->time.hours,     /*muestra hora*/
+	   fp->time.min,fp->time.sec*2);
+
+    if (fp->atrib & FA_SYSTEM) {                    /*muestra atributos <7>*/
+	strcpy(ATRIBUTO_L, "System ");
+	strcpy(ATRIBUTO_C, "S");
+    } else {
+		strcpy(ATRIBUTO_L, "       ");
+		strcpy(ATRIBUTO_C, " ");
+	    }
+
+    if (fp->atrib & FA_HIDDEN) {
+	strcpy(ATRIBUTO_L, "Oculto ");
+	strcpy(ATRIBUTO_C, "O");
+	oculto = 1;
+    } else {
+		oculto = 0;
+		strcpy(ATRIBUTO_L, "       ");
+		strcpy(ATRIBUTO_C, " ");
+	    }
+    if (fp->atrib & FA_RDONLY) {
+	strcpy(ATRIBUTO_L, "Protegido ");
+	strcpy(ATRIBUTO_C, "P");
+    }
+
+}
+
+
+
+
+void Que_Color(void)
+{
+
+/*// Todo lo que este oculto*/
+ if ( oculto )                     { textcolor(GREEN); return; }
+/*// Directorios*/
+ if ( Directorio )                 { textcolor(LIGHTMAGENTA); return; }
+/*// Ejecutables *.BAT dee proceso por Lotes*/
+ if ( !strcmpi(Extension, "BAT") ) { textcolor(RED); return; }
+/*// Ejecutables *.EXE*/
+ if ( !strcmpi(Extension, "EXE") ) { textcolor(LIGHTCYAN); return; }
+/*// Ejecutables  *.COM*/
+ if ( !strcmpi(Extension, "COM") ) { textcolor(LIGHTGREEN); return; }
+
+/* //Texto*/
+ if ( !strcmpi(Extension, "TXT") ) { textcolor(WHITE); return; }
+ if ( !strcmpi(Extension, "DOC") ) { textcolor(WHITE); return; }
+/*// Texto con formatos especiales*/
+ if ( !strcmpi(Extension, "WRI") ) { textcolor(WHITE); return; }
+ if ( !strcmpi(Extension, "WPC") ) { textcolor(WHITE); return; }
+ if ( !strcmpi(Extension, "RTF") ) { textcolor(WHITE); return; }
+
+/*// M�sica*/
+ if ( !strcmpi(Extension, "MID") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "MOD") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "VOC") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "CMF") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "WAV") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "S3M") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "MP1") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "MP2") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "MP3") ) { textcolor(BLUE); return; }
+ if ( !strcmpi(Extension, "QPV") ) { textcolor(BLUE); return; }
+
+/* // Imagenes y videos*/
+ if ( !strcmpi(Extension, "FLI") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "FLC") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "MPG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "MOV") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "AVI") ) { textcolor(MAGENTA); return; }
+
+ if ( !strcmpi(Extension, "CEL") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "PNG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "PCX") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "GIF") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "JPG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "LBM") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "TGA") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "DIB") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "MAC") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "WPG") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "BMP") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "PIC") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "RLE") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "CUT") ) { textcolor(MAGENTA); return; }
+ if ( !strcmpi(Extension, "TIF") ) { textcolor(MAGENTA); return; }
+
+/* // Lenguajes*/
+ if ( !strcmpi(Extension, "C") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "CPP") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "C++") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "PAS") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "ASM") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "VBX") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "LIB") ) { textcolor(BROWN); return; }
+ if ( !strcmpi(Extension, "BAS") ) { textcolor(BROWN); return; }
+
+/*// Compresores*/
+ if ( !strcmpi(Extension, "ZIP") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "ARJ") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "ARC") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "AIN") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "LZH") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "TGZ") ) { textcolor(LIGHTBLUE); return; }
+ if ( !strcmpi(Extension, "RAR") ) { textcolor(LIGHTBLUE); return; }
+
+/*
+ if ( !strcmpi(Extension, "") ) { textcolor(); return; }
+ if ( !strcmpi(Extension, "") ) { textcolor(); return; }
+ if ( !strcmpi(Extension, "") ) { textcolor(); return; }
+*/
+
+ textcolor(LIGHTGRAY);
+}
+/*
+//
+//                       �  �     ����    �       ����
+//                       �  �     �       �       �   �
+//                       ����     ���     �       ����
+//                       �  �     �       �       �
+//                       �  �     ����    ����    �
+*/
+void Help(void)
+{
+ int i;
+
+	clrscr();       textcolor(WHITE); textbackground(BLUE);
+
+	cprintf("Copyright (c) J.D. Soft.  1994-98. Jos� David Guill�n Dominguez... JD_DIR  v�2.5");
+	textbackground(BLACK);
+
+  textcolor(LIGHTBLUE);
+  for ( i=2; i<12; i++ )
+  {
+    gotoxy(1,i); cprintf("�"); gotoxy(80,i); cprintf("�");
+  }
+  textcolor(BLUE);       gotoxy(1,12); cprintf("�"); gotoxy(80,12); cprintf("�");
+  textcolor(LIGHTBLUE);
+                         gotoxy(1,13); cprintf("�"); gotoxy(80,13); cprintf("�");
+                         gotoxy(1,14); cprintf("�"); gotoxy(80,14); cprintf("�");
+  textcolor(BLUE);
+                         gotoxy(1,15); cprintf("�"); gotoxy(80,15); cprintf("�");
+                         gotoxy(1,16); cprintf("�"); gotoxy(80,16); cprintf("�");
+  textcolor(LIGHTBLUE);  gotoxy(1,17); cprintf("�"); gotoxy(80,17); cprintf("�");
+  textcolor(BLUE);
+  for ( i=18; i<22; i++ )
+  {
+    gotoxy(1,i); cprintf("�"); gotoxy(80,i); cprintf("�\r\n");
+  }
+                         gotoxy(1,23); cprintf("�"); gotoxy(80,23); cprintf("�");
+
+  textcolor(DARKGRAY); gotoxy(60,15); cprintf("   �       ��  �  � ");
+                       gotoxy(60,16); cprintf("        ��   �  �  �");
+                       gotoxy(60,17); cprintf(" �   ��   �   ������");
+                       gotoxy(60,18); cprintf(" ���   �   ���������");
+                       gotoxy(60,19); cprintf("��  �   ������������");
+                       gotoxy(60,20); cprintf("  ��  ��������������");
+                       gotoxy(60,21); cprintf("���  ���������������");
+                       gotoxy(60,22); cprintf("    ��������������  ");
+                       gotoxy(60,23); cprintf("�� �������������     ");
+
+  textcolor(YELLOW); gotoxy( 2,15); cprintf("Par�metros:");
+                     gotoxy( 2,16); cprintf("  /#       N�mero de columnas [1,3,4,5,6]");
+                     gotoxy( 2,17); cprintf("  /S � /E  Ordenar por Tam�o � Extensi�n");
+                     gotoxy( 2,18); cprintf("  /R[c]    Recursivo [Sin realizar pausas]");
+  textcolor(RED);    gotoxy( 2,20); cprintf(" �Para configurar la ordenaci�n y columnas por defecto");
+                     gotoxy( 2,21); cprintf("  puedes usar la variable de entorno 'JD_DIR'");
+  textcolor(YELLOW); gotoxy( 2,22); cprintf("  -->   set JD_DIR=[Ordenacion>N|S|E][Columnas]");
+
+  textcolor(LIGHTRED); gotoxy( 3,4); cprintf("Rev.5");
+  textcolor(RED); gotoxy( 3,5); cprintf("Dedico el par�metro /R a OSCAR, al fin y al cabo");
+                  gotoxy( 3,6); cprintf("lo puse por �l.");
+
+  textcolor(LIGHTRED);
+                       gotoxy(55, 4); cprintf("Saludos a:");
+  textcolor(RED);
+                       gotoxy(56, 5); cprintf("Alvaro  Joshua  Marcial");
+                       gotoxy(56, 6); cprintf("Israel  Millan  Oscar  ");
+                       gotoxy(56, 7); cprintf("Lopez   VD      Zapper ");
+                       gotoxy(56, 8); cprintf("Manolo  Carlos  Fernan ");
+  textcolor(LIGHTRED);
+                       gotoxy(55,10); cprintf("Y a todos a los que no ");
+                       gotoxy(55,11); cprintf("recuerdo ahora mismo ;-)");
+  textcolor(WHITE);
+
+  gotoxy(20, 6); cprintf( "    __            ");
+  gotoxy(10, 7); cprintf( "      ____   / / \\          ");
+  gotoxy(10, 8); cprintf( "     /   /� ���� /|         ");
+  gotoxy(10, 9); cprintf( "     ���� | �   �/ ___---�� ");
+  gotoxy(10,10); cprintf( "     //\\� �_���� ��  �����  ");
+  gotoxy(10,11); cprintf( "   __����/      ������  ___ ");
+  gotoxy(10,12); cprintf( "  �-__     ������    ,-, |  ");
+  gotoxy(10,13); cprintf( "     / ����� /-- /�\\ |_  | .");
+  gotoxy(10,14); cprintf( "    ���      �-, \\_/ |      ");
+  gotoxy(10,15); cprintf( "             --�            ");
+/*
+              __
+      ____   / / \
+     /   /� ���� /|
+     ���� | �   �/ ___---��
+     //\� �_���� ��  �����
+   __����/      ������  /
+  �-__     ������ ,/\ /^\
+      / ����� ,/ �\  `\  `\
+     ���      \/�\ `\/�
+                /�
+*/
+/*
+              __
+      ____   / / \
+     /   /� ���� /|
+     ���� | �   �/ ___---��
+     //\� �_���� ��  �����
+   __����/      ������  ___
+  �-__     ������    ,-, |
+     / ����� /-- /�\ |_  | .
+    ���      �-, \_/ |
+             --�
+*/
+  gotoxy(1,24);
+
+}
+
+/*
+//
+// ���� ���� ���  �   �  ��  ��� ���  ��           �    ���� �   � �����
+// �    �  � �  � ����� �  �  �  �   �  �          �    �  � ��  � �
+// ���  �  � ���  �   � ����  �  ��  ����   � �    �    �  � � � � � ���
+// �    �  � � �  �   � �  �  �  �   �  �   � � �� �    �  � �  �� �   �
+// �    ���� �  � �   � �  �  �  ��� �  �   ���    ���� ���� �   � �����
+*/
+void formatea_u_long( unsigned long Numero, char *Inter_Chg) {
+
+	char Buffer1[80];
+	char Buffer2[80];
+	int c;
+
+		sprintf(Buffer1, "%lu", Numero);
+			strcpy(Buffer2, "\0");
+			strrev(Buffer1);
+			c = strlen( Buffer1 );
+		      while( c >= 3 ){
+			c -= 3;
+			strncat( Buffer2, Buffer1, 3);
+			strrev(Buffer1);
+			Buffer1[c] = '\0';
+			strrev(Buffer1);
+			if(strlen(Buffer1)!=0)
+				strcat( Buffer2, "." );
+		      }
+			strcat( Buffer2, Buffer1);
+strrev(Buffer2);
+strcpy(Inter_Chg, Buffer2);
+
+/*// return Buffer2;*/
+}
+
+/*
+//
+// ����� �   � ���� ����� ����  �   � ����      ���� ����� �   �  ���  �
+//   �   ��  � �    �   � �   � ����� �         �      �   ��  � �   � �
+//   �   � � � ���  �   � ����  �   � ���       ���    �   � � � ����� �
+//   �   �  �� �    �   � �  �  �   � �         �      �   �  �� �   � �
+// ����� �   � �    ����� �   � �   � ����      �    ����� �   � �   � ����
+*/
+void informe_final(char Unidad, char tipo)
+{
+    int   unidad;      /*unidad a examinar (0=A:, 1=B:, etc.)*/
+    union REGS r;      /*registros para llamada a DOS*/
+    long   ctot;        /*n�mero total clusters en el disco <1>*/
+    unsigned int   clib;        /*n�mero de clusters libres*/
+    int   scl;         /*n�mero de sectores por cluster*/
+    unsigned long  bcl;         /*n�mero de bytes por cluster*/
+    long  btot;        /*n�mero de bytes totales <2>*/
+    long  blib;        /*n�mero de bytes libres*/
+
+char Buffer[80];
+char ID_Volumen[13] = "JD ComputeR";
+float E_Total;
+
+	if ( (unidad = Unidad) == -1 )
+		unidad = bdos(0x19,0,0);            /*utiliza actual */;
+
+	r.h.ah = 0x36;                              /*Get Disk Free Space*/
+	r.h.dl = unidad+1;
+	intdos(&r,&r);                              /*llama a DOS <6>*/
+
+	    scl = r.x.ax;                           /*sectores por cluster*/
+	    bcl = (long)scl*r.x.cx;                 /*bytes por cluster*/
+	    ctot = r.x.dx;                          /*clusters total*/
+	    clib = r.x.bx;                          /*clusters libres*/
+if ( tipo == 0 )
+{
+    textcolor(YELLOW);        cprintf("%13d", Numero_Archivos);
+    textcolor(LIGHTBLUE);     cprintf(" Archivo/s, consumen un total de ");
+    textcolor(YELLOW);        formatea_u_long(Espacio_T_consumido, Buffer);
+			      cprintf("%s", Buffer );
+    textcolor(LIGHTBLUE);     cprintf(" bytes");
+    if ( Recursivo ) cprintf( "\r\n" );
+   } else {
+    if ( Recursivo )
+    {
+     textcolor(YELLOW);        cprintf("\n\r%13d", Numero_rArchivos);
+     textcolor(LIGHTBLUE);     cprintf(" Archivo/s, consumen un TOTAL de ");
+     textcolor(YELLOW);
+     if ( Espacio_Tr_consumido > 1048576 )
+     {
+      sprintf( Buffer, "%.2f", (float)Espacio_Tr_consumido/1048576 );
+     } else
+      formatea_u_long(Espacio_Tr_consumido, Buffer);
+   			       cprintf("%s", Buffer );
+     textcolor(LIGHTBLUE);
+     if ( Espacio_Tr_consumido > 1048576 )
+                               cprintf(" Mbytes");
+     else
+                               cprintf(" bytes");
+    }
+    textcolor(LIGHTBLUE);     cprintf(" de ");
+    E_Total = ( ( (float)(ctot*bcl) ) / 1048576 );
+    textcolor(YELLOW);        cprintf("%.1f", E_Total );
+    textcolor(LIGHTBLUE);     cprintf(" Mbytes\r\n"); /*\n*/
+
+
+    textcolor(YELLOW);        formatea_u_long( (unsigned long)(clib*bcl), Buffer );
+			      cprintf("%13s", Buffer );
+    textcolor(LIGHTBLUE);     cprintf(" bytes de espacio libre en ");
+    textcolor(YELLOW);        cprintf("%c:", (unidad + 65) );
+    textcolor(LIGHTBLUE);     cprintf("     Volumen:");
+
+    sprintf( ID_Volumen, "%c:\*.*", (unidad + 65) );
+    findfirst( ID_Volumen, &fi[0], FA_LABEL );
+    if ( fi[0].atrib & FA_LABEL )
+    {
+     strncpy( ID_Volumen, fi[0].name, 8 );      ID_Volumen[8] = '\0';
+     Buffer[0]=0;
+     while( ID_Volumen[Buffer[0]] != NULL && Buffer[0]<8) Buffer[0]++;
+     if ( Buffer[0]==8 )
+	     strncat( ID_Volumen, &(fi[0].name[9]), 3);
+
+     textcolor(LIGHTRED);      cprintf(" %s", ID_Volumen );
+    }
+    textcolor(LIGHTGRAY);
+    cprintf("\r\n");
+ }
+
+}
+
+
+int sort_function( const void far *a, const void  far *b)
+{
+
+   switch( Ordenado ){
+    case POR_NOMBRE:
+	fi_TMP = (FileInfo *)a;
+	/*_f*/strncpy( BufferA, fi_TMP -> name, 12);
+	fi_TMP = (FileInfo *)b;
+	/*_f*/strncpy( BufferB, fi_TMP -> name, 12);
+	BufferA[12] = '\0';
+	BufferB[12] = '\0';
+	return( strcmp(BufferA, BufferB) );
+    case POR_TAMANYO:
+	fi_TMP = (FileInfo *)a; L1 = fi_TMP -> size;
+	fi_TMP = (FileInfo *)b; L2 = fi_TMP -> size;
+	if ( L1 <  L2 ) return -1;
+	if ( L1 == L2 ) return 0;
+	if ( L1 >  L2 ) return 1;
+	break;
+    case POR_EXTENCION:
+	fi_TMP = (FileInfo *)a;
+	/*_f*/strncpy( BufferA, strrev(fi_TMP -> name), 3);
+	strrev(fi_TMP -> name);
+	fi_TMP = (FileInfo *)b;
+	/*_f*/strncpy( BufferB, strrev(fi_TMP -> name), 3);
+	strrev(fi_TMP -> name);
+	BufferA[3] = '\0';      BufferB[3] = '\0';
+	strrev(BufferA);        strrev(BufferB);
+	return( strcmp(BufferA, BufferB) );
+   }
+   return 0;
+
+}
+
+
+
+char Rellena_path( char *path, char *half_path )
+{
+ char unidad[5], directorio[255], nombre[15], ext[6], flags;
+ char *ptr, cont, Buffer[255];
+
+	  flags = fnsplit( half_path, unidad, directorio, nombre, ext );
+	  *unidad = toupper( *unidad );
+	  if ( !(flags & DRIVE) )        *unidad=getdisk() + 'A';
+	  if ( !(flags & DIRECTORY)  )
+				       {
+					 if ( getcurdir( *unidad - 'A'+ 1, Buffer ) != -1 )
+                                           sprintf( directorio, "\\%s", Buffer );
+                                         else
+                                           sprintf( directorio, "\\NO ESTA DISPONIBLE" );
+				       }
+	  if ( strcmp( directorio, ":") == 0 )
+					 strcpy( directorio, "\\");
+
+	  if ( !(flags & FILENAME) )   { strcpy( nombre, "*"); strcpy( ext, ".*");  }
+
+	  fnmerge( path, unidad, directorio, nombre, ext );
+
+	  if ( strchr( path, '*' ) == NULL && strchr( path, '?' ) == NULL &&
+		findfirst( path, &ftmp, (FA_HIDDEN | FA_DIREC) ) == 0 )
+			if (ftmp.atrib & FA_DIREC)
+				    strcat(path, "\\*.*");
+
+ return *unidad;
+}
+
diff --git a/JDIR.EXE b/JDIR.EXE
new file mode 100644
index 0000000..f752161
Binary files /dev/null and b/JDIR.EXE differ
diff --git a/JDIRECT.H b/JDIRECT.H
new file mode 100644
index 0000000..102ea70
--- /dev/null
+++ b/JDIRECT.H
@@ -0,0 +1,88 @@
+/*
+   Este fichero forma parte del Curso de C
+   Copyright (C) 1991 Grupo Editorial Jackson
+   Todos los derechos reservados
+*/
+
+
+/* JDIRECT.H: cabecera para utilizar las funciones de b�squeda en los */
+/*            directorios MS-DOS tanto con Quick C como con Turbo C.  */
+
+
+#if     !defined(__JDIRECT_H_)      /*incluye s�lo si no est� ya incluido*/
+#define __JDIRECT_H_
+
+
+#include <dos.h>
+
+typedef struct {                    /*define el tipo FileInfo: <1> */
+    char reserved[21];              /*espacio reservado para DOS*/
+    char atrib;                     /*atributos del fichero*/
+    struct {                        /*tiempo de la �ltima modific. <2>*/
+        unsigned int sec   : 5;
+        unsigned int min   : 6;
+        unsigned int hours : 5;
+    } time;
+    struct {                        /*fecha de la �ltima modific. <3>*/
+        unsigned int day   : 5;
+        unsigned int month : 4;
+        unsigned int year  : 7;
+    } date;
+    long size;                      /*dimensiones del fichero*/
+    char name[13];                  /*nombre del fichero*/
+} FileInfo;
+
+
+#ifdef __TURBOC__                   /*compila si Turbo C*/
+
+  #include <dir.h>
+
+//  #define  FA_NORMAL  0             /*constante para ficheros 'normales'*/
+
+  /*convierte el tipo del puntero a datos del fichero: */
+
+  #define  findfirst(p,b,a)  findfirst(p,(struct ffblk *)b,a)       /*<4>*/
+  #define  findnext(b)       findnext((struct ffblk *)b)
+
+#else                               /*compila si Quick C*/
+
+  #include <direct.h>
+
+  #define  FA_NORMAL  _A_NORMAL     /*convierte nombres const. atributos: */
+  #define  FA_RDONLY  _A_RDONLY     /*s�lo lectura*/
+  #define  FA_HIDDEN  _A_HIDDEN     /*oculto*/
+  #define  FA_SYSTEM  _A_SYSTEM     /*de sistema*/
+  #define  FA_LABEL   _A_VOLID      /*etiqueta de volumen*/
+  #define  FA_DIREC   _A_SUBDIR     /*directorio*/
+  #define  FA_ARCH    _A_ARCH       /*archivo*/
+
+  /*convierte nombres funciones, cambia orden argumentos de findfirst: */
+
+  #define  findfirst(p,b,a)  (int)_dos_findfirst(p,a,(struct find_t *)b)
+  #define  findnext(b)       (int)_dos_findnext((struct find_t *)b)  /*<5>*/
+
+#endif                              /*fin opci�n Turbo C / Quick C*/
+
+
+#endif                              /*(si no incluido)*/
+
+
+/* Notas sobre DIRECT.H:
+
+    <1> FileInfo es una estructura que contiene informaci�n relativa a
+        un fichero, restituida por findfirst y findnext.
+    <2> La componente time es un int (16 bits) que contiene en realidad tres
+        valores, cada uno conservado en un grupo de bits adyacentes. El orden
+        de lectura de los bits depende del compilador, as� esta definici�n no
+        es port�til (aunque sirve tanto con Turbo C como con Quick C). Se
+        pod�an escribir tambi�n simplemente los tres campos de bits como
+        componentes de la estructura FileInfo (sin utilizar la estructura
+        time), pero hemos preferido subrayar que los tres campos de bits
+        forman en conjunto un int: esto puede ser �til por comodidad de
+        manipulaci�n (por ej. pasar time a una funci�n).
+    <3> Ver nota 2.
+    <4> Este cast, desgraciadamente, le deja al compilador sin posibilidades
+        de comprobar los errores. S�lo lo hemos utilizado para asegurar la
+        portabilidad entre Turbo C 2.0 y Quick C 2.0.
+    <5> Ver nota 4.
+*/
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c04dbe6
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+#JDIR 
+ 
+ 
+*05/09/1999* 
+ 
+ToDo: wwtcf? 
+ 
+ 
+![screenshot](/JDIR.png "Screenshot")