See ChangeLog entry 19990615-12:30 EDT David G. Holm <dholm@jsd-llc.com>
This commit is contained in:
@@ -1,3 +1,22 @@
|
||||
19990615-12:30 EDT David G. Holm <dholm@jsd-llc.com>
|
||||
* source/compiler/makefile.dos
|
||||
- Integrated preprocessor into compiler
|
||||
* source\hbpp\hbpp.c
|
||||
- Added braces to avoid implicit else in ParseExpression()
|
||||
* source/rtl/console.c
|
||||
- Added HARBOUR HB_SETPOS()
|
||||
- Improved printer position tracking
|
||||
- Improved screen position tracking when not using GT API
|
||||
* source/rtl/files.c
|
||||
- convert_create_flags no longer returns a value, so declare as void
|
||||
* source/rtl/set.c
|
||||
- Logical SET values can now use "ON" for .T. and "OFF" for .F.
|
||||
* source/rtl/strcmp.c
|
||||
- hb_stricmp does a case-insensitive compare even when not using a
|
||||
library function.
|
||||
* tests/working/output.prg
|
||||
- Converted to use the preprocessor
|
||||
|
||||
19990615-10:38 Alexander Kresin
|
||||
removed:
|
||||
- source\hbpp\harb.c
|
||||
|
||||
@@ -9,8 +9,8 @@ TARGET=$(HARBOURDIR)/bin/harbour.exe
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
$(TARGET): harboury.c harbour.c harbourl.c
|
||||
$(CC) $(CFLAGS) harboury.c harbour.c harbourl.c -o $(TARGET)
|
||||
$(TARGET): harboury.c harbour.c harbourl.c $(HARBOURDIR)/include/compiler.h $(HARBOURDIR)/source/hbpp/hbppint.c $(HARBOURDIR)/source/hbpp/hbpp.c $(HARBOURDIR)/source/hbpp/table.c
|
||||
$(CC) $(CFLAGS) harboury.c harbour.c harbourl.c $(HARBOURDIR)/source/hbpp/hbppint.c $(HARBOURDIR)/source/hbpp/hbpp.c $(HARBOURDIR)/source/hbpp/table.c -o $(TARGET)
|
||||
|
||||
harboury.c : harbour.y
|
||||
bison -d -v -y harbour.y -o harboury.c
|
||||
|
||||
@@ -535,6 +535,7 @@ int ParseExpression( char* sLine, char* sOutLine )
|
||||
i = WorkCommand( sToken, ptri, ptro, ndef );
|
||||
if ( ipos > 0 ) *(sLine+isdvig+ipos-1) = ';';
|
||||
if ( i >= 0 )
|
||||
{
|
||||
if ( isdvig + ipos > 0 )
|
||||
{
|
||||
lens = strolen( sLine+isdvig );
|
||||
@@ -543,6 +544,7 @@ int ParseExpression( char* sLine, char* sOutLine )
|
||||
}
|
||||
else
|
||||
memcpy ( sLine, sOutLine, i+1);
|
||||
}
|
||||
rezCom = 1;
|
||||
}
|
||||
else if ( ipos > 0 ) *(sLine+isdvig+ipos-1) = ';';
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
HARBOUR HB___ACCEPT(void);
|
||||
HARBOUR HB_DEVOUT( void );
|
||||
HARBOUR HB_DEVPOS( void );
|
||||
HARBOUR HB_EJECT( void );
|
||||
HARBOUR HB___EJECT( void );
|
||||
HARBOUR HB_MAXCOL( void );
|
||||
HARBOUR HB_MAXROW( void );
|
||||
HARBOUR HB_OUTSTD( void );
|
||||
@@ -29,6 +29,7 @@ HARBOUR HB_OUTERR( void );
|
||||
HARBOUR HB_PCOL( void );
|
||||
HARBOUR HB_PROW( void );
|
||||
HARBOUR HB_SCROLL( void );
|
||||
HARBOUR HB_SETPOS( void );
|
||||
HARBOUR HB_SETPRC( void );
|
||||
HARBOUR HB_QOUT( void );
|
||||
HARBOUR HB_QQOUT( void );
|
||||
@@ -37,7 +38,7 @@ static SYMBOL symbols[] = {
|
||||
{ "__ACCEPT", FS_PUBLIC, HB___ACCEPT, 0 },
|
||||
{ "DEVOUT" , FS_PUBLIC, HB_DEVOUT , 0 },
|
||||
{ "DEVPOS" , FS_PUBLIC, HB_DEVPOS , 0 },
|
||||
{ "EJECT" , FS_PUBLIC, HB_EJECT , 0 },
|
||||
{ "EJECT" , FS_PUBLIC, HB___EJECT , 0 },
|
||||
{ "MAXCOL" , FS_PUBLIC, HB_MAXCOL , 0 },
|
||||
{ "MAXROW" , FS_PUBLIC, HB_MAXROW , 0 },
|
||||
{ "OUTERR" , FS_PUBLIC, HB_OUTERR , 0 },
|
||||
@@ -45,6 +46,7 @@ static SYMBOL symbols[] = {
|
||||
{ "PCOL" , FS_PUBLIC, HB_PCOL , 0 },
|
||||
{ "PROW" , FS_PUBLIC, HB_PROW , 0 },
|
||||
{ "SCROLL" , FS_PUBLIC, HB_SCROLL , 0 },
|
||||
{ "SETPOS" , FS_PUBLIC, HB_SETPOS , 0 },
|
||||
{ "SETPRC" , FS_PUBLIC, HB_SETPRC , 0 },
|
||||
{ "QOUT" , FS_PUBLIC, HB_QOUT , 0 },
|
||||
{ "QQOUT" , FS_PUBLIC, HB_QQOUT , 0 }
|
||||
@@ -74,7 +76,7 @@ void InitializeConsole( void )
|
||||
p_row = p_col = 0;
|
||||
}
|
||||
|
||||
USHORT hb_maxrow( void )
|
||||
USHORT hb_max_row( void )
|
||||
{
|
||||
#ifdef USE_GTAPI
|
||||
return _gtMaxRow ();
|
||||
@@ -83,7 +85,7 @@ USHORT hb_maxrow( void )
|
||||
#endif
|
||||
}
|
||||
|
||||
USHORT hb_maxcol( void )
|
||||
USHORT hb_max_col( void )
|
||||
{
|
||||
#ifdef USE_GTAPI
|
||||
return _gtMaxCol ();
|
||||
@@ -92,6 +94,42 @@ USHORT hb_maxcol( void )
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef USE_GTAPI
|
||||
void adjust_pos( char * fpStr, WORD uiLen, USHORT * row, USHORT * col, USHORT max_row, USHORT max_col )
|
||||
{
|
||||
WORD uiCount;
|
||||
for( uiCount = 0; uiCount < uiLen; uiCount++ )
|
||||
{
|
||||
switch( fpStr[ uiCount ] )
|
||||
{
|
||||
case 7:
|
||||
break;
|
||||
case 8:
|
||||
if( *col ) (*col)--;
|
||||
else
|
||||
{
|
||||
*col = max_col;
|
||||
if( *row ) (*row)--;
|
||||
}
|
||||
break;
|
||||
case 10:
|
||||
if( *row < max_row ) (*row)++;
|
||||
break;
|
||||
case 13:
|
||||
*col = 0;
|
||||
break;
|
||||
default:
|
||||
if( *col < max_col ) (*col)++;
|
||||
else
|
||||
{
|
||||
*col = 0;
|
||||
if( *row < max_row ) (*row)++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
HARBOUR HB___ACCEPT( void ) /* Internal Clipper function used in ACCEPT command */
|
||||
/* Basically the simplest Clipper function to */
|
||||
/* receive data. Parameter : cPrompt. Returns : cRet */
|
||||
@@ -176,6 +214,8 @@ static void hb_outstd( char * fpStr, WORD uiLen )
|
||||
dev_col = gtWhereX();
|
||||
_gtSetPos( dev_row, dev_col );
|
||||
}
|
||||
#else
|
||||
adjust_pos( fpStr, uiLen, &dev_row, &dev_col, hb_max_row(), hb_max_col() );
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -194,6 +234,8 @@ static void hb_outerr( char * fpStr, WORD uiLen )
|
||||
dev_col = gtWhereX();
|
||||
_gtSetPos( dev_row, dev_col );
|
||||
}
|
||||
#else
|
||||
adjust_pos( fpStr, uiLen, &dev_row, &dev_col, hb_max_row(), hb_max_col() );
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -210,20 +252,20 @@ static void hb_altout( char * fpStr, WORD uiLen )
|
||||
WORD uiCount;
|
||||
for( uiCount = 0; uiCount < uiLen; uiCount++ )
|
||||
printf( "%c", fpStr[ uiCount ] );
|
||||
dev_col += uiLen;
|
||||
if( dev_col > hb_maxcol() )
|
||||
{
|
||||
dev_row += (uiLen / (hb_maxcol() + 1));
|
||||
dev_col -= (uiLen % (hb_maxcol() + 1));
|
||||
}
|
||||
adjust_pos( fpStr, uiLen, &dev_row, &dev_col, hb_max_row(), hb_max_col() );
|
||||
#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 );
|
||||
adjust_pos( fpStr, uiLen, &p_row, &p_col, -1, -1 );
|
||||
}
|
||||
}
|
||||
|
||||
/* Output an item to the screen and/or printer */
|
||||
@@ -233,7 +275,7 @@ static void hb_devout( char * fpStr, WORD uiLen )
|
||||
{
|
||||
/* Display to printer if SET DEVICE TO PRINTER and valid printer file */
|
||||
write( hb_set_printhan, fpStr, uiLen );
|
||||
p_col += uiLen;
|
||||
adjust_pos( fpStr, uiLen, &p_row, &p_col, -1, -1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -245,19 +287,28 @@ static void hb_devout( char * fpStr, WORD uiLen )
|
||||
WORD uiCount;
|
||||
for( uiCount = 0; uiCount < uiLen; uiCount++ )
|
||||
printf( "%c", fpStr[ uiCount ] );
|
||||
dev_col += uiLen;
|
||||
if( dev_col > hb_maxcol() )
|
||||
{
|
||||
dev_row += (uiLen / (hb_maxcol() + 1));
|
||||
dev_col -= (uiLen % (hb_maxcol() + 1));
|
||||
}
|
||||
adjust_pos( fpStr, uiLen, &dev_row, &dev_col, hb_max_row(), hb_max_col() );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void hb_setpos( USHORT row, USHORT col )
|
||||
{
|
||||
USHORT count;
|
||||
#ifdef USE_GTAPI
|
||||
_gtSetPos( row, col );
|
||||
#else
|
||||
for( count = dev_row; count < row; count++ ) printf("\n");
|
||||
if( row > dev_row ) dev_col = 0;
|
||||
for( count = dev_col; count < col; count++ ) printf(" ");
|
||||
#endif
|
||||
dev_row = row;
|
||||
dev_col = col;
|
||||
}
|
||||
|
||||
void hb_devpos( USHORT row, USHORT col )
|
||||
{
|
||||
int count;
|
||||
USHORT count;
|
||||
/* Position printer if SET DEVICE TO PRINTER and valid printer file
|
||||
otherwise position console */
|
||||
if( hb_stricmp( hb_set.HB_SET_DEVICE, "PRINTER" ) == 0 && hb_set_printhan >= 0 )
|
||||
@@ -273,18 +324,7 @@ void hb_devpos( USHORT row, USHORT col )
|
||||
p_row = row;
|
||||
p_col = col;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef USE_GTAPI
|
||||
_gtSetPos( row, col );
|
||||
#else
|
||||
for( count = dev_row; count < row; count++ ) printf("\n");
|
||||
if( row > dev_row ) dev_col = 0;
|
||||
for( count = dev_col; count < col; count++ ) printf(" ");
|
||||
#endif
|
||||
dev_row = row;
|
||||
dev_col = col;
|
||||
}
|
||||
else hb_setpos( row, col );
|
||||
}
|
||||
|
||||
HARBOUR HB_OUTSTD( void ) /* writes a list of values to the standard output device */
|
||||
@@ -330,6 +370,18 @@ HARBOUR HB_QOUT( void )
|
||||
#endif
|
||||
}
|
||||
|
||||
HARBOUR HB_SETPOS( void ) /* Sets the screen position */
|
||||
{
|
||||
PHB_ITEM pRow, pCol;
|
||||
if( _pcount() > 1 )
|
||||
{
|
||||
pRow = _param( 1, IT_NUMERIC );
|
||||
pCol = _param( 2, IT_NUMERIC );
|
||||
if( pRow && pCol )
|
||||
hb_setpos( _parni( 1 ), _parni( 2 ) );
|
||||
}
|
||||
}
|
||||
|
||||
HARBOUR HB_DEVPOS( void ) /* Sets the screen and/or printer position */
|
||||
{
|
||||
PHB_ITEM pRow, pCol;
|
||||
@@ -366,11 +418,11 @@ HARBOUR HB_DEVOUT( void ) /* writes a single values to the current device (scree
|
||||
}
|
||||
}
|
||||
|
||||
HARBOUR HB_EJECT( void ) /* Ejects the current page from the printer */
|
||||
HARBOUR HB___EJECT( void ) /* Ejects the current page from the printer */
|
||||
{
|
||||
if( hb_stricmp( hb_set.HB_SET_DEVICE, "PRINTER" ) == 0 && hb_set_printhan >= 0 )
|
||||
{
|
||||
write( hb_set_printhan, "\x0C", 1 );
|
||||
write( hb_set_printhan, "\x0C\x0D", 2 );
|
||||
p_row = p_col = 0;
|
||||
}
|
||||
}
|
||||
@@ -401,7 +453,7 @@ HARBOUR HB_SETPRC( void ) /* Sets the current printer row and column positions *
|
||||
|
||||
HARBOUR HB_SCROLL( void ) /* Scrolls a screen region (requires the GT API) */
|
||||
{
|
||||
int top = 0, left = 0, bottom = hb_maxrow(), right = hb_maxcol(),
|
||||
int top = 0, left = 0, bottom = hb_max_row(), right = hb_max_col(),
|
||||
v_scroll = 0, h_scroll = 0;
|
||||
|
||||
if( _pcount() > 0 && _param( 1, IT_NUMERIC ) )
|
||||
@@ -420,12 +472,12 @@ HARBOUR HB_SCROLL( void ) /* Scrolls a screen region (requires the GT API) */
|
||||
#ifdef USE_GTAPI
|
||||
_gtScroll( top, left, bottom, right, v_scroll, h_scroll );
|
||||
#else
|
||||
if( top == 0 && bottom == hb_maxrow()
|
||||
&& left == 0 && right == hb_maxcol()
|
||||
if( top == 0 && bottom == hb_max_row()
|
||||
&& left == 0 && right == hb_max_col()
|
||||
&& v_scroll == 0 && h_scroll == 0 )
|
||||
{
|
||||
int count;
|
||||
dev_row = hb_maxrow();
|
||||
dev_row = hb_max_row();
|
||||
for( count = 0; count < dev_row ; count++ ) printf( "\n" );
|
||||
dev_row = dev_col = 0;
|
||||
}
|
||||
@@ -434,12 +486,12 @@ HARBOUR HB_SCROLL( void ) /* Scrolls a screen region (requires the GT API) */
|
||||
|
||||
HARBOUR HB_MAXROW( void ) /* Return the maximum screen row number (zero origin) */
|
||||
{
|
||||
_retni( hb_maxrow () );
|
||||
_retni( hb_max_row () );
|
||||
}
|
||||
|
||||
HARBOUR HB_MAXCOL( void ) /* Return the maximum screen column number (zero origin) */
|
||||
{
|
||||
_retni( hb_maxcol () );
|
||||
_retni( hb_max_col () );
|
||||
}
|
||||
|
||||
HARBOUR HB_ROW( void ) /* Return the current screen row position (zero origin) */
|
||||
|
||||
@@ -213,7 +213,7 @@ static int convert_seek_flags( int flags )
|
||||
return result_flags;
|
||||
}
|
||||
|
||||
static convert_create_flags( int flags, int *result_flags, int *result_pmode )
|
||||
static void convert_create_flags( int flags, int *result_flags, int *result_pmode )
|
||||
{
|
||||
/* by default FC_NORMAL is set */
|
||||
|
||||
@@ -228,7 +228,6 @@ static convert_create_flags( int flags, int *result_flags, int *result_pmode )
|
||||
|
||||
if( flags & FC_SYSTEM )
|
||||
*result_flags |= 0;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#if defined(__GNUC__) || defined(__DJGPP__)
|
||||
#if defined(__GNUC__)
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
@@ -42,9 +42,24 @@ void Set__InitSymbols( void )
|
||||
|
||||
static BOOL set_logical (PHB_ITEM pItem)
|
||||
{
|
||||
BOOL logical;
|
||||
BOOL logical = FALSE;
|
||||
if (IS_LOGICAL (pItem)) logical = pItem->value.iLogical;
|
||||
else logical = FALSE;
|
||||
else if (IS_STRING (pItem))
|
||||
{
|
||||
if (pItem->wLength == 2)
|
||||
{
|
||||
if (toupper (pItem->value.szText [0]) == 'O'
|
||||
&& toupper (pItem->value.szText [1]) == 'N')
|
||||
logical = TRUE;
|
||||
}
|
||||
else if (pItem->wLength == 3)
|
||||
{
|
||||
if (toupper (pItem->value.szText [0]) == 'O'
|
||||
&& toupper (pItem->value.szText [1]) == 'F'
|
||||
&& toupper (pItem->value.szText [2]) == 'F')
|
||||
logical = FALSE;
|
||||
}
|
||||
}
|
||||
return (logical);
|
||||
}
|
||||
|
||||
@@ -228,12 +243,19 @@ HARBOUR HB_SETFIXED (void)
|
||||
if ( pItem && IS_LOGICAL (pItem)) hb_set_fixed = pItem->value.iLogical;
|
||||
else if ( pItem && IS_STRING (pItem))
|
||||
{
|
||||
if (pItem->wLength == 2 && toupper (pItem->value.szText [0]) == 'O'
|
||||
&& toupper (pItem->value.szText [1]) == 'N')
|
||||
hb_set_fixed = TRUE;
|
||||
else if (pItem->wLength == 3 && toupper (pItem->value.szText [0]) == 'O'
|
||||
&& toupper (pItem->value.szText [1]) == 'F' && toupper (pItem->value.szText [2]) == 'F')
|
||||
hb_set_fixed = FALSE;
|
||||
if (pItem->wLength == 2)
|
||||
{
|
||||
if (toupper (pItem->value.szText [0]) == 'O'
|
||||
&& toupper (pItem->value.szText [1]) == 'N')
|
||||
hb_set_fixed = TRUE;
|
||||
}
|
||||
else if (pItem->wLength == 3)
|
||||
{
|
||||
if (toupper (pItem->value.szText [0]) == 'O'
|
||||
&& toupper (pItem->value.szText [1]) == 'F'
|
||||
&& toupper (pItem->value.szText [2]) == 'F')
|
||||
hb_set_fixed = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <extend.h>
|
||||
#include <set.h>
|
||||
|
||||
@@ -13,22 +14,22 @@ int hb_stricmp( const char *s1, const char *s2 )
|
||||
#ifdef strcasecmp
|
||||
return( strcasecmp( s1, s2 ) );
|
||||
#else
|
||||
int rc = 0;
|
||||
USHORT c1, c2, count;
|
||||
c1 = strlen( s1 );
|
||||
c2 = strlen( s2 );
|
||||
if( c1 < c2 ) count = c1;
|
||||
else count = c2;
|
||||
int rc = 0, c1, c2;
|
||||
USHORT l1, l2, count;
|
||||
l1 = strlen( s1 );
|
||||
l2 = strlen( s2 );
|
||||
if( l1 < l2 ) count = l1;
|
||||
else count = l2;
|
||||
while( rc == 0 && count > 0 )
|
||||
{
|
||||
if( *s1 != *s2 ) rc = ( *s1 < *s2 ? -1 : 1 );
|
||||
s1++;
|
||||
s2++;
|
||||
count--;
|
||||
c1 = toupper( *s1++ );
|
||||
c2 = toupper( *s2++ );
|
||||
if( c1 != c2 ) rc = ( c1 < c2 ? -1 : 1 );
|
||||
}
|
||||
if( rc == 0 && c1 != c2 )
|
||||
if( rc == 0 && l1 != l2 )
|
||||
{
|
||||
if( c1 < c2 ) rc = -1;
|
||||
if( l1 < l2 ) rc = -1;
|
||||
else rc = 1;
|
||||
}
|
||||
return rc;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Testing Harbour dates management.
|
||||
// Testing Harbour device management.
|
||||
|
||||
#include "set.ch"
|
||||
#define cNewLine CHR( 13 ) + CHR( 10 )
|
||||
@@ -6,22 +6,19 @@
|
||||
function Main()
|
||||
|
||||
OUTSTD (cNewLine, "Testing Harbour device management on", DATE())
|
||||
SET (_SET_ALTFILE, "output", .T.)
|
||||
SET (_SET_PRINTFILE, "output", .T.)
|
||||
SET ALTERNATE TO OUTPUT ADDITIVE
|
||||
SET PRINTER TO OUTPUT ADDITIVE
|
||||
QOUT ("SCREEN, NOT ALTERNATE, NOT PRINTER")
|
||||
DEVPOS (5, 5)
|
||||
DEVOUT ("SCREEN, NOT ALTERNATE NOT PRINTER")
|
||||
SET (_SET_ALTERNATE, .T.)
|
||||
SET (_SET_PRINTER, .T.)
|
||||
@ 5,5 SAY "SCREEN, NOT ALTERNATE NOT PRINTER"
|
||||
SET ALTERNATE ON
|
||||
SET PRINTER ON
|
||||
QOUT ("SCREEN, ALTERNATE AND PRINTER")
|
||||
DEVPOS (10, 10)
|
||||
DEVOUT ("SCREEN, NOT ALTERNATE, NOT PRINTER")
|
||||
SET (_SET_DEVICE, "PRINTER")
|
||||
@ 10,10 SAY "SCREEN, NOT ALTERNATE, NOT PRINTER"
|
||||
SET DEVICE TO PRINTER
|
||||
QOUT ("SCREEN, ALTERNATE AND PRINTER AGAIN")
|
||||
SET (_SET_PRINTER, .F.)
|
||||
SET PRINTER OFF
|
||||
QOUT ("SCREEN AND ALTERNATE, BUT NOT PRINTER")
|
||||
DEVPOS (15, 15)
|
||||
DEVOUT ("PRINTER, NOT SCREEN, NOT ALTERNATE")
|
||||
EJECT()
|
||||
@ 15,15 SAY "PRINTER, NOT SCREEN, NOT ALTERNATE"
|
||||
EJECT
|
||||
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user