From ba4072119327cde975e2682854c13431848a025a Mon Sep 17 00:00:00 2001 From: jdg Date: Wed, 8 Sep 2021 21:24:42 +0200 Subject: [PATCH] First commit 05/09/1999 --- JDIR.BAK | 1013 ++++++++++++++++++++++++++++++++++++++++++++++++++++ JDIR.CPP | 1015 +++++++++++++++++++++++++++++++++++++++++++++++++++++ JDIR.EXE | Bin 0 -> 52065 bytes JDIRECT.H | 88 +++++ README.md | 9 + 5 files changed, 2125 insertions(+) create mode 100644 JDIR.BAK create mode 100644 JDIR.CPP create mode 100644 JDIR.EXE create mode 100644 JDIRECT.H create mode 100644 README.md 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 +#include +#include +#include +#include +#include +#include +#include + +#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(" "); + 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(" "); 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(" "); 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(" \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(" "); 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(" "); 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(" "); 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(" \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 +#include +#include +#include +#include +#include +#include +#include + +#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(" "); + 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(" "); 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(" "); 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(" \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(" "); 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(" "); 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(" "); 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(" \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 0000000000000000000000000000000000000000..f7521613b0d8ccce340672804dc6853d28a8146a GIT binary patch literal 52065 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 + +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 + +// #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 + + #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")