Files
harbour-core/harbour/source/rtl/console.c

304 lines
7.7 KiB
C

/*
* $Id$
*/
#ifdef WINDOWS
#include <windows.h>
#endif
#include <io.h>
#include <extend.h>
#include <ctoharb.h>
#include <dates.h>
#include <set.h>
#ifdef USE_GTAPI
#include <gtapi.h>
#endif
static unsigned short dev_row = 0;
static unsigned short dev_col = 0;
void InitializeConsole( void )
{
#ifdef USE_GTAPI
dev_row = gtWhereY();
dev_col = gtWhereX();
_gtSetPos( dev_row, dev_col );
#else
dev_row = 0;
dev_col = 0;
#endif
}
HARBOUR __ACCEPT( void ) /* Internal Clipper function used in ACCEPT command */
/* Basically the simplest Clipper function to */
/* receive data. Parameter : cPrompt. Returns : cRet */
{
char *szResult = ( char * ) _xgrab(256); /* Return parameter. Limited to 255 chars */
char *szPrompt = _parc(1); /* Pass prompt */
long lLen = _parclen(1); /* Please change to long later on */
if( _pcount() == 1 ) /* cPrompt passed */
{
PushSymbol( GetDynSym( "QOUT" )->pSymbol ); /* push the symbol pointer to the Harbour stack */
PushNil(); /* places nil at self, as we are not sending a msg */
PushString( szPrompt, lLen ); /* places parameters on to the stack */
Do( 1 ); /* 1 parameter supplied. Invoke the virtual machine */
}
gets( szResult ); /* Read the data. Using gets() */
_retc( szResult );
_xfree( szResult );
}
typedef void void_func_int (char *, WORD);
/* Format items for output, then call specified output function */
static void hb_out( WORD wParam, void_func_int * hb_out_func )
{
char * szText;
PITEM pItem = _param( wParam, IT_ANY );
ULONG ulLenText;
char szBuffer [11];
switch( _parinfo( wParam ) )
{
case IT_DATE:
szText = hb_dtoc( _pards( wParam ), szBuffer );
if( szText )
hb_out_func( szText, strlen( szText ) );
break;
case IT_DOUBLE:
case IT_INTEGER:
case IT_LONG:
szText = hb_str( pItem, 0, 0 ); /* Let hb_str() do the hard work */
if( szText )
{
hb_out_func( szText, strlen( szText ) );
_xfree( szText );
}
break;
case IT_NIL:
break;
case IT_LOGICAL:
if( _parl( wParam ) )
hb_out_func( ".T.", 3 );
else
hb_out_func( ".F.", 3 );
break;
case IT_STRING:
hb_out_func( _parc( wParam ), _parclen( wParam ) );
break;
default:
break;
}
}
/* Output an item to STDOUT */
static void hb_outstd( char * fpStr, WORD uiLen )
{
WORD uiCount = uiLen;
char * fpPtr = fpStr;
while( uiCount-- )
printf( "%c", *fpPtr++ );
}
/* Output an item to STDERR */
static void hb_outerr( char * fpStr, WORD uiLen )
{
WORD uiCount = uiLen;
char * fpPtr = fpStr;
while( uiCount-- )
fprintf( stderr, "%c", *fpPtr++ );
}
/* Output an item to the screen and/or printer and/or alternate */
static void hb_altout( char * fpStr, WORD uiLen )
{
if( hb_set.HB_SET_CONSOLE )
{
#ifdef USE_GTAPI
_gtWriteCon( fpStr, uiLen );
if( stricmp( hb_set.HB_SET_DEVICE, "PRINTER" ) || hb_set_printhan < 0 )
_gtGetPos( &dev_row, &dev_col );
#else
WORD uiCount;
for( uiCount = 0; uiCount < uiLen; uiCount++ )
printf( "%c", fpStr[ uiCount ] );
#endif
}
if( hb_set.HB_SET_ALTERNATE && hb_set_althan >= 0 )
/* Print to alternate file if SET ALTERNATE ON and valid alternate file */
write( hb_set_althan, fpStr, uiLen );
if( hb_set.HB_SET_PRINTER && hb_set_printhan >= 0 )
/* Print to printer if SET PRINTER ON and valid printer file */
write( hb_set_printhan, fpStr, uiLen );
}
/* Output an item to the screen and/or printer */
static void hb_devout( char * fpStr, WORD uiLen )
{
if( stricmp( hb_set.HB_SET_DEVICE, "PRINTER" ) == 0 && hb_set_printhan >= 0 )
{
/* Display to printer if SET DEVICE TO PRINTER and valid printer file */
write( hb_set_printhan, fpStr, uiLen );
dev_col += uiLen;
}
else
{
#ifdef USE_GTAPI
/* Otherwise, display to console */
_gtWrite( fpStr, uiLen );
if( stricmp( hb_set.HB_SET_DEVICE, "PRINTER" ) || hb_set_printhan < 0 )
_gtGetPos( &dev_row, &dev_col );
#else
WORD uiCount;
for( uiCount = 0; uiCount < uiLen; uiCount++ )
printf( "%c", fpStr[ uiCount ] );
#endif
}
}
void hb_devpos( int row, int col )
{
int count;
/* Position printer if SET DEVICE TO PRINTER and valid printer file
otherwise position console */
if( stricmp( hb_set.HB_SET_DEVICE, "PRINTER" ) == 0 && hb_set_printhan >= 0 )
{
if( row < dev_row )
{
write( hb_set_printhan, "\x0C", 1 );
dev_row = dev_col = 0;
}
for( count = dev_row; count < row; count++ ) write( hb_set_printhan, "\r\n", 2 );
if( row > dev_row ) dev_col = 0;
for( count = dev_col; count < col; count++ ) write( hb_set_printhan, " ", 1 );
dev_row = row;
dev_col = col;
}
#ifdef USE_GTAPI
else
_gtSetPos( row, col );
#endif
}
HARBOUR OUTSTD( void ) /* writes a list of values to the standard output device */
{
WORD w;
for( w = 0; w < _pcount(); w++ )
{
hb_out( w + 1, hb_outstd );
if( w < _pcount() - 1) hb_outstd( " ", 1 );
}
}
HARBOUR OUTERR( void ) /* writes a list of values to the standard error device */
{
WORD w;
for( w = 0; w < _pcount(); w++ )
{
hb_out( w + 1, hb_outerr );
if( w < _pcount() - 1) hb_outerr( " ", 1 );
}
}
HARBOUR QQOUT( void ) /* writes a list of values to the current device (screen or printer) and is affected by SET ALTERNATE */
{
BOOL bScreen;
WORD w;
for( w = 0; w < _pcount(); w++ )
{
hb_out( w + 1, hb_altout );
if( w < _pcount() - 1) hb_altout( " ", 1 );
}
}
HARBOUR QOUT( void )
{
#ifdef WINDOWS
MessageBox( 0, _parc( 1 ), "Harbour", 0 );
#else
hb_altout( "\r\n", 2 );
QQOUT();
#endif
}
HARBOUR DEVPOS( void ) /* Sets the screen and/or printer position */
{
PITEM pRow, pCol;
if( _pcount() > 1 )
{
pRow = _param( 1, IT_NUMERIC );
pCol = _param( 2, IT_NUMERIC );
if( pRow && pCol )
hb_devpos( _parni( 1 ), _parni( 2 ) );
}
}
HARBOUR DEVOUT( void ) /* writes a single values to the current device (screen or printer), but is not affected by SET ALTERNATE */
{
BOOL bScreen;
if( _pcount() > 0 )
{
char fpOldColor[ 64 ];
fpOldColor[ 0 ] = 0;
if( _pcount() > 1 )
{
#ifdef USE_GTAPI
PITEM pColor = _param( 2, IT_STRING );
if( pColor )
{
_gtGetColorStr( fpOldColor );
_gtSetColorStr( pColor->value.szText );
}
#endif
}
hb_out( 1, hb_devout );
#ifdef USE_GTAPI
if( fpOldColor[ 0 ] ) _gtSetColorStr( fpOldColor );
#endif
}
}
HARBOUR EJECT( void ) /* Ejects the current page from the printer */
{
if( stricmp( hb_set.HB_SET_DEVICE, "PRINTER" ) == 0 && hb_set_printhan >= 0 )
{
write( hb_set_printhan, "\x0C", 1 );
dev_row = dev_col = 0;
}
}
HARBOUR PROW( void ) /* Returns the current printer row position */
{
_retni( dev_row );
}
HARBOUR PCOL( void ) /* Returns the current printer row position */
{
_retni( dev_col );
}
HARBOUR SETPRC( void ) /* Sets the current printer row and column positions */
{
if( _pcount() > 1 )
{
PITEM pRow = _param( 1, IT_NUMERIC );
PITEM pCol = _param( 1, IT_NUMERIC );
if( pRow && pCol )
{
dev_row = _parni( 1 );
dev_col = _parni( 2 );
}
}
}