First commit 11/11/1991
This commit is contained in:
commit
27e54671f3
306
BROWSER.CPP
Normal file
306
BROWSER.CPP
Normal file
@ -0,0 +1,306 @@
|
||||
#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 "..\..\jd_lib\f_lib\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);
|
||||
}
|
||||
ƒût÷ë‹„ƒût÷ûˆƒût÷니ƒût÷ûÀ>€ÿtTãRÿ6ž |