From af9bad0e077940b49e43966c90d389c0e261b2b5 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Thu, 6 May 1999 21:47:47 +0000 Subject: [PATCH] *** empty log message *** --- harbour/ChangeLog | 31 +++++++++++++++++++++ harbour/include/extend.h | 5 +++- harbour/source/rtl/arrays.c | 2 +- harbour/source/rtl/console.c | 6 ++--- harbour/source/rtl/dates.c | 47 +++++++++++++++++++++++++++----- harbour/source/rtl/extend.c | 15 +++++------ harbour/source/rtl/itemapi.c | 8 ++---- harbour/source/rtl/strcmp.c | 6 ++--- harbour/source/rtl/strings.c | 48 ++++++++++++++++++--------------- harbour/source/rtl/transfrm.c | 3 +-- harbour/source/tools/stringsx.c | 4 +-- harbour/source/vm/dynsym.c | 8 +++--- harbour/source/vm/hvm.c | 16 +++++------ 13 files changed, 131 insertions(+), 68 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 401b4a114b..8258365c71 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,34 @@ +Thu May 06 22:45:00 1999 Victor Szel + + ! source/rtl/dates.c: + Fix to STOD(), added error checking to DTOS(), the later can be + disabled to make it faster. + * source/vm/hvm.c, include/extend.h: + strempty() -> hb_strempty(), declaration moved to .h + % source/rtl/strings.c: + hb_strempty() speed optimalization, cleanup. + * source/vm/dynsym.c: + OurStrUpr() -> hb_strupr() + _strgreater -> hb_strgreater() + * source/rtl/console.c: + _outstd() -> hb_outstd() + * source/tools/stringsx.c: + StrToken() -> hb_strtoken() + * source/rtl/strings.c: + LTrim() -> hb_LTrim() + RTrimLen() -> hb_RTrimLen() + Lower() -> hb_Lower() + Upper() -> hb_Upper() + At() -> hb_At() + Val() -> hb_Val() + * source/vm/hvm.c, source/rtl/array.c, source/rtl/strcmp.c, + include/extend.h + OurStrCmp() -> hb_itemStrCmp() + * source/rtl/*.c, source/include/extend.h + julian2greg() -> hb_julian2greg() + greg2julian() -> hb_greg2julian() + Declaration moved to extend.h + Thu May 06 13:58:48 1999 Gonzalo A. Diethelm * source/vm/hvm.c: diff --git a/harbour/include/extend.h b/harbour/include/extend.h index 6a298350ec..d1c4c601db 100644 --- a/harbour/include/extend.h +++ b/harbour/include/extend.h @@ -150,7 +150,10 @@ void ArrayRelease( PITEM pArray ); /* releases an array - don't call it - use It char * ArrayGetString( PITEM pArray, ULONG ulIndex ); /* retrieves the string contained on an array element */ ULONG ArrayGetStringLen( PITEM pArray, ULONG ulIndex ); /* retrieves the string length contained on an array element */ -int OurStrCmp( PITEM pFirst, PITEM pSecond ); /* our string compare */ +int hb_itemStrCmp( PITEM pFirst, PITEM pSecond ); /* our string compare */ +BOOL hb_strempty( char * szText, ULONG ulLen ); +long hb_greg2julian( long lDay, long lMonth, long lYear ); +void hb_julian2greg( long julian, long * plDay, long * plMonth, long * plYear ); HARBOURFUNC GetMethod( PITEM pObject, PSYMBOL pSymMsg ); /* returns the method pointer of a object class */ char * _GetClassName( PITEM pObject ); /* retrieves an object class name */ diff --git a/harbour/source/rtl/arrays.c b/harbour/source/rtl/arrays.c index 8b2b10119c..e1d3cd9005 100644 --- a/harbour/source/rtl/arrays.c +++ b/harbour/source/rtl/arrays.c @@ -316,7 +316,7 @@ int ArrayScan( PITEM pArray, PITEM pValue, ULONG ulStart, ULONG ulCount ) break; case IT_STRING : - iRet = ( OurStrCmp( pValue, pItem ) == 0 ); + iRet = ( hb_itemStrCmp( pValue, pItem ) == 0 ); break; } } diff --git a/harbour/source/rtl/console.c b/harbour/source/rtl/console.c index b6d2e9816e..50975bd6e1 100644 --- a/harbour/source/rtl/console.c +++ b/harbour/source/rtl/console.c @@ -32,7 +32,7 @@ HARBOUR __ACCEPT( void ) /* Internal Clipper function used in ACCEPT command */ _xfree( szResult ); } -static void _outstd( WORD wParam ) +static void hb_outstd( WORD wParam ) { char * szText; ULONG ulLenText; @@ -89,7 +89,7 @@ HARBOUR OUTSTD( void ) /* writes a list of values to the standard output device for( w = 0; w < _pcount(); w++ ) { - _outstd( w + 1 ); + hb_outstd( w + 1 ); if( w < _pcount() - 1) printf( " " ); } } @@ -100,7 +100,7 @@ HARBOUR QQOUT( void ) for( w = 0; w < _pcount(); w++ ) { - _outstd( w + 1 ); + hb_outstd( w + 1 ); if( w < _pcount() - 1) printf( " " ); } } diff --git a/harbour/source/rtl/dates.c b/harbour/source/rtl/dates.c index fa7bdde371..aad26c1142 100644 --- a/harbour/source/rtl/dates.c +++ b/harbour/source/rtl/dates.c @@ -7,7 +7,11 @@ #include #include -long greg2julian( long lDay, long lMonth, long lYear ) +#ifndef _STRICT_CLIPPER_COMPATIBILITY + #define _OPTIMIZE_DTOS +#endif + +long hb_greg2julian( long lDay, long lMonth, long lYear ) { long lFactor = ( lMonth < 3 ) ? -1: 0; @@ -17,7 +21,7 @@ long greg2julian( long lDay, long lMonth, long lYear ) lDay - 32075; } -void julian2greg( long julian, long * plDay, long * plMonth, long * plYear ) +void hb_julian2greg( long julian, long * plDay, long * plMonth, long * plYear ) { long U, V, W, X; @@ -249,14 +253,43 @@ HARBOUR DTOC( void ) _retc( hb_dtoc (szDate, szDateFormat) ); } +/* QUESTION: Should we drop error checkings to make it faster ? */ +/* This function may be called many times in a real world */ +/* application, for example in index creation. */ +/* Clipper does these checks, anyway. */ HARBOUR DTOS( void ) { - _retc( _pards( 1 ) ); +#ifndef _OPTIMIZE_DTOS + if( _pcount() == 1 ) + { + if( ISDATE( 1 ) ) + { +#endif + _retc( _pards( 1 ) ); +#ifndef _OPTIMIZE_DTOS + } + else + { + PITEM pError = _errNew(); + _errPutDescription(pError, "Argument error: DTOS"); + _errLaunch(pError); + _errRelease(pError); + } + } + else + { + /* QUESTION: Clipper catches this at compile time! */ + PITEM pError = _errNew(); + _errPutDescription(pError, "Incorrect number of arguments: DTOS"); + _errLaunch(pError); + _errRelease(pError); + } +#endif } HARBOUR STOD( void ) { - _retds( _parc( 1 ) ); + _retds((ISCHAR(1) && _parclen(1) == 8) ? _parc(1) : " "); } HARBOUR DAY( void ) @@ -266,7 +299,7 @@ HARBOUR DAY( void ) if( pDate ) { - julian2greg( pDate->value.lDate, &lDay, &lMonth, &lYear ); + hb_julian2greg( pDate->value.lDate, &lDay, &lMonth, &lYear ); _retni( lDay ); } else @@ -284,7 +317,7 @@ HARBOUR MONTH( void ) if( pDate ) { - julian2greg( pDate->value.lDate, &lDay, &lMonth, &lYear ); + hb_julian2greg( pDate->value.lDate, &lDay, &lMonth, &lYear ); _retni( lMonth ); } else @@ -302,7 +335,7 @@ HARBOUR YEAR( void ) if( pDate ) { - julian2greg( pDate->value.lDate, &lDay, &lMonth, &lYear ); + hb_julian2greg( pDate->value.lDate, &lDay, &lMonth, &lYear ); _retni( lYear ); } else diff --git a/harbour/source/rtl/extend.c b/harbour/source/rtl/extend.c index 0162f0793e..18db454f31 100644 --- a/harbour/source/rtl/extend.c +++ b/harbour/source/rtl/extend.c @@ -6,13 +6,12 @@ #include #include -long greg2julian( long lDay, long lMonth, long lYear ); -void julian2greg( long julian, long * plDay, long * plMonth, long * plYear ); - extern STACK stack; -ULONG ulMemoryBlocks = 0, ulMemoryMaxBlocks = 0, ulMemoryMaxConsumed = 0, - ulMemoryConsumed = 0; +ULONG ulMemoryBlocks = 0; +ULONG ulMemoryMaxBlocks = 0; +ULONG ulMemoryMaxConsumed = 0; +ULONG ulMemoryConsumed = 0; PITEM _param( WORD wParam, WORD wMask ) { @@ -109,7 +108,7 @@ char * _pards( WORD wParam, ... ) else if( IS_DATE( pItem ) ) { - julian2greg( pItem->value.lDate, &lDay, &lMonth, &lYear ); + hb_julian2greg( pItem->value.lDate, &lDay, &lMonth, &lYear ); stack.szDate[ 0 ] = ( lYear / 1000 ) + '0'; stack.szDate[ 1 ] = ( ( lYear % 1000 ) / 100 ) + '0'; @@ -322,7 +321,7 @@ void _retds( char * szDate ) /* szDate must have yyyymmdd format */ /* QUESTION: Is this ok ? we are going to use a long to store the date */ /* QUESTION: What happens if we use sizeof( LONG ) instead ? */ /* QUESTION: Would it break Clipper language code ? */ - stack.Return.value.lDate = greg2julian( lDay, lMonth, lYear ); + stack.Return.value.lDate = hb_greg2julian( lDay, lMonth, lYear ); } void _retnd( double dNumber ) @@ -449,7 +448,7 @@ void _stords( char * szDate, WORD wParam, ... ) /* szDate must have yyyymmdd for pItemRef = stack.pItems + pItem->value.wItem; ItemRelease( pItemRef ); pItemRef->wType = IT_DATE; - pItemRef->value.lDate = greg2julian( lDay, lMonth, lYear ); + pItemRef->value.lDate = hb_greg2julian( lDay, lMonth, lYear ); } } } diff --git a/harbour/source/rtl/itemapi.c b/harbour/source/rtl/itemapi.c index f0971500fd..7e8b7d4b2b 100644 --- a/harbour/source/rtl/itemapi.c +++ b/harbour/source/rtl/itemapi.c @@ -9,10 +9,6 @@ extern STACK stack; extern PSYMBOL symEval; -/* TODO: Someone make a dates.h so this isn't necessary! */ -long greg2julian( long lDay, long lMonth, long lYear ); -extern void julian2greg( long julian, long * plDay, long * plMonth, long * plYear ); - BOOL _evalNew( PEVALINFO pEvalInfo, PITEM pItem ) { BOOL bResult = FALSE; @@ -228,7 +224,7 @@ char *_itemGetDS( PITEM pItem, char *szDate ) if( pItem && IS_DATE(pItem) ) { long lDay, lMonth, lYear; - julian2greg(pItem->value.lDate, &lDay, &lMonth, &lYear); + hb_julian2greg(pItem->value.lDate, &lDay, &lMonth, &lYear); szDate[ 0 ] = ( lYear / 1000 ) + '0'; szDate[ 1 ] = ( ( lYear % 1000 ) / 100 ) + '0'; @@ -318,7 +314,7 @@ PITEM _itemPutDS( PITEM pItem, char *szDate ) /* QUESTION: Is this ok ? we are going to use a long to store the date */ /* QUESTION: What happens if we use sizeof( LONG ) instead ? */ /* QUESTION: Would it break Clipper language code ? */ - pItem->value.lDate = greg2julian(lDay, lMonth, lYear); + pItem->value.lDate = hb_greg2julian(lDay, lMonth, lYear); return pItem; } diff --git a/harbour/source/rtl/strcmp.c b/harbour/source/rtl/strcmp.c index 6e1019f5c5..66b9dbe1ba 100644 --- a/harbour/source/rtl/strcmp.c +++ b/harbour/source/rtl/strcmp.c @@ -4,9 +4,9 @@ #include -int OurStrCmp( PITEM pFirst, PITEM pSecond ) /* Check whether two strings - are equal (0), smaller (-1), - or greater (1) */ +int hb_itemStrCmp( PITEM pFirst, PITEM pSecond ) /* Check whether two strings + are equal (0), smaller (-1), + or greater (1) */ { char *szFirst = pFirst->value.szText; char *szSecond = pSecond->value.szText; diff --git a/harbour/source/rtl/strings.c b/harbour/source/rtl/strings.c index 21b0ef5b59..d5f85487c7 100644 --- a/harbour/source/rtl/strings.c +++ b/harbour/source/rtl/strings.c @@ -9,18 +9,22 @@ #define HB_ISSPACE(c) ((c) == 9 || (c) == 10 || (c) == 13 || (c) == 32) -BOOL strempty( char * szText, long lLen ) +BOOL hb_strempty( char * szText, ULONG ulLen ) { - BOOL bStillEmpty = TRUE; - char c; + BOOL bRetVal = TRUE; - while( bStillEmpty && lLen-- ) /* Still blanks ? */ + while( ulLen-- ) { - c = *szText++; - if( !HB_ISSPACE(c) ) - bStillEmpty = FALSE; + char c = szText[ulLen]; + + if( !HB_ISSPACE( c ) ) + { + bRetVal = FALSE; + break; + } } - return bStillEmpty; + + return bRetVal; } /* determines if first char of string is letter */ @@ -57,7 +61,7 @@ HARBOUR ISLOWER( void ) /* trims from the left, and returns a new pointer to szText */ /* also returns the new length in lLen */ -char *LTrim( char *szText, long *lLen ) +char *hb_LTrim( char *szText, long *lLen ) { while( *lLen && HB_ISSPACE(*szText) ) { @@ -78,7 +82,7 @@ HARBOUR LTRIM( void ) if( pText ) { long lLen = pText->wLength; - char *szText = LTrim(pText->value.szText, &lLen); + char *szText = hb_LTrim(pText->value.szText, &lLen); _retclen(szText, lLen); } @@ -101,7 +105,7 @@ HARBOUR LTRIM( void ) } /* returns szText and the new length in lLen */ -long RTrimLen( char *szText, long lLen ) +long hb_RTrimLen( char *szText, long lLen ) { while( lLen && szText[lLen - 1] == ' ' ) lLen--; @@ -116,7 +120,7 @@ HARBOUR RTRIM( void ) { PITEM pText = _param(1, IT_STRING); if( pText ) - _retclen(pText->value.szText, RTrimLen(pText->value.szText, pText->wLength)); + _retclen(pText->value.szText, hb_RTrimLen(pText->value.szText, pText->wLength)); else /* Clipper doesn't error */ _retc(""); @@ -144,9 +148,9 @@ HARBOUR ALLTRIM( void ) if( _pcount() > 0 ) { char *szText = _parc(1); - long lLen = RTrimLen(szText, _parclen(1)); + long lLen = hb_RTrimLen(szText, _parclen(1)); - szText = LTrim(szText, &lLen); + szText = hb_LTrim(szText, &lLen); _retclen(szText, lLen); } @@ -272,7 +276,7 @@ HARBOUR PADC( void ) _retc(""); } -ULONG At(char *szSub, long lSubLen, char *szText, long lLen) +ULONG hb_At(char *szSub, long lSubLen, char *szText, long lLen) { if( lSubLen ) { @@ -312,7 +316,7 @@ HARBOUR AT( void ) { if( pText->wType == IT_STRING && pSub->wType == IT_STRING ) { - _retnl( At(pSub->value.szText, pSub->wLength, pText->value.szText, pText->wLength) ); + _retnl( hb_At(pSub->value.szText, pSub->wLength, pText->value.szText, pText->wLength) ); } else { @@ -592,7 +596,7 @@ HARBOUR SUBSTR( void ) } /* converts szText to lower case. Does not create a new string! */ -char *Lower(char *szText, long lLen) +char *hb_Lower(char *szText, long lLen) { long i; for( i = 0; i < lLen; i++ ) @@ -611,7 +615,7 @@ HARBOUR LOWER( void ) { long lLen = pText->wLength; - _retclen(Lower(pText->value.szText, lLen), lLen); + _retclen(hb_Lower(pText->value.szText, lLen), lLen); } else { @@ -632,7 +636,7 @@ HARBOUR LOWER( void ) } /* converts szText to upper case. Does not create a new string! */ -char *Upper(char *szText, long lLen) +char *hb_Upper(char *szText, long lLen) { long i; for( i = 0; i < lLen; i++ ) @@ -651,7 +655,7 @@ HARBOUR UPPER( void ) { long lLen = pText->wLength; - _retclen(Upper(pText->value.szText, lLen), lLen); + _retclen(hb_Upper(pText->value.szText, lLen), lLen); } else { @@ -956,7 +960,7 @@ HARBOUR STRTRAN( void ) } /* returns an integer value of "numerical string" */ -double Val( char *szText ) +double hb_Val( char *szText ) { return atof(szText); } @@ -969,7 +973,7 @@ HARBOUR VAL( void ) PITEM pText = _param(1, IT_STRING); if( pText ) - _retnd(Val(pText->value.szText)); + _retnd(hb_Val(pText->value.szText)); else { PITEM pError = _errNew(); diff --git a/harbour/source/rtl/transfrm.c b/harbour/source/rtl/transfrm.c index 651fb73776..72de5bf5f0 100644 --- a/harbour/source/rtl/transfrm.c +++ b/harbour/source/rtl/transfrm.c @@ -14,7 +14,6 @@ extern STACK stack; -void julian2greg(long, long*, long*, long*); /* TOFIX: Should go away */ void StackPop( void ); /* TOFIX: Should go away */ /* Function flags */ @@ -382,7 +381,7 @@ char *DatePicture( long lDate, int iPicFlags, long *lRetSize ) else { iPicFlags |= PF_ZERO; /* Pad with zeros */ - julian2greg( lDate, &lDay, &lMonth, &lYear ); + hb_julian2greg( lDate, &lDay, &lMonth, &lYear ); /* Calculate d/m/y */ } iLenPic = strlen( szDateFormat ); diff --git a/harbour/source/tools/stringsx.c b/harbour/source/tools/stringsx.c index f1ff0d5502..2d5189b34a 100644 --- a/harbour/source/tools/stringsx.c +++ b/harbour/source/tools/stringsx.c @@ -17,7 +17,7 @@ HARBOUR STRDUMP( void ) printf("\n"); } -char *StrToken(char *szText, long lText, long lIndex, char cDelimiter, long *lLen) +char *hb_strtoken(char *szText, long lText, long lIndex, char cDelimiter, long *lLen) { long wStart, wEnd = 0, wCounter = 0; @@ -70,7 +70,7 @@ HARBOUR STRTOKEN( void ) if( !cDelimiter ) cDelimiter = ' '; - szText = StrToken(_parc(1), _parclen(1), lIndex, cDelimiter, &lLen); + szText = hb_strtoken(_parc(1), _parclen(1), lIndex, cDelimiter, &lLen); _stornl(lLen, 4); _retclen(szText, lLen); diff --git a/harbour/source/vm/dynsym.c b/harbour/source/vm/dynsym.c index e2b482344c..61deccffcf 100644 --- a/harbour/source/vm/dynsym.c +++ b/harbour/source/vm/dynsym.c @@ -36,7 +36,7 @@ void LogSymbols( void ) #define LEFT_GREATER 1 #define SYM_EQUAL 0 -static WORD _strgreater( char * sz1, char * sz2 ) +static WORD hb_strgreater( char * sz1, char * sz2 ) { /* Values returned : SYM_EQUAL, LEFT_GREATER, RIGHT_GREATER */ @@ -112,7 +112,7 @@ PDYNSYM NewDynSym( PSYMBOL pSymbol ) /* creates a new dynamic symbol */ return pDynSym; } -static void OurStrUpr( char * szText ) +static void hb_strupr( char * szText ) { char *p; @@ -126,7 +126,7 @@ PDYNSYM GetDynSym( char * szName ) /* finds and creates a symbol if not found * char * szUprName = ( char * ) _xgrab( strlen( szName ) + 1 ); strcpy( szUprName, szName ); /* make a copy as we may get a const string */ - OurStrUpr( szUprName ); /* turn it uppercase */ + hb_strupr( szUprName ); /* turn it uppercase */ /* if( strlen( szUprName ) > 10 ) szUprName[ 10 ] = 0; keeps this here for 10 chars /c compatibility mode */ @@ -176,7 +176,7 @@ PDYNSYM FindDynSym( char * szName ) while( wFirst < wLast ) { - switch( _strgreater( pDynItems[ wMiddle ].pDynSym->pSymbol->szName, szName ) ) + switch( hb_strgreater( pDynItems[ wMiddle ].pDynSym->pSymbol->szName, szName ) ) { case SYM_EQUAL: /* they are equals */ return pDynItems[ wMiddle ].pDynSym; diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index bfddde42ff..06f2d2d937 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -25,8 +25,6 @@ #include #include -BOOL strempty( char * szText, long lLen ); - HARBOUR ERRORSYS( void ); HARBOUR ERRORNEW( void ); HARBOUR EVAL( void ); /* Evaluates a codeblock from Harbour */ @@ -751,7 +749,7 @@ void Equal( void ) else if( IS_STRING( pItem1 ) && IS_STRING( pItem2 ) ) { - i = OurStrCmp( pItem1, pItem2 ); + i = hb_itemStrCmp( pItem1, pItem2 ); StackPop(); StackPop(); PushLogical( i == 0 ); @@ -859,7 +857,7 @@ void Greater( void ) if( IS_STRING( stack.pPos - 2 ) && IS_STRING( stack.pPos - 1 ) ) { - i = OurStrCmp( stack.pPos - 2, stack.pPos - 1 ); + i = hb_itemStrCmp( stack.pPos - 2, stack.pPos - 1 ); StackPop(); StackPop(); PushLogical( i > 0 ); @@ -894,7 +892,7 @@ void GreaterEqual( void ) if( IS_STRING( stack.pPos - 2 ) && IS_STRING( stack.pPos - 1 ) ) { - i = OurStrCmp( stack.pPos - 2, stack.pPos - 1 ); + i = hb_itemStrCmp( stack.pPos - 2, stack.pPos - 1 ); StackPop(); StackPop(); PushLogical( i >= 0 ); @@ -1004,7 +1002,7 @@ void Less( void ) if( IS_STRING( stack.pPos - 2 ) && IS_STRING( stack.pPos - 1 ) ) { - i = OurStrCmp( stack.pPos - 2, stack.pPos - 1 ); + i = hb_itemStrCmp( stack.pPos - 2, stack.pPos - 1 ); StackPop(); StackPop(); PushLogical( i < 0 ); @@ -1039,7 +1037,7 @@ void LessEqual( void ) if( IS_STRING( stack.pPos - 2 ) && IS_STRING( stack.pPos - 1 ) ) { - i = OurStrCmp( stack.pPos - 2, stack.pPos - 1 ); + i = hb_itemStrCmp( stack.pPos - 2, stack.pPos - 1 ); StackPop(); StackPop(); PushLogical( i <= 0 ); @@ -1127,7 +1125,7 @@ void NotEqual( void ) else if( IS_STRING( pItem1 ) && IS_STRING( pItem2 ) ) { - i = OurStrCmp( pItem1, pItem2 ); + i = hb_itemStrCmp( pItem1, pItem2 ); StackPop(); StackPop(); PushLogical( i != 0 ); @@ -1853,7 +1851,7 @@ HARBOUR EMPTY() break; case IT_STRING: - _retl( strempty( _parc( 1 ), _parclen( 1 ) ) ); + _retl( hb_strempty( _parc( 1 ), _parclen( 1 ) ) ); break; case IT_NUMERIC: