home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d6xx
/
d658
/
view.lha
/
View
/
Source
/
Main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-15
|
32KB
|
1,078 lines
/*-- AutoRev header do NOT edit!
*
* Program : Main.c
* Copyright : Copyright © 1991-92 Jaba Development
* Author : Jan van den Baard
* Creation Date : 04-Apr-92
* Current version : 2.0
* Translator : Dice v2.06.40
*
* REVISION HISTORY
*
* Date Version Comment
* --------- ------- ------------------------------------------
* 04-Apr-92 2.0 Main program. (rewrite)
*
*-- REV_END --*/
#include "View.h"
struct WBStartup *WBenchMsg = NULL;
UBYTE *CX_PRIORITY = "CX_PRIORITY";
UBYTE *CX_POPWINDOW = "CX_POPUP";
UBYTE *CX_VIEW = "VIEW";
UBYTE *CX_FLUSH = "FLUSH";
UBYTE *CX_QUIT = "QUIT";
WORD CX_DEF_PRIORITY = 0;
UBYTE *CX_DEF_POPWINDOW = "YES";
UBYTE *CX_DEF_VIEW = "lalt lcommand v";
UBYTE *CX_DEF_FLUSH = "lalt lcommand f";
UBYTE *CX_DEF_QUIT = "lalt lcommand q";
UBYTE *vwVersion = "\0$VER: " CX_NAME " 37.45 (16.4.92)";
struct MsgPort *vwCxPort = NULL;
struct MsgPort *vwIdPort = NULL;
ULONG vwCxMask = NULL;
ULONG vwIdMask = NULL;
UBYTE vwDopen = FALSE;
UBYTE vwIsOpen = FALSE;
UBYTE vwFsu = TRUE;
UBYTE vwCustom = FALSE;
UWORD vwTabSize;
CxObj *vwBroker = NULL;
UBYTE *vwQuitStr, *vwFlushStr, *vwViewStr;
struct NewBroker vwNewBroker = {
NB_VERSION, CX_NAME, CX_TITLE, CX_DESCRIPTION,
NBU_NOTIFY | NBU_UNIQUE, COF_SHOW_HIDE, NULL, 0
};
struct Window *vwWindow = NULL;
struct Screen *vwScreen = NULL;
struct AsciiText *vwText = NULL;
struct RastPort *vwRPort;
struct TextFont *vwFont;
struct Line *vwFirst;
struct Line *vwLast;
struct Process *vwProc;
struct StringScan vwSearch;
struct TextBlock vwBlocks[ 10 ];
APTR vwWdPtr;
#ifdef __DETACH
ULONG *vwArgs;
ULONG vwWBArgs[14] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
UBYTE *_procname = "ViewD2.0";
UBYTE *_template = "Name,CX_PRIORITY/K/N,CX_POPUP/K,VIEW/K,FLUSH/K,QUIT/K,LACE/S,SUPER/S,PRODUCTIVITY/S,A2024TENHZ/S,A2024FIFTEENHZ/S,NOPOINTER/S,SCROLL/S,TABS/K/N";
UBYTE *_exthelp = NULL;
LONG _stack = 4096L;
LONG _priority = NULL;
LONG _BackGroundIO = NULL;
#else
ULONG vwArgs[14] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
struct RDArgs vwIArgs = { { 0, 0, 0}, 0, 0, 0, 0, 0 };
struct RDArgs *vwFArgs = NULL;
UBYTE *Template = "Name,CX_PRIORITY/K/N,CX_POPUP/K,VIEW/K,FLUSH/K,QUIT/K,LACE/S,SUPER/S,PRODUCTIVITY/S,A2024TENHZ/S,A2024FIFTEENHZ/S,NOPOINTER/S,SCROLL/S,TABS/K/N";
#endif
UBYTE vwFound = FALSE;
UBYTE vwPrinting = FALSE;
UBYTE vwErr = FALSE;
ULONG vwSignal, vwShown, vwNum, vwId;
UWORD vwYMax, vwMode, vwPMode, vwMaxLin, vwPMark;
UWORD vwDriPens = ~0;
UBYTE vwPath[ 256 ];
UBYTE vwPatt[ 32 ];
UBYTE vwFile[ 32 ];
UBYTE vwName[ 512 ];
UBYTE vwFBuf[ 256 ];
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct GadToolsBase *GadToolsBase;
extern struct UtilityBase *UtilityBase;
extern UBYTE StdStr[];
extern UBYTE ClearStr[];
extern UBYTE MoveStr[];
extern UBYTE ScrUpStr[];
extern UBYTE ScrDnStr[];
extern UBYTE ResStr[];
extern ULONG vwClass;
extern UWORD vwCode, vwQualifier;
extern __far struct Custom custom;
struct CxBase *CxBase = NULL;
struct IconBase *IconBase = NULL;
struct NoFragBase *NoFragBase = NULL;
struct PPBase *PPBase = NULL;
struct ReqToolsBase *ReqToolsBase = NULL;
Prototype void OpenLibraries( void );
Prototype void CloseLibraries( void );
Prototype void Quit( long );
Prototype void OpenDisplay( void );
Prototype void CloseDisplay( void );
Prototype void QuitCommodity( void );
Prototype void myMain( long );
Prototype void MainLoop( void );
Prototype void SetupCustom( void );
Prototype void QuitCommodity( void );
Prototype void SetupCommodity( void );
Prototype void CheckDirExtension( UBYTE * );
Prototype void LoadFile( long );
Prototype void DisplayText( void );
Prototype void MoveTo( UBYTE c, UBYTE r );
Prototype void LineDown( void );
Prototype void LineUp( void );
Prototype void Top( void );
Prototype void Bottom( void );
Prototype void PageDown( void );
Prototype void PageUp( void );
Prototype void Percentage( void );
Prototype void BytesShown( void );
Prototype void InfoLine( void );
Prototype void ErrorLine( UBYTE * );
Prototype void Error( UBYTE * );
Prototype long IsAsciiChar( UBYTE );
Prototype long CheckAscii( UBYTE * );
Prototype void PrintFound( UWORD );
Prototype long CheckPP( void );
Prototype long CountEsc( struct Line *, long );
Prototype long ParseName( void );
Prototype long IsItADir( void );
Prototype void _waitwbmsg( void );
void OpenLibraries( void )
{
NoFragBase = ( struct NoFragBase * ) OpenLibrary( "nofrag.library", NOFRAG_VERSION );
CxBase = ( struct CxBase * ) OpenLibrary( "commodities.library", 37L );
IconBase = ( struct IconBase * ) OpenLibrary( "icon.library", 36L );
PPBase = ( struct PPBase * ) OpenLibrary( "powerpacker.library", 34L );
ReqToolsBase = ( struct ReqToolsBase * ) OpenLibrary( REQTOOLSNAME, REQTOOLSVERSION );
if ( ! NoFragBase || ! CxBase || ! IconBase || ! ReqToolsBase )
Quit( 20L );
}
void CloseLibraries( void )
{
if ( ReqToolsBase ) CloseLibrary(( struct Library * )ReqToolsBase );
if ( PPBase ) CloseLibrary(( struct Library * )PPBase );
if ( IconBase ) CloseLibrary( IconBase );
if ( CxBase ) CloseLibrary( CxBase );
if ( NoFragBase ) CloseLibrary( NoFragBase );
}
void OpenDisplay( void )
{
struct DimensionInfo disp;
struct Screen *lock;
ULONG modes, id;
UWORD width, height, depth = 2;
if ( ! vwCustom ) {
if ( lock = LockPubScreen( "Workbench" )) {
width = lock->Width;
height = lock->Height;
modes = lock->ViewPort.Modes;
depth = lock->BitMap.Depth;
id = GetVPModeID( &lock->ViewPort );
if ( vwArgs[ 6 ] )
id |= LORESLACE_KEY;
UnlockPubScreen( NULL, lock );
} else
Quit( 20L );
} else
id = vwId;
GetDisplayInfoData( NULL, ( UBYTE * )&disp, sizeof( struct DimensionInfo ), DTAG_DIMS, id );
width = disp.TxtOScan.MaxX + 1;
height = disp.TxtOScan.MaxY + 1;
if ( ! ( vwScreen = OpenScreenTags( NULL, SA_Pens, &vwDriPens,
SA_DisplayID, id,
SA_Overscan, OSCAN_TEXT,
SA_Width, width,
SA_Height, height,
SA_Depth, depth,
TAG_DONE )))
Quit( 20L );
if ( ! ( vwWindow = OpenWindowTags( NULL, WA_RptQueue, 1,
WA_Width, width,
WA_Height, height,
WA_IDCMP, IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW | IDCMP_INACTIVEWINDOW,
WA_Flags, WFLG_ACTIVATE | WFLG_RMBTRAP | WFLG_SMART_REFRESH | WFLG_BORDERLESS | WFLG_BACKDROP,
WA_CustomScreen, vwScreen,
TAG_DONE )))
Quit( 20L );
ShowTitle( vwScreen, FALSE );
if ( vwArgs[ 11 ] ) OFF_SPRITE;
vwIdPort = vwWindow->UserPort;
vwIdMask = ( 1L << vwIdPort->mp_SigBit );
vwWdPtr = vwProc->pr_WindowPtr;
vwProc->pr_WindowPtr = (APTR)vwWindow;
vwRPort = vwWindow->RPort;
vwFont = vwRPort->Font;
vwMaxLin = ( height / vwFont->tf_YSize ) - 1;
sprintf(( char * )&StdStr[ 7 ], "%02.2ldy", vwFont->tf_YSize );
if ( ! OpenConsole())
Quit( 20L );
vwIsOpen = TRUE;
if ( ! vwText ) {
if ( vwFsu ) {
if ( strlen( vwName )) {
if ( ! ParseName()) LoadFile( TRUE );
else LoadFile( FALSE );
} else
LoadFile( TRUE );
} else
LoadFile( TRUE );
}
if ( vwText ) {
DisplayText();
BytesShown();
InfoLine();
} else
InfoLine();
vwFsu = FALSE;
}
long IsItADir( void )
{
struct FileInfoBlock *fib;
BPTR lock;
long ret = -1L;
if( fib = ( struct FileInfoBlock * )AllocDosObjectTags( DOS_FIB, TAG_DONE )) {
if( lock = Lock(( char * )vwName, ACCESS_READ )) {
Examine( lock, fib );
ret = fib->fib_DirEntryType;
UnLock( lock );
}
FreeDosObject( DOS_FIB, fib );
}
return(ret);
}
long ParseName( void )
{
char *str;
long len;
if( strlen( vwName )) {
if( str = PathPart( vwName )) {
if ( IsItADir() < 0 ) {
if ( *str == '/' ) str++;
strcpy( vwFile, str );
len = strlen( vwName ) - strlen( vwFile );
strcpy( vwPath, vwName );
vwPath[ len ] = 0;
} else
strcpy( vwPath, vwName );
} else
strcpy( vwFile, vwName );
}
return( strlen( vwFile ));
}
void CloseDisplay( void )
{
CloseConsole();
if ( vwArgs[ 11 ] ) ON_SPRITE;
if ( vwWindow ) {
vwProc->pr_WindowPtr = vwWdPtr;
ClearMsgPort( vwIdPort );
CloseWindow( vwWindow );
vwWindow = NULL;
vwIdPort = NULL;
vwIdMask = NULL;
}
if ( vwScreen ) {
CloseScreen( vwScreen );
vwScreen = NULL;
}
vwIsOpen = FALSE;
}
void Quit( long code )
{
ON_SPRITE;
CloseDisplay();
QuitCommodity();
if ( vwText ) FreeAscii( vwText );
CloseLibraries();
#ifndef __DETACH
if ( vwFArgs ) FreeArgs( vwFArgs );
_exit( code );
#else
exit( code );
#endif
}
void SetupCommodity( void )
{
CxObj *tmp;
struct WBArg *wba;
char *pw, **ttypes;
WORD pri;
if ( WBenchMsg ) {
ttypes = ArgArrayInit( NULL, ( UBYTE ** )WBenchMsg );
pri = ArgInt( ttypes, CX_PRIORITY, CX_DEF_PRIORITY );
pw = ArgString( ttypes, CX_POPWINDOW, CX_DEF_POPWINDOW );
vwViewStr = ArgString( ttypes, CX_VIEW, CX_DEF_VIEW );
vwFlushStr = ArgString( ttypes, CX_FLUSH, CX_DEF_FLUSH );
vwQuitStr = ArgString( ttypes, CX_QUIT, CX_DEF_QUIT );
vwArgs[ 6 ] = ArgString( ttypes, "LACE", NULL );
vwArgs[ 7 ] = ArgString( ttypes, "SUPER", NULL );
vwArgs[ 8 ] = ArgString( ttypes, "PRODUCTIVITY", NULL );
vwArgs[ 9 ] = ArgString( ttypes, "A2024TENHZ", NULL );
vwArgs[ 10] = ArgString( ttypes, "A2024FIFTEENHZ", NULL );
vwArgs[ 11] = ArgString( ttypes, "NOPOINTER", NULL );
vwArgs[ 12] = ArgString( ttypes, "SCROLL", NULL );
vwTabSize = ArgInt( ttypes, "TABS", ANSITAB );
wba = WBenchMsg->sm_ArgList;
if ( WBenchMsg->sm_NumArgs > 1 ) {
wba++;
CurrentDir( wba->wa_Lock );
if ( wba->wa_Name ) strcpy( vwName, ( char * )wba->wa_Name );
}
} else {
if ( vwArgs[ 0 ] ) strcpy( vwName, (char *)vwArgs[ 0 ] );
if ( vwArgs[ 1 ] ) pri = vwArgs[ 1 ];
else pri = CX_DEF_PRIORITY;
if ( vwArgs[ 2 ] ) pw = ( char * )vwArgs[ 2 ];
else pw = CX_DEF_POPWINDOW;
if ( vwArgs[ 3 ] ) vwViewStr = ( char * )vwArgs[ 3 ];
else vwViewStr = CX_DEF_VIEW;
if ( vwArgs[ 4 ] ) vwFlushStr = ( char * )vwArgs[ 4 ];
else vwFlushStr = CX_DEF_FLUSH;
if ( vwArgs[ 5 ] ) vwQuitStr = ( char * )vwArgs[ 5 ];
else vwQuitStr = CX_DEF_QUIT;
if ( vwArgs[ 13 ]) vwTabSize = (UWORD)(*((ULONG *)vwArgs[ 13 ]));
else vwTabSize = ANSITAB;
}
SetupCustom();
if ( ! Stricmp( pw, CX_DEF_POPWINDOW )) vwDopen = TRUE;
else vwDopen = FALSE;
if ( ! ( vwCxPort = CreateMsgPort()))
Quit( RETURN_FAIL );
if ( vwTabSize < MINTAB ) vwTabSize = MINTAB;
else if ( vwTabSize > MAXTAB ) vwTabSize = MAXTAB;
vwNewBroker.nb_Pri = pri;
vwNewBroker.nb_Port = vwCxPort;
vwCxMask = ( 1L << vwCxPort->mp_SigBit );
if ( ! ( vwBroker = CxBroker( &vwNewBroker, NULL )))
Quit( RETURN_FAIL );
if ( ! ( tmp = HotKey( vwQuitStr, vwCxPort, CXC_QUIT )))
Quit( RETURN_FAIL );
AttachCxObj( vwBroker, tmp );
if ( ! ( tmp = HotKey( vwFlushStr, vwCxPort, CXC_FLUSH )))
Quit( RETURN_FAIL );
AttachCxObj( vwBroker, tmp );
if ( ! ( tmp = HotKey( vwViewStr, vwCxPort, CXC_VIEW )))
Quit( RETURN_FAIL );
AttachCxObj( vwBroker, tmp );
if( CxObjError( vwBroker ))
Quit( RETURN_FAIL );
if(WBenchMsg)
ArgArrayDone();
CxOn( vwBroker );
}
void SetupCustom( void )
{
if ( vwArgs[ 7 ] && ! ModeNotAvailable( DEFAULT_MONITOR_ID | SUPER_KEY )) {
vwId = DEFAULT_MONITOR_ID | SUPER_KEY;
vwCustom = TRUE;
} else if ( vwArgs[ 8 ] && ! ModeNotAvailable( DEFAULT_MONITOR_ID | VGAPRODUCT_KEY )) {
vwId = DEFAULT_MONITOR_ID | VGAPRODUCT_KEY;
vwCustom = TRUE;
} else if ( vwArgs[ 9 ] && ! ModeNotAvailable( DEFAULT_MONITOR_ID | A2024TENHERTZ_KEY )) {
vwId = DEFAULT_MONITOR_ID | A2024TENHERTZ_KEY;
vwCustom = TRUE;
} else if ( vwArgs[ 10 ] && ! ModeNotAvailable( DEFAULT_MONITOR_ID | A2024FIFTEENHERTZ_KEY )) {
vwId = DEFAULT_MONITOR_ID | A2024FIFTEENHERTZ_KEY;
vwCustom = TRUE;
} else
vwCustom = FALSE;
if ( vwArgs[ 6 ] ) vwId |= LORESLACE_KEY;
}
void QuitCommodity( void )
{
if ( vwBroker ) DeleteCxObjAll( vwBroker );
if( vwCxPort ) {
ClearMsgPort( vwCxPort );
DeleteMsgPort( vwCxPort );
}
}
void MainLoop( void )
{
struct Message *msg;
struct IntuiMessage *imsg;
ULONG sig, type, id, class;
BOOL running = TRUE;
if ( vwDopen ) OpenDisplay();
do {
if ( vwIsOpen) Percentage();
sig = Wait( SIGBREAKF_CTRL_C | vwCxMask | vwIdMask );
if (( sig & SIGBREAKF_CTRL_C ) == SIGBREAKF_CTRL_C ) {
if ( ! vwPrinting ) running = FALSE;
} else if (( sig & vwCxMask ) == vwCxMask ) {
while (( msg = (struct Message *)GetMsg( vwCxPort ))) {
id = CxMsgID(( CxMsg * )msg );
type = CxMsgType(( CxMsg * )msg );
ReplyMsg( msg );
switch( type ) {
case CXM_IEVENT:
switch( id ) {
case CXC_VIEW:
if ( ! vwIsOpen )
OpenDisplay();
else {
ScreenToFront( vwScreen );
if( vwArgs[ 11 ] ) OFF_SPRITE;
}
break;
case CXC_FLUSH:
if ( ! vwIsOpen ) {
if ( vwText ) FreeAscii( vwText );
vwText = NULL;
}
break;
case CXC_QUIT:
if( ! vwIsOpen ) {
if ( ! vwPrinting ) running = FALSE;
}
break;
}
break;
case CXM_COMMAND:
switch( id ) {
case CXCMD_KILL:
if ( ! vwPrinting ) running = FALSE;
break;
case CXCMD_DISABLE:
CxOff( vwBroker );
break;
case CXCMD_ENABLE:
CxOn( vwBroker );
break;
case CXCMD_UNIQUE:
case CXCMD_APPEAR:
if ( ! vwIsOpen )
OpenDisplay();
else {
ScreenToFront( vwScreen );
if( vwArgs[ 11 ] ) OFF_SPRITE;
}
break;
case CXCMD_DISAPPEAR:
if ( vwIsOpen )
CloseDisplay();
break;
}
break;
}
}
} else if ( vwIsOpen ) {
if (( sig & vwIdMask ) == vwIdMask ) {
while ( ReadMsgPort( vwWindow->UserPort )) {
Percentage();
switch( vwClass ) {
case IDCMP_RAWKEY:
HandleKeyboard( vwCode, vwQualifier );
break;
case IDCMP_ACTIVEWINDOW:
if ( vwArgs[ 11 ] ) OFF_SPRITE;
break;
case IDCMP_INACTIVEWINDOW:
if ( vwArgs[ 11 ] ) ON_SPRITE;
break;
}
if ( ! vwIsOpen ) break;
}
}
}
} while( running == TRUE );
if( vwIsOpen )
CloseDisplay();
CxOff( vwBroker );
Quit(NULL);
}
void CheckDirExtension( UBYTE *name )
{
UWORD len = strlen( name );
if ( len ) {
if ( name[ len - 1 ] != ':' && name[ len - 1 ] != '/' )
strcat( name, "/" );
}
}
void LoadFile( long request )
{
UBYTE *ppdata, *fname;
ULONG pplen;
BPTR ppout;
BOOL pptemp = FALSE, ret = TRUE;
LONG pperr;
struct BuffIO *file = NULL;
struct Line *line;
ErrorLine( CX_NAME " v" CX_VERSION " © 1991-92 Jaba Development" );
if ( request ) {
if ( vwArgs[ 11 ] ) ON_SPRITE;
ret = FileRequest( vwWindow, "Select file to load...", vwFile, vwPath, vwPatt, FR_LOAD );
if ( vwArgs[ 11 ] ) OFF_SPRITE;
}
if ( ret ) {
if ( vwText ) {
FreeAscii( vwText );
vwText = NULL;
ClrBlk();
}
Inform( ClearStr );
Inform( StdStr );
Busy();
if ( CheckPP()) {
if ( PPBase ) {
ErrorLine( "Loading and decrunching file..." );
if ( vwArgs[ 11 ] ) ON_SPRITE;
if (( pperr = ppLoadData( vwName, DECR_POINTER, MEMF_PUBLIC, &ppdata, &pplen, NULL )) < 0 ) {
switch( pperr ) {
case PP_OPENERR:
Error( "PPLib: Can't open the file." );
break;
case PP_READERR:
Error("PPLIB: Read error.");
break;
case PP_NOMEMORY:
Error("PPLIB: Out of memory.");
break;
case PP_PASSERR:
Error("PPLIB: Incorrect password.");
break;
case PP_UNKNOWNPP:
Error("PPLIB: Unknown PowerPacker version.");
break;
}
return;
}
if ( vwArgs[ 11 ] ) OFF_SPRITE;
fname = "T:view.pp.tmp.v" CX_VERSION ".decrunched";
if ( ppout = Open( fname, MODE_NEWFILE )) {
if ( Write( ppout, ppdata, pplen ) != pplen )
Error( "Error writing temporary file." );
else
pptemp = TRUE;
Close( ppout );
} else
Error( "Can't open temporary file." );
if ( ppdata ) FreeMem( ppdata, pplen );
if ( ! pptemp ) goto ppCleanUp;
} else
Error( "Can't load powerpacker files\nwithout the powerpacker.library." );
} else {
ErrorLine( "Loading file..." );
fname = vwName;
}
if ( CheckAscii( fname )) {
if ( vwText = AllocAscii( vwTabSize, MaxCol() + 1, ATF_SkipEsc | ATF_TabConvert )) {
if ( file = BOpen( fname, MODE_OLDFILE )) {
while( line = BGetS( file, vwText ))
AddTail(( struct List * )vwText, ( struct Node * )line );
switch( BIoErr( file )) {
case ASE_READ:
Error( "Read error." );
goto CleanExit;
case ASE_NOMEM:
Error( "Out of memory." );
goto CleanExit;
}
BClose( file );
vwFirst = vwText->First;
vwFound = FALSE;
DisplayText();
BytesShown();
InfoLine();
goto ppCleanUp;
} else {
Error( "Could not open the file." );
goto CleanExit;
}
} else {
Error( "Out of memory." );
goto CleanExit;
}
} else {
Error( "File contains binary." );
goto CleanExit;
}
} else goto ppCleanUp;
CleanExit:
if ( vwText ) {
FreeAscii( vwText );
vwText = NULL;
}
if ( file ) BClose( file );
ppCleanUp:
ClearMsgPort( vwIdPort );
Ready();
if ( pptemp ) DeleteFile( fname );
}
void DisplayText( void )
{
UWORD y = 1, i = 0;
if ( ! vwText ) return;
for( vwLast = vwFirst; i < vwMaxLin; i++, vwLast = vwLast->Next, y++ ) {
if ( vwLast == vwText->Last->Next ) break;
MoveTo( 1 , y );
Display( vwLast );
if ( vwFound && vwLast == vwSearch.Line ) PrintFound( y );
}
vwYMax = y - 1;
}
void MoveTo( UBYTE c, UBYTE r )
{
sprintf((char *)&MoveStr[ 1 ], "%02ld;%02ldH", r, c );
Inform( MoveStr );
}
void LineDown( void )
{
if ( ! vwText ) return;
if ( vwLast == vwText->Last->Next ) return;
vwFirst = vwFirst->Next;
Inform( ScrUpStr );
MoveTo( 1, vwYMax );
Display( vwLast );
vwShown += vwLast->Size;
if ( vwFound && vwLast == vwSearch.Line ) PrintFound( vwYMax );
vwLast = vwLast->Next;
}
void LineUp( void )
{
if ( ! vwText ) return;
if ( vwFirst == vwText->First ) return;
vwLast = vwLast->Prev;
vwShown -= vwLast->Size;
vwFirst = vwFirst->Prev;
Inform( ScrDnStr );
MoveTo( 1, 1 );
Display( vwFirst );
if ( vwFound && vwFirst == vwSearch.Line ) PrintFound( 1 );
}
void Top( void )
{
if ( ! vwText ) return;
if ( vwFirst == vwText->First ) return;
vwFirst = vwText->First;
Inform( ClearStr );
DisplayText();
BytesShown();
}
void Bottom( void )
{
UWORD i;
if ( ! vwText ) return;
if ( vwLast == vwText->Last->Next ) return;
vwLast = vwFirst = vwText->Last;
for( i = 1; i < vwMaxLin; i++ )
vwFirst = vwFirst->Prev;
vwShown = vwText->NumBytes;
Inform( ClearStr );
DisplayText();
}
void PageDown( void )
{
UWORD i;
if ( ! vwText ) return;
if ( vwLast == vwText->Last->Next ) return;
if ( ! vwArgs[ 12 ] ) {
for( i = 1; i < vwMaxLin; i++ ) {
vwFirst = vwFirst->Next;
vwShown += vwLast->Size;
if (( vwLast = vwLast->Next ) == vwText->Last->Next ) break;
}
Inform( ClearStr );
DisplayText();
} else {
for ( i = 1; i < vwMaxLin; i++ ) {
LineDown();
Percentage();
}
}
}
void PageUp( void )
{
UWORD i;
if ( ! vwText ) return;
if ( vwFirst == vwText->First ) return;
if ( ! vwArgs[ 12 ] ) {
for( i = 1; i < vwMaxLin; i++ ) {
vwLast = vwLast->Prev;
vwShown -= vwLast->Size;
if (( vwFirst = vwFirst->Prev ) == vwText->First ) break;
}
Inform( ClearStr );
DisplayText();
} else {
for ( i = 1; i < vwMaxLin; i++ ) {
LineUp();
Percentage();
}
}
}
void Percentage( void )
{
ULONG perc;
char pcbuf[5];
if ( ! vwText ) return;
perc = ( ULONG )( vwShown * 100 / vwText->NumBytes );
if ( perc == 100 && ( vwLast != vwText->Last->Next )) perc = 99;
vwNum = perc;
sprintf(pcbuf,"%3ld%%",perc);
SetAPen( vwRPort, 3 );
SetBPen( vwRPort, 2 );
SetDrMd( vwRPort, JAM2 );
Move( vwRPort, 544, vwFont->tf_Baseline );
Text( vwRPort, pcbuf, strlen( pcbuf ));
SetAPen( vwRPort, 1 );
Move( vwRPort, 584, vwFont->tf_Baseline );
Text( vwRPort, "Shown.", 6);
}
void BytesShown( void )
{
struct Line *line;
vwShown = 0L;
for ( line = vwText->First; line != vwLast; line = line->Next )
vwShown += line->Size;
}
void InfoLine( void )
{
UBYTE ibuf[100];
ClrLin();
vwErr = FALSE;
SetAPen( vwRPort, 1 );
SetDrMd( vwRPort, JAM1 );
if ( vwText )
sprintf( ibuf, "File : %-31.31ls %-6.6ld Lines, %-6.6ld Bytes.", &vwFile[0], vwText->NumLines - vwText->NumSplit, vwText->NumBytes );
else
strcpy( ibuf, "No text in memory (press 'l' to load a file)" );
Move( vwRPort, 1, vwFont->tf_Baseline );
Text( vwRPort, ibuf, strlen( ibuf ));
}
void ErrorLine( UBYTE *text )
{
ClrLin();
vwErr = TRUE;
SetAPen( vwRPort, 1 );
SetDrMd( vwRPort, JAM1 );
Move( vwRPort, 1, vwFont->tf_Baseline );
Text( vwRPort, text, strlen( text ));
}
void Error( UBYTE *error )
{
rtEZRequestTags( error, "Continue", NULL, NULL,
RT_ReqPos, REQPOS_CENTERSCR,
RT_WaitPointer, TRUE,
RTEZ_ReqTitle, CX_NAME " " CX_VERSION,
RTEZ_Flags, EZREQF_CENTERTEXT,
TAG_DONE );
ClearMsgPort( vwIdPort );
}
long IsAsciiChar( UBYTE chr )
{
if ( chr > 0x00 && chr < 0x09 ) return( FALSE );
if ( chr > 0x0d && chr < 0x1b ) return( FALSE );
if ( chr > 0x1b && chr < 0x20 ) return( FALSE );
if ( chr > 0x7f && chr < 0x9b ) return( FALSE );
return( TRUE );
}
long CheckAscii( UBYTE *name )
{
BPTR file;
UBYTE memory[ 100 ];
ULONG cnt, ret = TRUE, len;
if ( file = Open( name, MODE_OLDFILE )) {
len = Read( file, memory, 100L );
Close( file );
if ( len ) {
for ( cnt = 0; cnt < len; cnt++ ) {
if ( ! IsAsciiChar( memory[ cnt ] )) {
ret = FALSE;
break;
}
}
}
}
return( ret );
}
long CheckPP( void )
{
BPTR file;
ULONG ident;
if ( ! ( file = Open( vwName, MODE_OLDFILE ))) {
strcat( vwName, ".pp" );
if ( ! ( file = Open( vwName, MODE_OLDFILE ))) {
vwName[ strlen( vwName ) - 3 ] = 0;
return FALSE;
}
}
Read( file, &ident, 4L );
Close( file );
if( ident == 'PP20' || ident == 'PX20' ) return TRUE;
return FALSE;
}
long CountEsc( struct Line *line, long off )
{
UWORD i;
LONG c = 0L;
char *ptr = line->Text, chr;
for( i = 0; i <= off; i++ ) {
if( *ptr == ESC || *ptr == CSI ) {
while( 1 ) {
c++;
i++;
chr = ( *ptr++ ) - ' ';
if(( chr >= '?' && chr <= 'Z' ) || !chr ) break;
}
}
else ptr++;
}
return(c);
}
void PrintFound( UWORD y )
{
char wrd[256];
setmem( &wrd[ 0 ], 256, 0 );
Inform( "\033[32;43m" );
strncpy( wrd, (char *)&vwSearch.Line->Text[ vwSearch.TextOffset ], vwSearch.StringSize );
MoveTo( vwSearch.TextOffset - CountEsc( vwSearch.Line, vwSearch.TextOffset ) + 1, y );
Inform( wrd );
Inform( ResStr );
}
void myMain( long cli )
{
OpenLibraries();
vwFile[ 0 ] = vwName[ 0 ] = vwPath[ 0 ] = 0;
strcpy( vwPatt, "~(#?.info)" );
#ifndef __DETACH
if ( ! cli ) {
if ( WBenchMsg->sm_ArgList->wa_Lock )
CurrentDir( WBenchMsg->sm_ArgList->wa_Lock );
}
#endif
SetupCommodity();
MainLoop();
return;
}
#ifdef __DETACH
void main( long numargs, long *argarray )
{
vwProc = ( struct Process * )FindTask( NULL );
vwArgs = argarray;
myMain( TRUE );
return;
atoi("");
}
void wbmain( struct WBStartup *su )
{
vwArgs = &vwWBArgs[ 0 ];
WBenchMsg = su;
myMain( FALSE );
return;
}
#else
extern struct Library *SysBase;
extern struct WBStartup *_WBMsg;
void _main( void )
{
vwProc = ( struct Process * )FindTask( NULL );
if ( SysBase->lib_Version < 36 )
_exit( RETURN_FAIL );
if ( vwProc->pr_CLI ) {
if ( vwFArgs = ReadArgs( Template, &vwArgs[ 0 ], &vwIArgs ))
myMain( TRUE );
return;
} else {
WBenchMsg = _WBMsg;
myMain( FALSE );
return;
}
_waitwbmsg();
atoi("");
}
#endif