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