306 lines
8.0 KiB
C++
306 lines
8.0 KiB
C++
#include <ctype.h>
|
|
#include <direct.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <dir.h>
|
|
#include <dos.h>
|
|
#include <string.h>
|
|
#include <alloc.h>
|
|
#include <conio.h> // Para getch();
|
|
#include <graphics.h> // Para outtextxy(...); y cleardevice(...);
|
|
|
|
#include "make_bot.h" // Fuciones de MAKE_BOTON
|
|
|
|
#define __Modulo_Browser
|
|
#include "compacta.h"
|
|
|
|
extern BROWSER far *Browser;
|
|
|
|
// ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ
|
|
// ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ
|
|
// ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ
|
|
// ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ
|
|
// ÛßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßÛ
|
|
// Û F U N C I O N E S p a r a e l B R O W S E R Û
|
|
// ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ
|
|
// ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ
|
|
// ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ
|
|
// ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ
|
|
// ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ
|
|
// ÛÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÛ
|
|
|
|
void ReDraw_Browser(void)
|
|
{
|
|
int OLD_Brw = BrowserRow;
|
|
// 1§ Borramos pantalla de muestreo...
|
|
setfillstyle( SOLID_FILL, EGA_BLACK );
|
|
setcolor( EGA_BLACK );
|
|
// Muestreo de archivos
|
|
bar( 9, 9, 153, 173 );
|
|
|
|
// 3§ Mostramos los nuevos Archivos
|
|
for ( BrowserRow = 0; BrowserRow < 16; BrowserRow++)
|
|
if ( ( BrowserRow + BrowserTop ) < maxfiles )
|
|
ShowHideBrowserRow( HIDE );
|
|
BrowserRow = OLD_Brw;
|
|
}
|
|
|
|
void Fill_Directory(void)
|
|
{
|
|
char Buffer[180];
|
|
// Recuadro del directorio
|
|
// 1§ Borramos pantalla de muestreo...
|
|
setfillstyle( SOLID_FILL, EGA_BLACK );
|
|
setcolor( EGA_BLACK );
|
|
bar( 5, 182, 179, 195 );
|
|
|
|
setcolor( EGA_YELLOW );
|
|
getcwd( Buffer, 180 );
|
|
if ( strlen( Buffer ) > 28 )
|
|
{
|
|
// Acorta el Buffer poniendo al principio U:\...[DIRECTORIO]
|
|
char Buffer1[30];
|
|
|
|
// Primero copiamos en Buffer1 los 22 ultimos caracteres de Buffer
|
|
strncpy( Buffer1, strrev(Buffer), 22 ); Buffer1[22] = NULL;
|
|
strrev( Buffer1 );
|
|
// Despues conservamos solo de Buffer [Und][:][\]
|
|
strrev(Buffer); Buffer[3] = NULL;
|
|
// Y agregamos [...]
|
|
strcat( Buffer, "..." );
|
|
// Ya podemos unirlo todo
|
|
strcat( Buffer, Buffer1 );
|
|
//
|
|
}
|
|
|
|
settextstyle( SMALL_FONT, HORIZ_DIR, 4 );
|
|
outtextxy( 7, 184, Buffer );
|
|
|
|
}
|
|
|
|
void ShowHideBrowserRow( char Hide_Show )
|
|
{
|
|
|
|
char Buffer[80];
|
|
char Longitud[80];
|
|
|
|
settextstyle( SMALL_FONT, HORIZ_DIR, 4 );
|
|
|
|
|
|
if ( Hide_Show == HIDE )
|
|
{
|
|
setfillstyle( SOLID_FILL, EGA_BLACK );
|
|
bar( 9, ( 10 + ( BrowserRow * 10 ) ), 153, ( ( 9 + 10 ) + ( BrowserRow * 10 ) ) );
|
|
switch( Browser[BrowserTop+BrowserRow].attrs )
|
|
{
|
|
case FA_DIREC:
|
|
setcolor( EGA_CYAN );
|
|
break;
|
|
case 255:
|
|
setcolor( EGA_MAGENTA );
|
|
break;
|
|
default:
|
|
setcolor( EGA_WHITE );
|
|
}
|
|
} else {
|
|
|
|
switch( Browser[BrowserTop+BrowserRow].attrs )
|
|
{
|
|
case FA_DIREC:
|
|
setfillstyle( SOLID_FILL, EGA_CYAN );
|
|
// setcolor( EGA_CYAN );
|
|
break;
|
|
case 255:
|
|
setfillstyle( SOLID_FILL, EGA_MAGENTA );
|
|
// setcolor( EGA_MAGENTA );
|
|
break;
|
|
default:
|
|
setfillstyle( SOLID_FILL, EGA_WHITE );
|
|
// setcolor( EGA_WHITE );
|
|
}
|
|
bar( 9, ( 10 + ( BrowserRow * 10 ) ), 153, ( ( 9 + 10 ) + ( BrowserRow * 10 ) ) );
|
|
setcolor( EGA_BLACK );
|
|
}
|
|
|
|
|
|
outtextxy( 10, ( 9 + ( BrowserRow * 10 ) ), Browser[BrowserTop+BrowserRow].Fichero );
|
|
formatea_long( Browser[BrowserTop+BrowserRow].Longitud, Longitud );
|
|
switch( Browser[BrowserTop+BrowserRow].attrs )
|
|
{
|
|
case FA_DIREC:
|
|
sprintf ( Buffer, " DIRECTORIO", Longitud );
|
|
break;
|
|
case 255:
|
|
sprintf ( Buffer, " < UNIDAD >", Longitud );
|
|
break;
|
|
default:
|
|
sprintf ( Buffer, " %10s", Longitud );
|
|
}
|
|
outtextxy( 10, ( 9 + ( BrowserRow * 10 ) ), Buffer );
|
|
}
|
|
|
|
void DownBrowser(void)
|
|
{
|
|
|
|
// ¨¨ Estoy en la linea fisica 000 ???
|
|
if ( (BrowserRow + BrowserTop) != (maxfiles - 1) ) {
|
|
|
|
// Linea 0, Baja Con retroceso multiple
|
|
if ( BrowserRow == 15 ) {
|
|
BrowserTop += 16;
|
|
if ( (BrowserTop + BrowserRow) > maxfiles ) BrowserRow = 0;
|
|
while ( (BrowserTop + BrowserRow) > maxfiles ) BrowserTop--;
|
|
BrowserRow = 0;
|
|
ReDraw_Browser();
|
|
ShowHideBrowserRow( SHOW );
|
|
} else {
|
|
ShowHideBrowserRow( HIDE );
|
|
BrowserRow++;
|
|
ShowHideBrowserRow( SHOW );
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
void UpBrowser(void)
|
|
{
|
|
|
|
// ¨¨ Estoy en la linea fisica 000 ???
|
|
if ( (BrowserRow + BrowserTop) != 0 ) {
|
|
|
|
// Linea 0, Baja Con retroceso multiple
|
|
if ( BrowserRow == 0 ) {
|
|
BrowserTop -= 16;
|
|
if ( BrowserTop < 0 ) BrowserTop = 0;
|
|
BrowserRow = 0;
|
|
ReDraw_Browser();
|
|
BrowserRow = 15;
|
|
ShowHideBrowserRow( SHOW );
|
|
} else {
|
|
ShowHideBrowserRow( HIDE );
|
|
BrowserRow--;
|
|
ShowHideBrowserRow( SHOW );
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
int SelectBrowser(void)
|
|
{
|
|
int RETURN = 1;
|
|
|
|
switch( Browser[BrowserTop+BrowserRow].attrs )
|
|
{
|
|
case FA_DIREC:
|
|
chdir( Browser[BrowserTop+BrowserRow].Fichero );
|
|
BrowserRow = BrowserTop = 0;
|
|
// 2§ Realizamos un Scaneo del Directorio
|
|
BrowserTop = 0; BrowserRow = 0;
|
|
RasterScan();
|
|
Fill_Directory();
|
|
ReDraw_Browser();
|
|
ShowHideBrowserRow( SHOW );
|
|
RETURN = 0;
|
|
break;
|
|
case 255:
|
|
erroroccurred=0;
|
|
olddisk=getdisk();
|
|
setdisk( (Browser[BrowserTop+BrowserRow].Fichero[0] - 'A') );
|
|
if (erroroccurred) {
|
|
setdisk(olddisk);
|
|
} else {
|
|
BrowserRow = BrowserTop = 0;
|
|
// 2§ Realizamos un Scaneo del Directorio
|
|
BrowserTop = 0; BrowserRow = 0;
|
|
RasterScan();
|
|
Fill_Directory();
|
|
ReDraw_Browser();
|
|
ShowHideBrowserRow( SHOW );
|
|
}
|
|
RETURN = 0;
|
|
break;
|
|
default:
|
|
RETURN = 1;
|
|
}
|
|
|
|
return RETURN;
|
|
|
|
}
|
|
|
|
unsigned int RasterScan(void) {
|
|
struct ffblk ffblk;
|
|
char done=0;
|
|
unsigned int olddisk;
|
|
maxfiles = 0;
|
|
unsigned char i;
|
|
|
|
// build a disk drive availiable list
|
|
olddisk=getdisk();
|
|
for (i=1;i<27;i++) if (_chdrive(i) == 0)
|
|
{
|
|
sprintf( Browser[maxfiles].Fichero, "%c:", (char)('A' + i - 1) );
|
|
Browser[maxfiles].Longitud=0;
|
|
Browser[maxfiles].attrs=255; // Unidad
|
|
if (ffblk.ff_attrib & 16) Browser[maxfiles].Longitud=0;
|
|
maxfiles++;
|
|
}
|
|
setdisk(olddisk);
|
|
|
|
// drivelist[2]='N'; //stop access to B drive until I sort out pahntom dive probs
|
|
//Ok, Drive B may be a phantom drive. If you try to access drive B, then
|
|
//the program looses controll. Bummer!
|
|
// needs debugging. (always ignores drive b...)
|
|
// asm int 0x11
|
|
// asm mov equipmentlist,ax
|
|
// drivelist[2]='N';
|
|
// if ((equipmentlist & 16)) drivelist[2]='Y';
|
|
|
|
|
|
done = findfirst("*.*",&ffblk,FA_DIREC);
|
|
while (!done) {
|
|
if (ffblk.ff_attrib == 0x10) {
|
|
strcpy(Browser[maxfiles].Fichero,ffblk.ff_name);
|
|
Browser[maxfiles].Longitud=ffblk.ff_fsize;
|
|
Browser[maxfiles].attrs=ffblk.ff_attrib;
|
|
if (ffblk.ff_attrib & 16) Browser[maxfiles].Longitud=0;
|
|
maxfiles++;
|
|
}
|
|
done = findnext(&ffblk);
|
|
if (maxfiles==200) done=!done; //stop to prevent internal crashes.
|
|
}
|
|
|
|
done = findfirst(Comodin,&ffblk,FA_DIREC);
|
|
while (!done) {
|
|
if (ffblk.ff_attrib != 0x10) {
|
|
strcpy(Browser[maxfiles].Fichero,ffblk.ff_name);
|
|
Browser[maxfiles].Longitud=ffblk.ff_fsize;
|
|
Browser[maxfiles].attrs=ffblk.ff_attrib;
|
|
if (ffblk.ff_attrib & 16) Browser[maxfiles].Longitud=0;
|
|
maxfiles++;
|
|
}
|
|
done = findnext(&ffblk);
|
|
if (maxfiles==200) done=!done; //stop to prevent internal crashes.
|
|
}
|
|
return maxfiles;
|
|
}
|
|
|
|
void interrupt critical_error_handler(.../*__CPPARGS*/) {
|
|
asm push ax //preserve only modified register
|
|
asm mov ax,di //di holds error code ranging from 0 to 0x0c
|
|
// asm inc ax
|
|
asm mov erroroccurred,ax //increase erroroccurred for ease of programming
|
|
asm mov al,0x20
|
|
asm out 0x20,al //send interrupt clear flag
|
|
// asm pushf // I think I dont need this line in....
|
|
asm pop ax //restore ax
|
|
}
|
|
|
|
void startceh() {
|
|
old_int24 = _dos_getvect( 0x24 );
|
|
_dos_setvect( 0x24, critical_error_handler);
|
|
}
|
|
|
|
void stopceh() {
|
|
_dos_setvect(0x24,old_int24);
|
|
}
|