From bfaf134046648d2465f5c13c0ced166c39e52a16 Mon Sep 17 00:00:00 2001 From: Eddie Runia Date: Fri, 23 Jul 1999 10:14:30 +0000 Subject: [PATCH] see changelog --- harbour/ChangeLog | 8 ++- harbour/source/rtl/transfrm.c | 111 +++++++++++++++++------------ harbour/tests/working/transdef.prg | 6 ++ 3 files changed, 79 insertions(+), 46 deletions(-) create mode 100644 harbour/tests/working/transdef.prg diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 906e3aaf5d..790010018a 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,8 +1,14 @@ +19990723-12:00 CET Eddie Runia + * source/rtl/transfrm.c + Decimals and width from parameter used if no template specification + is present + + tests/working/transdef.prg + Test program used + 19990723-07:45 CET Matthew Hamilton * tests/working/inifiles.prg Even newer version - 19990723-02:45 GMT+2 Ryszard Glab *source/compiler/harbour.y diff --git a/harbour/source/rtl/transfrm.c b/harbour/source/rtl/transfrm.c index 889e095d6d..fa86932b45 100644 --- a/harbour/source/rtl/transfrm.c +++ b/harbour/source/rtl/transfrm.c @@ -162,9 +162,11 @@ int PictFunc( char **szPict, long *lPicLen ) iPicFlags : Function flags. NUM_DATE tells whether its a number or date dValue : Number to picture lRetSize : The size of the returned string is passed here ! + iOrigWidth : Original width + iOrigDec : Original decimals */ char *NumPicture( char *szPic, long lPic, int iPicFlags, double dValue, - long *lRetSize ) + long *lRetSize, int iOrigWidth, int iOrigDec ) { int iWidth; /* Width of string */ int iDecimals; /* Number of decimals */ @@ -184,10 +186,10 @@ char *NumPicture( char *szPic, long lPic, int iPicFlags, double dValue, szRet = (char *) hb_xgrab( lPic+4 ); /* Grab enough */ *szRet = 0; - for( i=0; ipSymbol ); /* Push STR function */ + PushSymbol ( GetDynSym( "STR" )->pSymbol ); /* Push STR function */ PushNil (); /* Function call. No object */ PushDouble ( dPush, iDecimals ); /* Push value to transform */ + if( !iWidth ) /* Width calculated ?? */ + { + iWidth = iOrigWidth; /* Push original width */ + iDecimals = iOrigDec; /* Push original decimals */ + } PushInteger( iWidth ); /* Push numbers width */ PushInteger( iDecimals ); /* Push decimals */ Function( 3 ); /* 3 Parameters */ @@ -244,77 +251,88 @@ char *NumPicture( char *szPic, long lPic, int iPicFlags, double dValue, if( iPicFlags & PF_LEFT ) /* Left align */ { - for( i=0; szStr[i] == ' ' && i < iWidth; i++ ); + for( i=0; szStr[i] == ' ' && i <= iWidth; i++ ); /* Find first non-space */ - if( i && i != iWidth ) /* Any found or end of str */ + if( i && i != ( iWidth + 1 ) ) /* Any found or end of str */ { - memcpy(szStr, szStr+i, iWidth-i); - for( i = iWidth-i; i < iWidth; i++ ) + memcpy( szStr, szStr + i, iWidth - i ); + for( i = iWidth - i; i < iWidth; i++ ) szStr[i] = ' '; /* Pad with spaces */ } } - for( i=0; i < lPic; i++ ) + if( !iCount ) /* No real picture */ { - cPic = szPic[i]; - if( cPic == '9' || cPic == '#' ) - szRet[i] = szStr[iCount++]; /* Just copy */ - else if( cPic == '.' ) + hb_xfree( szRet ); + szRet = (char *) hb_xgrab( iWidth + 1 ); + /* Grab enough */ + memcpy( szRet, szStr, iWidth ); + szRet[ iWidth ] = 0; /* Terminate string */ + } + else + { + for( i=0; i < lPic; i++ ) { - if( iPicFlags & PF_NUMDATE ) /* Dot in date */ - szRet[i] = cPic; - else /* Dot in number */ + cPic = szPic[i]; + if( cPic == '9' || cPic == '#' ) + szRet[ i ] = szStr[ iCount++ ]; /* Just copy */ + else if( cPic == '.' ) { - if( iPicFlags & PF_EXCHANG ) /* Exchange . and , */ + if( iPicFlags & PF_NUMDATE ) /* Dot in date */ + szRet[ i ] = cPic; + else /* Dot in number */ { - szRet[i] = ','; + if( iPicFlags & PF_EXCHANG ) /* Exchange . and , */ + { + szRet[ i ] = ','; + iCount++; + } + else + szRet[ i ] = szStr[ iCount++ ]; + } + } + else if( cPic == '$' || cPic == '*' ) + { + if( szStr[iCount] == ' ' ) + { + szRet[i] = cPic; iCount++; } else szRet[i] = szStr[iCount++]; } - } - else if( cPic == '$' || cPic == '*' ) - { - if( szStr[iCount] == ' ' ) + else if( cPic == ',' ) /* Comma */ { - szRet[i] = cPic; - iCount++; - } - else - szRet[i] = szStr[iCount++]; - } - else if( cPic == ',' ) /* Comma */ - { - if( iCount && isdigit(szStr[iCount-1]) ) /* May we place it */ - { - if( iPicFlags & PF_EXCHANG ) - szRet[i] = '.'; + if( iCount && isdigit( szStr[ iCount - 1 ] ) ) + { /* May we place it */ + if( iPicFlags & PF_EXCHANG ) + szRet[i] = '.'; + else + szRet[i] = ','; + } else - szRet[i] = ','; + szRet[i] = ' '; } else - szRet[i] = ' '; + szRet[i] = cPic; } - else - szRet[i] = cPic; } - if( (iPicFlags & PF_CREDIT) && (dValue >= 0) ) + if( ( iPicFlags & PF_CREDIT ) && ( dValue >= 0 ) ) { szRet[i++] = ' '; szRet[i++] = 'C'; szRet[i++] = 'R'; } - if( (iPicFlags & PF_DEBIT) && (dValue < 0) ) + if( ( iPicFlags & PF_DEBIT ) && ( dValue < 0 ) ) { szRet[i++] = ' '; szRet[i++] = 'D'; szRet[i++] = 'B'; } - if( (iPicFlags & PF_PARNEG) && (dValue < 0) ) + if( ( iPicFlags & PF_PARNEG ) && ( dValue < 0 ) ) { if( isdigit(*szRet) ) /* Overflow */ { @@ -348,7 +366,7 @@ char *NumPicture( char *szPic, long lPic, int iPicFlags, double dValue, */ PHB_ITEM NumDefault( double dValue ) { /* Default number */ - PushSymbol ( hb_GetDynSym( "STR" )->pSymbol ); /* Push STR function */ + PushSymbol ( GetDynSym( "STR" )->pSymbol ); /* Push STR function */ PushNil (); /* Function call. No object */ PushDouble ( dValue, hb_set.HB_SET_DECIMALS ); @@ -548,7 +566,8 @@ HARBOUR HB_TRANSFORM( void ) case IT_INTEGER: { szResult = NumPicture( szPic + lPicStart, lPic, iPicFlags, - (double) pExp->item.asInteger.value, &lResultPos ); + (double) pExp->item.asInteger.value, &lResultPos, + pExp->item.asInteger.length, pExp->item.asInteger.decimal ); hb_retclen( szResult, lResultPos ); hb_xfree( szResult ); break; @@ -556,7 +575,8 @@ HARBOUR HB_TRANSFORM( void ) case IT_LONG: { szResult = NumPicture( szPic + lPicStart, lPic, iPicFlags, - (double) pExp->item.asLong.value, &lResultPos ); + (double) pExp->item.asLong.value, &lResultPos, + pExp->item.asLong.length, pExp->item.asLong.decimal ); hb_retclen( szResult, lResultPos ); hb_xfree( szResult ); break; @@ -564,7 +584,8 @@ HARBOUR HB_TRANSFORM( void ) case IT_DOUBLE: { szResult = NumPicture( szPic + lPicStart, lPic, iPicFlags, - (double) pExp->item.asDouble.value, &lResultPos ); + (double) pExp->item.asDouble.value, &lResultPos, + pExp->item.asDouble.length, pExp->item.asDouble.decimal ); hb_retclen( szResult, lResultPos); hb_xfree( szResult ); break; diff --git a/harbour/tests/working/transdef.prg b/harbour/tests/working/transdef.prg new file mode 100644 index 0000000000..c7de15d9cc --- /dev/null +++ b/harbour/tests/working/transdef.prg @@ -0,0 +1,6 @@ +procedure main +local a := 1, b := 5.22 + qout( "[" + transform( 1, "@B" ) + "]" ) + qout( "[" + transform( 1.0, "@B" ) + "]" ) + qout( "[" + transform( day( ctod("1/1/2000") ), "@B" ) + "]" ) +quit \ No newline at end of file