[Libreoffice-commits] .: 5 commits - basic/inc basic/source

Noel Power noelp at kemper.freedesktop.org
Tue Dec 21 06:52:23 PST 2010


 basic/inc/basic/sbx.hxx           |    5 
 basic/inc/basic/sbxdef.hxx        |  476 +++++++++++++++++------------------
 basic/inc/basic/sbxvar.hxx        |  316 +++++++----------------
 basic/source/classes/sbunoobj.cxx |   26 -
 basic/source/runtime/methods1.cxx |   30 +-
 basic/source/sbx/makefile.mk      |    1 
 basic/source/sbx/sbxbool.cxx      |   34 --
 basic/source/sbx/sbxbyte.cxx      |   41 ---
 basic/source/sbx/sbxchar.cxx      |   43 +--
 basic/source/sbx/sbxconv.hxx      |   45 +--
 basic/source/sbx/sbxcurr.cxx      |  506 ++++++++++++++++++++++++--------------
 basic/source/sbx/sbxdate.cxx      |   18 -
 basic/source/sbx/sbxdbl.cxx       |   19 +
 basic/source/sbx/sbxdec.cxx       |   94 +------
 basic/source/sbx/sbxint.cxx       |  165 ++++--------
 basic/source/sbx/sbxlng.cxx       |   60 +---
 basic/source/sbx/sbxsng.cxx       |   39 +-
 basic/source/sbx/sbxstr.cxx       |   20 -
 basic/source/sbx/sbxuint.cxx      |   43 +--
 basic/source/sbx/sbxulng.cxx      |   35 --
 basic/source/sbx/sbxvals.cxx      |  112 --------
 basic/source/sbx/sbxvalue.cxx     |  389 ++++++++++-------------------
 22 files changed, 1035 insertions(+), 1482 deletions(-)

New commits:
commit 9013a3cd9f1bcbe196ffdf4193dd4c71c6d592cb
Merge: af980a7... c2553e8...
Author: Noel Power <noel.power at novell.com>
Date:   Tue Dec 21 13:08:15 2010 +0000

    Merge remote branch 'origin/feature/currency-64bit'

commit c2553e86af652f80c8e5dae0795e23d69d6cc2d8
Author: Noel Power <noel.power at novell.com>
Date:   Wed Dec 15 09:17:40 2010 +0000

    enable lcl_Read/writeSbxVariable for SbxSALINT64/SbxSALUINT64 types

diff --git a/basic/source/runtime/methods1.cxx b/basic/source/runtime/methods1.cxx
index 54768cc..36af58b 100644
--- a/basic/source/runtime/methods1.cxx
+++ b/basic/source/runtime/methods1.cxx
@@ -885,15 +885,12 @@ BOOL lcl_WriteSbxVariable( const SbxVariable& rVar, SvStream* pStrm,
                     *pStrm << (USHORT)SbxLONG; // VarType Id
                 *pStrm << rVar.GetLong();
                 break;
-#if IMPLEMENTATION_READY
         case SbxSALINT64:
         case SbxSALUINT64:
                 if( bIsVariant )
                     *pStrm << (USHORT)SbxSALINT64; // VarType Id
-                //TODO fix truncating cast with new stream method or 2 part print
-                *pStrm << (sal_Int32)rVar.GetInt64();
+                *pStrm << (sal_uInt64)rVar.GetInt64();
                 break;
-#endif
         case SbxSINGLE:
                 if( bIsVariant )
                     *pStrm << (USHORT)eType; // VarType Id
@@ -995,17 +992,14 @@ BOOL lcl_ReadSbxVariable( SbxVariable& rVar, SvStream* pStrm,
                 rVar.PutLong( aInt );
                 }
                 break;
-#if IMPLEMENTATION_READY
         case SbxSALINT64:
         case SbxSALUINT64:
                 {
-                sal_Int32 aInt;
-                //TODO fix incorrect use of 32bit type with new stream method in tools
+                sal_uInt32 aInt;
                 *pStrm >> aInt;
                 rVar.PutInt64( (sal_Int64)aInt );
                 }
                 break;
-#endif
         case SbxSINGLE:
                 {
                 float nS;
commit 493bea7486f5239b2c35a51369f23f7ef815226d
Author: Noel Power <noel.power at novell.com>
Date:   Tue Dec 14 20:38:17 2010 +0000

    Changes to ImpStringToCurrency
    
    Make ImpStringToCurrency be less of a home grown parser, use existing OUString -> number functionality ( and ws treatment ) Also raise an error now if illegal chars are found in the middle of the string ( including spaces )

diff --git a/basic/source/sbx/sbxcurr.cxx b/basic/source/sbx/sbxcurr.cxx
index 1de0ec4..9278ada 100644
--- a/basic/source/sbx/sbxcurr.cxx
+++ b/basic/source/sbx/sbxcurr.cxx
@@ -118,24 +118,18 @@ static rtl::OUString ImpCurrencyToString( const sal_Int64 &rVal )
 
 static sal_Int64 ImpStringToCurrency( const rtl::OUString &rStr )
 {
-// TODO consider various possible errors: overflow, end-of-string check for leftovers from malformed string
-    sal_Int32   nFractDigit = 4;
-    sal_Int64   nResult = 0;
-    sal_Bool    bNeg = sal_False;
 
-    const sal_Unicode* p = rStr.getStr();
+    sal_Int32   nFractDigit = 4;
 
     SvtSysLocale aSysLocale;
+    sal_Unicode cDeciPnt = sal_Unicode('.');
+    sal_Unicode c1000Sep = sal_Unicode(',');
+
 #if MAYBEFUTURE
     const LocaleDataWrapper& rData = aSysLocale.GetLocaleData();
     sal_Unicode cLocaleDeciPnt = rData.getNumDecimalSep().GetBuffer()[0];
     sal_Unicode cLocale1000Sep = rData.getNumThousandSep().GetBuffer()[0];
-#endif
-    sal_Unicode cSpaceSep = sal_Unicode(' ');
-    sal_Unicode cDeciPnt = sal_Unicode('.');
-    sal_Unicode c1000Sep = sal_Unicode(',');
 
-#if MAYBEFUTURE
         // score each set of separators (Locale and Basic) on total number of matches
         // if one set has more matches use that set
         // if tied use the set with the only or rightmost decimal separator match
@@ -171,51 +165,53 @@ static sal_Int64 ImpStringToCurrency( const rtl::OUString &rStr )
     }
 #endif
 
-    //  p == original param value: re-starting at top of string
-    while( *p == cSpaceSep ) p++;                   // skip leading spaces
-    if( *p == sal_Unicode('-') )
-    {
-        p++;
-        bNeg = sal_True;
-    }
-    else if ( *p == sal_Unicode('+') )
-        p++;
+    // lets use the existing string number conversions
+    // there is a performance impact here ( multiple string copies )
+    // but better I think than a home brewed string parser, if we need a parser
+    // we should share some existing ( possibly from calc is there a currency
+    // conversion there ? #TODO check )
+
+    rtl::OUString sTmp( rStr.trim() );
+    const sal_Unicode* p =  sTmp.getStr();
 
-    while( *p == cSpaceSep ) p++;                   // skip space between sign and number
+    // normalise string number by removeing thousands & decimal point seperators
+    rtl::OUStringBuffer sNormalisedNumString( sTmp.getLength() +  nFractDigit );
 
-    // always accept space as thousand separator (is never decimal pt; maybe stray)
-    // exits on non-numeric (incl. null terminator)
-    while( ( *p >= '0' && *p <= '9' ) || *p == c1000Sep || *p == cSpaceSep )
+    if ( *p == '-'  || *p == '+' )
+        sNormalisedNumString.append( *p );
+
+    while ( ( *p >= '0' && *p <= '9' ) )
     {
-        if ( *p >= '0' && *p <= '9' )
-            nResult = 10*nResult + (sal_Int64)*p - (sal_Int64)'0';
-        p++;
-        // could be overflow here ... new result < last result (results always > 0)
+        sNormalisedNumString.append( *p++ );
+        // #TODO in vba mode set runtime error when a space ( or other )
+        // illegal character is found
+        if( *p == c1000Sep )
+            p++;
     }
 
-    if( *p == cDeciPnt ) {
+    if( *p == cDeciPnt )
+    {
         p++;
-        while( (nFractDigit && *p >= '0' && *p <= '9') || *p == cSpaceSep )
+        while( nFractDigit && *p >= '0' && *p <= '9' )
         {
-            nResult = 10*nResult + (sal_Int64)*p - (sal_Int64)'0';
+            sNormalisedNumString.append( *p++ );
             nFractDigit--;
-            p++;
-            // could be overflow here ...
         }
-        while( *p == cSpaceSep ) p++;               // skip mid-number/trailing spaces
-        if( *p >= '5' && *p <= '9' ) nResult ++;    // round 5-9 up = round to nearest
     }
-    while( *p == cSpaceSep ) p++;                   // skip mid-number/trailing spaces
-    // error cases of junky string skip thru to end up here
-    // warning cases of extra num ignored end up here too
+    // can we raise error here ? ( previous behaviour was more forgiving )
+    // so... not sure that could bread existing code, lets see if anyone
+    // complains.
 
-    // make sure all of CURRENCY_FACTOR is applied
-    while( nFractDigit ) {
-        nResult *= 10;
+    if ( p != sTmp.getStr() + sTmp.getLength() )
+        SbxBase::SetError( SbxERR_CONVERSION );
+    while( nFractDigit )
+    {
+        sNormalisedNumString.append( '0' );
         nFractDigit--;
     }
-    if( bNeg )  return -nResult;
-    return nResult;
+
+    sal_Int64 result = sNormalisedNumString.makeStringAndClear().toInt64();
+    return result;
 }
 
 
commit 30c79efc5903edc5bc8994f518c206a608ef3a14
Author: Noel Power <noel.power at novell.com>
Date:   Tue Dec 14 18:23:05 2010 +0000

    redo stream operators & misc changes to prepare to integrate into master

diff --git a/basic/source/classes/sbunoobj.cxx b/basic/source/classes/sbunoobj.cxx
index bab1cd6..c979455 100644
--- a/basic/source/classes/sbunoobj.cxx
+++ b/basic/source/classes/sbunoobj.cxx
@@ -1149,10 +1149,6 @@ Any sbxToUnoValueImpl( SbxVariable* pVar, bool bBlockConversionToSmallestType =
                         aType = ::getCppuType( (sal_Int16*)0 );
                     else if( d >= -SbxMAXLNG && d <= SbxMAXLNG )
                         aType = ::getCppuType( (sal_Int32*)0 );
-#if MAYBEFUTURE
-                    else
-                        aType = ::getCppuType( (sal_Int64*)0 );
-#endif
                 }
                 break;
             }
diff --git a/basic/source/sbx/sbxcurr.cxx b/basic/source/sbx/sbxcurr.cxx
index f40e0b0..1de0ec4 100644
--- a/basic/source/sbx/sbxcurr.cxx
+++ b/basic/source/sbx/sbxcurr.cxx
@@ -43,8 +43,9 @@ static rtl::OUString ImpCurrencyToString( const sal_Int64 &rVal )
     sal_Int64 absVal = isNeg ? -rVal : rVal;
 
     SvtSysLocale aSysLocale;
-    sal_Unicode cDecimalSep = '.', cThousandSep = ',';
+    sal_Unicode cDecimalSep = '.';
 #if MAYBEFUTURE
+    sal_Unicode cThousandSep = ',';
     const LocaleDataWrapper& rData = aSysLocale.GetLocaleData();
     cDecimalSep = rData.getNumDecimalSep().GetBuffer()[0];
     cThousandSep = rData.getNumThousandSep().GetBuffer()[0];
@@ -64,11 +65,13 @@ static rtl::OUString ImpCurrencyToString( const sal_Int64 &rVal )
     if ( !bLessThanOne )
     {
         nCapacity = initialLen + 1;
+#if MAYBEFUTURE
         if ( initialLen > 5 )
         {
             sal_Int32 nThouSeperators = ( initialLen - 5 ) / 3;
             nCapacity += nThouSeperators;
         }
+#endif
     }
 
     if ( isNeg )
@@ -85,8 +88,10 @@ static rtl::OUString ImpCurrencyToString( const sal_Int64 &rVal )
     {
         if ( nDigitCount == 4 )
             aBuf.setCharAt( nInsertIndex--, cDecimalSep );
+#if MAYBEFUTURE
         if ( nDigitCount > 4 && ! ( ( nDigitCount - 4  ) % 3) )
             aBuf.setCharAt( nInsertIndex--, cThousandSep );
+#endif
         if ( nDigitCount < initialLen )
             aBuf.setCharAt( nInsertIndex--, aAbsStr[ charCpyIndex-- ] );
         else
diff --git a/basic/source/sbx/sbxvalue.cxx b/basic/source/sbx/sbxvalue.cxx
index ff30acd..690df56 100644
--- a/basic/source/sbx/sbxvalue.cxx
+++ b/basic/source/sbx/sbxvalue.cxx
@@ -1502,6 +1502,8 @@ BOOL SbxValue::Compare( SbxOperator eOp, const SbxValue& rOp ) const
 
 BOOL SbxValue::LoadData( SvStream& r, USHORT )
 {
+    // #TODO see if these types are really dumped to any stream
+    // more than likely this is functionality used in the binfilter alone
     SbxValue::Clear();
     UINT16 nType;
     r >> nType;
@@ -1543,21 +1545,20 @@ BOOL SbxValue::LoadData( SvStream& r, USHORT )
             break;
         }
         case SbxSALUINT64:
-        {
-// TODO fix write for whole 64 bits was Hi then Lo
-            sal_uInt32 tmpHi, tmpLo;
-            r >> tmpHi >> tmpLo;
-            aData.uInt64 = ((sal_Int64)tmpHi << 32) || (sal_Int64)tmpLo;
-            break;
-        }
         case SbxSALINT64:
+            // Rather ugly use of the union here because we only
+            // have a SvStream& SvStream::operator>>(sal_uInt64&) available to us
+            // There is no SvStream::operator>>(sal_Int64&) due to conflict with
+            // SvStream::operator>>(long&) ( at least on 64 bit linux )
+            r >> aData.uInt64;
+            break;
         case SbxCURRENCY:
         {
-// TODO fix write for whole 64 bits was Hi then Lo
-            sal_Int32 tmpHi;
-            sal_uInt32 tmpLo;
+            sal_uInt32 tmpHi = 0;
+            sal_uInt32 tmpLo = 0;
             r >> tmpHi >> tmpLo;
-            aData.nInt64 = ((sal_Int64)tmpHi << 32) || (sal_Int64)tmpLo;
+            aData.nInt64 = ((sal_Int64)tmpHi << 32);
+            aData.nInt64 |= (sal_Int64)tmpLo;
             break;
         }
         case SbxSTRING:
@@ -1667,18 +1668,15 @@ BOOL SbxValue::StoreData( SvStream& r ) const
             r.WriteByteString( GetCoreString(), RTL_TEXTENCODING_ASCII_US );
             break;
         case SbxSALUINT64:
-        {
-// TODO check output from this
-            sal_uInt32 tmpHi = (aData.uInt64 >> 32);
-            r << tmpHi << (sal_uInt32)(aData.uInt64);
-            break;
-        }
         case SbxSALINT64:
+            // see comment in SbxValue::StoreData
+            r << aData.uInt64;
+            break;
         case SbxCURRENCY:
         {
-// TODO check output from this
-            sal_Int32 tmpHi = (aData.nInt64 >> 32);
-            r << tmpHi << (sal_Int32)(aData.nInt64);
+            sal_Int32 tmpHi = ( (aData.nInt64 >> 32) &  0xFFFFFFFF );
+            sal_Int32 tmpLo = ( sal_Int32 )aData.nInt64;
+            r << tmpHi << tmpLo;
             break;
         }
         case SbxSTRING:
commit c33c38979462dad9495a020174d53ecd332021bf
Author: Noel Power <noel.power at novell.com>
Date:   Mon Dec 6 17:36:57 2010 +0000

    John LeMoyne Castle's currency improvements

diff --git a/basic/inc/basic/sbx.hxx b/basic/inc/basic/sbx.hxx
index 54450c6..9b5acf4 100644
--- a/basic/inc/basic/sbx.hxx
+++ b/basic/inc/basic/sbx.hxx
@@ -33,14 +33,13 @@
 #include "svl/svarray.hxx"
 #include "svl/smplhint.hxx"
 #include "svl/lstner.hxx"
+
 #include <basic/sbxdef.hxx>
 #include <basic/sbxform.hxx>
-
 #include <basic/sbxobj.hxx>
 #include <basic/sbxprop.hxx>
 #include <basic/sbxmeth.hxx>
 
-class BigInt;
 class String;
 class UniString;
 class SvStream;
@@ -52,8 +51,6 @@ class SbxObject;
 class SbxArray;
 class SbxDimArray;
 class SbxFactory;
-struct SbxINT64;
-struct SbxUINT64;
 
 class SfxBroadcaster;
 class SvDispatch;
diff --git a/basic/inc/basic/sbxdef.hxx b/basic/inc/basic/sbxdef.hxx
index e5881ab..84c9832 100644
--- a/basic/inc/basic/sbxdef.hxx
+++ b/basic/inc/basic/sbxdef.hxx
@@ -38,14 +38,14 @@
 #ifndef _SBX_CLASS_TYPE
 #define _SBX_CLASS_TYPE
 
-enum SbxClassType {			// SBX-class-IDs (order is important!)
-    SbxCLASS_DONTCARE = 1,	// don't care (search, not 0 due to StarBASIC)
-    SbxCLASS_ARRAY,			// Array of SbxVariables
-    SbxCLASS_VALUE,			// simple value
-    SbxCLASS_VARIABLE,		// Variable (from here there is Broadcaster)
-    SbxCLASS_METHOD, 		// Method (Function or Sub)
-    SbxCLASS_PROPERTY,		// Property
-    SbxCLASS_OBJECT			// Object
+enum SbxClassType {         // SBX-class-IDs (order is important!)
+    SbxCLASS_DONTCARE = 1,  // don't care (search, not 0 due to StarBASIC)
+    SbxCLASS_ARRAY,         // Array of SbxVariables
+    SbxCLASS_VALUE,         // simple value
+    SbxCLASS_VARIABLE,      // Variable (from here there is Broadcaster)
+    SbxCLASS_METHOD,        // Method (Function or Sub)
+    SbxCLASS_PROPERTY,      // Property
+    SbxCLASS_OBJECT         // Object
 };
 
 #endif
@@ -54,90 +54,99 @@ enum SbxClassType {			// SBX-class-IDs (order is important!)
 #define _SBX_DATA_TYPE
 
 enum SbxDataType {
-    SbxEMPTY 	  =  0,	// * Uninitialized
-    SbxNULL 	  =  1,	// * Contains no valid data
-    SbxINTEGER	  =  2,	// * Integer (INT16)
-    SbxLONG		  =  3,	// * Long integer (INT32)
-    SbxSINGLE	  =  4,	// * Single-precision floating point number (float)
-    SbxDOUBLE	  =  5,	// * Double-precision floating point number (double)
-    SbxCURRENCY   =  6,	//   Currency (INT64)
-    SbxDATE		  =  7,	// * Date (double)
-    SbxSTRING	  =  8,	// * String (StarView)
-    SbxOBJECT     =  9,	// * SbxBase object pointer
-    SbxERROR      = 10,	// * Error (UINT16)
-    SbxBOOL		  = 11,	// * Boolean (0 or -1)
-    SbxVARIANT    = 12,	// * Display for variant datatype
-    SbxDATAOBJECT = 13,	// * Common data object w/o ref count
-
-    SbxCHAR		  = 16,	// * signed char
-    SbxBYTE 	  = 17,	// * unsigned char
-    SbxUSHORT	  = 18,	// * unsigned short (UINT16)
-    SbxULONG 	  = 19,	// * unsigned long (UINT32)
-    SbxLONG64	  = 20,	//   signed 64-bit int
-    SbxULONG64	  = 21,	//   unsigned 64-bit int
-    SbxINT		  = 22,	// * signed machine-dependent int
-    SbxUINT		  = 23,	// * unsigned machine-dependent int
-    SbxVOID		  = 24,	// * no value (= SbxEMPTY)
-    SbxHRESULT	  = 25,	//   HRESULT
-    SbxPOINTER	  = 26,	//   generic pointer
-    SbxDIMARRAY	  = 27,	//   dimensioned array
-    SbxCARRAY	  = 28,	//   C style array
-    SbxUSERDEF	  = 29, //   user defined
-    SbxLPSTR	  = 30,	// * null terminated string
-    SbxLPWSTR	  = 31,	//   wide null terminated string
-    SbxCoreSTRING = 32,	//   from 1997-4-10 for GetCoreString(), only for converting
-    SbxWSTRING	  = 33,	//   from 2000-10-4 Reimplemented for backwards compatibility (#78919)
-    SbxWCHAR	  = 34,	//   from 2000-10-4 Reimplemented for backwards compatibility (#78919)
-    SbxSALINT64	  = 35,	//   for UNO hyper
-    SbxSALUINT64  = 36,	//   for UNO unsigned hyper
-    SbxDECIMAL    = 37,	//   for UNO/automation Decimal
-
-    SbxVECTOR = 0x1000,	// simple counted array
-    SbxARRAY  = 0x2000,	// array
-    SbxBYREF  = 0x4000,	// access by reference
-
-    SbxSV1 	  = 128,  	// first defined data type for StarView
-    SbxMEMORYSTREAM,	// SvMemoryStream
-    SbxSTORAGE,			// SvStorage
-
-    SbxUSER1  = 256,  	// first user defined data type
-    SbxUSERn  = 2047  	// last user defined data type
+    SbxEMPTY    =  0,    // * Uninitialized
+    SbxNULL     =  1,    // * Contains no valid data
+    SbxINTEGER  =  2,    // * Integer (INT16)
+    SbxLONG     =  3,    // * Long integer (INT32)
+    SbxSINGLE   =  4,    // * Single-precision floating point number (float)
+    SbxDOUBLE   =  5,    // * Double-precision floating point number (double)
+    SbxCURRENCY =  6,    //   Currency (INT64)
+    SbxDATE     =  7,    // * Date (double)
+    SbxSTRING   =  8,    // * String (StarView)
+    SbxOBJECT   =  9,    // * SbxBase object pointer
+    SbxERROR    = 10,    // * Error (UINT16)
+    SbxBOOL     = 11,    // * Boolean (0 or -1)
+
+    SbxVARIANT    = 12,  // * Display for variant datatype
+    SbxDATAOBJECT = 13,  // * Common data object w/o ref count
+
+    SbxCHAR     = 16,    // * signed char
+    SbxBYTE     = 17,    // * unsigned char
+    SbxUSHORT   = 18,    // * unsigned short (UINT16)
+    SbxULONG    = 19,    // * unsigned long (UINT32)
+
+//deprecated:  // old 64bit types kept for backward compatibility in file I/O
+    SbxLONG64   = 20,    //   moved to SbxSALINT64  as 64bit int
+    SbxULONG64  = 21,    //   moved to SbxSALUINT64 as 64bit int
+
+    SbxINT      = 22,    // * signed machine-dependent int
+    SbxUINT     = 23,    // * unsigned machine-dependent int
+
+    SbxVOID     = 24,    // * no value (= SbxEMPTY)
+    SbxHRESULT  = 25,    //   HRESULT
+    SbxPOINTER  = 26,    //   generic pointer
+    SbxDIMARRAY = 27,    //   dimensioned array
+    SbxCARRAY   = 28,    //   C style array
+    SbxUSERDEF  = 29,    //   user defined
+    SbxLPSTR    = 30,    // * null terminated string
+
+    SbxLPWSTR   = 31,    //   wide null terminated string
+    SbxCoreSTRING = 32,  //   from 1997-4-10 for GetCoreString(), only for converting<
+
+    SbxWSTRING  = 33,    //   from 2000-10-4 Reimplemented for backwards compatibility (#78919)
+    SbxWCHAR    = 34,    //   from 2000-10-4 Reimplemented for backwards compatibility (#78919)
+    SbxSALINT64 = 35,    //   for currency internal, signed 64-bit int   and UNO hyper
+    SbxSALUINT64= 36,    //   for currency internal, unsigned 64-bit int and UNO unsigned hyper
+    SbxDECIMAL  = 37,    //   for UNO/automation Decimal
+
+    SbxVECTOR = 0x1000,  // simple counted array
+    SbxARRAY  = 0x2000,  // array
+    SbxBYREF  = 0x4000,  // access by reference
+
+    SbxSV1 = 128,        // first defined data type for StarView
+    SbxMEMORYSTREAM,     // SvMemoryStream
+    SbxSTORAGE,          // SvStorage
+
+    SbxUSER1  = 256,     // first user defined data type
+    SbxUSERn  = 2047     // last user defined data type
 };
 
 const UINT32 SBX_TYPE_WITH_EVENTS_FLAG = 0x10000;
-const UINT32 SBX_FIXED_LEN_STRING_FLAG = 0x10000;	// same value as above as no conflict possible
-
+const UINT32 SBX_FIXED_LEN_STRING_FLAG = 0x10000;    // same value as above as no conflict possible
 #endif
 
 #ifndef _SBX_OPERATOR
 #define _SBX_OPERATOR
 
 enum SbxOperator {
-                        // Arithmetical:
-    SbxEXP, 			// this ^ var
-    SbxMUL, 			// this * var
-    SbxDIV, 			// this / var
-    SbxMOD, 			// this MOD var
-    SbxPLUS, 			// this + var
-    SbxMINUS, 			// this - var
-    SbxNEG,				// -this (var is ignored)
-    SbxIDIV,			// this / var (both operands max. INT32!)
-                        // Boolean operators (max INT32!):
-    SbxAND,				// this & var
-    SbxOR,				// this | var
-    SbxXOR,				// this ^ var
-    SbxEQV,				// ~this ^ var
-    SbxIMP,				// ~this | var
-    SbxNOT,				// ~this (var is ignored)
-                        // String-concat:
-    SbxCAT,				// this & var
-                        // Comparisons:
-    SbxEQ, 				// this = var
-    SbxNE, 				// this <> var
-    SbxLT, 				// this < var
-    SbxGT, 				// this > var
-    SbxLE, 				// this <= var
-    SbxGE				// this >= var
+    // Arithmetical:
+    SbxEXP,     // this ^ var
+    SbxMUL,     // this * var
+    SbxDIV,     // this / var
+    SbxMOD,     // this MOD var     (max INT32!)
+    SbxPLUS,    // this + var
+    SbxMINUS,   // this - var
+    SbxNEG,     // -this (var is ignored)
+    SbxIDIV,    // this / var       (max INT32!)
+
+    // Boolean operators (TODO deprecate this limit: max INT32!)
+    SbxAND,     // this & var
+    SbxOR,      // this | var
+    SbxXOR,     // this ^ var
+    SbxEQV,     // ~this ^ var
+    SbxIMP,     // ~this | var
+    SbxNOT,     // ~this (var is ignored)
+
+    // String concatenation:
+    SbxCAT,     // this & var (VBA: this + var)
+
+    // Comparisons:
+    SbxEQ,      // this = var
+    SbxNE,      // this <> var
+    SbxLT,      // this < var
+    SbxGT,      // this > var
+    SbxLE,      // this <= var
+    SbxGE       // this >= var
 };
 
 #endif
@@ -145,204 +154,179 @@ enum SbxOperator {
 #ifndef _SBX_NAME_TYPE
 #define _SBX_NAME_TYPE
 
-enum SbxNameType {				// Type of the questioned name of a variable
-    SbxNAME_NONE,				// plain name
-    SbxNAME_SHORT,				// Name(A,B)
-    SbxNAME_SHORT_TYPES,		// Name%(A%,B$)
-    SbxNAME_LONG_TYPES			// Name(A As Integer, B As String) As Integer
+enum SbxNameType {          // Type of the questioned name of a variable
+    SbxNAME_NONE,           // plain name
+    SbxNAME_SHORT,          // Name(A,B)
+    SbxNAME_SHORT_TYPES,    // Name%(A%,B$)
+    SbxNAME_LONG_TYPES      // Name(A As Integer, B As String) As Integer
 };
 
 #endif
 
 // from 1996/3/20: New error messages
-typedef ULONG SbxError;			// Preserve old type
+typedef ULONG SbxError;            // Preserve old type
 
 #endif
-// von #ifndef __RSC
 
 
 // New error codes per define
-#define ERRCODE_SBX_OK							ERRCODE_NONE					// processed
-#define ERRCODE_SBX_SYNTAX					    (1UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_COMPILER)			// Syntaxerror in parser (where else could syntax errors happen? ;-)
-#define ERRCODE_SBX_NOTIMP					    (2UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_NOTSUPPORTED)		// not possible
-#define ERRCODE_SBX_OVERFLOW					(3UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_SBX)				// overflow
-#define ERRCODE_SBX_BOUNDS					    (4UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_SBX)				// Invalid array index
-#define ERRCODE_SBX_ZERODIV					    (5UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_SBX)				// Division by zero
-#define ERRCODE_SBX_CONVERSION					(6UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_SBX)				// wrong data type
-#define ERRCODE_SBX_BAD_PARAMETER				(7UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// invalid Parameter
-#define ERRCODE_SBX_PROC_UNDEFINED			    (8UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// BASIC-Sub or Function undefined
-#define ERRCODE_SBX_ERROR					    (9UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_UNKNOWN)			// other object-related error
-#define ERRCODE_SBX_NO_OBJECT				    (10UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// Object variable unassigned
-#define ERRCODE_SBX_CANNOT_LOAD				    (11UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_CREATE)			// Object cannot be loaded or initialized
-#define ERRCODE_SBX_BAD_INDEX				    (12UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_SBX)				// Invalid object index
-#define ERRCODE_SBX_NO_ACTIVE_OBJECT		    (13UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_ACCESS)			// Object is not activated
-#define ERRCODE_SBX_BAD_PROP_VALUE			    (14UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// Bad property value
-#define ERRCODE_SBX_PROP_READONLY			    (15UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_READ)				// Property is read only
-#define ERRCODE_SBX_PROP_WRITEONLY			    (16UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_WRITE)			// Property is write only
-#define ERRCODE_SBX_INVALID_OBJECT			    (17UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_ACCESS)			// Invalid object reference
-#define ERRCODE_SBX_NO_METHOD				    (18UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// Property oder Methode unbekannt
-#define ERRCODE_SBX_INVALID_USAGE_OBJECT	    (19UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_ACCESS)			// Invalid object usage
-#define ERRCODE_SBX_NO_OLE					    (20UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_ACCESS)			// No OLE-Object
-#define ERRCODE_SBX_BAD_METHOD				    (21UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// Method not supported
-#define ERRCODE_SBX_OLE_ERROR				    (22UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// OLE Automation Error
-#define ERRCODE_SBX_BAD_ACTION				    (23UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_NOTSUPPORTED)		// Action not supported
-#define ERRCODE_SBX_NO_NAMED_ARGS			    (24UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// No named arguments
-#define ERRCODE_SBX_BAD_LOCALE				    (25UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_NOTSUPPORTED)		// Locale settings not supported
-#define ERRCODE_SBX_NAMED_NOT_FOUND			    (26UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// Unknown named argument
-#define ERRCODE_SBX_NOT_OPTIONAL			    (27UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// Argument not optional
-#define ERRCODE_SBX_WRONG_ARGS				    (28UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_SBX)				// Invalid number of arguments
-#define ERRCODE_SBX_NOT_A_COLL				    (29UL | ERRCODE_AREA_SBX | \
-                                                ERRCODE_CLASS_RUNTIME)			// Object contains no elements
-#define LAST_SBX_ERROR_ID						29UL
-
-
-// Less important for resources
+#define ERRCODE_SBX_OK            ERRCODE_NONE    // processed
+
+#define ERRCODE_SBX_SYNTAX              (1UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_COMPILER)
+#define ERRCODE_SBX_NOTIMP              (2UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_NOTSUPPORTED)
+#define ERRCODE_SBX_OVERFLOW            (3UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_SBX)        // overflow
+#define ERRCODE_SBX_BOUNDS              (4UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_SBX)        // Invalid array index
+#define ERRCODE_SBX_ZERODIV             (5UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_SBX)        // Division by zero
+#define ERRCODE_SBX_CONVERSION          (6UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_SBX)        // wrong data type
+#define ERRCODE_SBX_BAD_PARAMETER       (7UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)    // invalid Parameter
+#define ERRCODE_SBX_PROC_UNDEFINED      (8UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)    // Sub or Func not def
+#define ERRCODE_SBX_ERROR               (9UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_UNKNOWN)    // generic object error
+#define ERRCODE_SBX_NO_OBJECT           (10UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)   // Object var not object
+#define ERRCODE_SBX_CANNOT_LOAD         (11UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_CREATE)    // Object init/load fail
+#define ERRCODE_SBX_BAD_INDEX           (12UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_SBX)       // Invalid object index
+#define ERRCODE_SBX_NO_ACTIVE_OBJECT    (13UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_ACCESS)    // Object not active
+#define ERRCODE_SBX_BAD_PROP_VALUE      (14UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)   // Bad property value
+#define ERRCODE_SBX_PROP_READONLY       (15UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_READ)      // Property is read only
+#define ERRCODE_SBX_PROP_WRITEONLY      (16UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_WRITE)     // Property is write only
+#define ERRCODE_SBX_INVALID_OBJECT      (17UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_ACCESS)    // Invalid object reference
+#define ERRCODE_SBX_NO_METHOD           (18UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)   // Property oder Methode unbekannt
+#define ERRCODE_SBX_INVALID_USAGE_OBJECT (19UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_ACCESS)   // Invalid object usage
+#define ERRCODE_SBX_NO_OLE              (20UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_ACCESS)    // No OLE-Object
+#define ERRCODE_SBX_BAD_METHOD          (21UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)   // Method not supported
+#define ERRCODE_SBX_OLE_ERROR           (22UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)   // OLE Automation Error
+#define ERRCODE_SBX_BAD_ACTION          (23UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_NOTSUPPORTED)  // Action not supported
+#define ERRCODE_SBX_NO_NAMED_ARGS       (24UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)   // No named arguments
+#define ERRCODE_SBX_BAD_LOCALE          (25UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_NOTSUPPORTED)  // Locale not supported
+#define ERRCODE_SBX_NAMED_NOT_FOUND     (26UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)   // Unknown named argument
+#define ERRCODE_SBX_NOT_OPTIONAL        (27UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)   // Argument not optional
+#define ERRCODE_SBX_WRONG_ARGS          (28UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_SBX)       // Invalid number of arguments
+#define ERRCODE_SBX_NOT_A_COLL          (29UL | ERRCODE_AREA_SBX | ERRCODE_CLASS_RUNTIME)   // Object contains no elements
+#define LAST_SBX_ERROR_ID                        29UL
+
 #ifndef __RSC
 
 // Map old codes to new ones
-#define SbxERR_OK								ERRCODE_SBX_OK
-#define SbxERR_SYNTAX							ERRCODE_SBX_SYNTAX
-#define SbxERR_NOTIMP							ERRCODE_SBX_NOTIMP
-#define SbxERR_OVERFLOW							ERRCODE_SBX_OVERFLOW
-#define SbxERR_BOUNDS							ERRCODE_SBX_BOUNDS
-#define SbxERR_ZERODIV							ERRCODE_SBX_ZERODIV
-#define SbxERR_CONVERSION						ERRCODE_SBX_CONVERSION
-#define SbxERR_BAD_PARAMETER					ERRCODE_SBX_BAD_PARAMETER
-#define SbxERR_PROC_UNDEFINED					ERRCODE_SBX_PROC_UNDEFINED
-#define SbxERR_ERROR							ERRCODE_SBX_ERROR
-#define SbxERR_NO_OBJECT						ERRCODE_SBX_NO_OBJECT
-#define SbxERR_CANNOT_LOAD						ERRCODE_SBX_CANNOT_LOAD
-#define SbxERR_BAD_INDEX						ERRCODE_SBX_BAD_INDEX
-#define SbxERR_NO_ACTIVE_OBJECT					ERRCODE_SBX_NO_ACTIVE_OBJECT
-#define SbxERR_BAD_PROP_VALUE					ERRCODE_SBX_BAD_PROP_VALUE
-#define SbxERR_PROP_READONLY					ERRCODE_SBX_PROP_READONLY
-#define SbxERR_PROP_WRITEONLY					ERRCODE_SBX_PROP_WRITEONLY
-#define SbxERR_INVALID_OBJECT					ERRCODE_SBX_INVALID_OBJECT
-#define SbxERR_NO_METHOD						ERRCODE_SBX_NO_METHOD
-#define SbxERR_INVALID_USAGE_OBJECT				ERRCODE_SBX_INVALID_USAGE_OBJECT
-#define SbxERR_NO_OLE							ERRCODE_SBX_NO_OLE
-#define SbxERR_BAD_METHOD						ERRCODE_SBX_BAD_METHOD
-#define SbxERR_OLE_ERROR						ERRCODE_SBX_OLE_ERROR
-#define SbxERR_BAD_ACTION						ERRCODE_SBX_BAD_ACTION
-#define SbxERR_NO_NAMED_ARGS					ERRCODE_SBX_NO_NAMED_ARGS
-#define SbxERR_BAD_LOCALE						ERRCODE_SBX_BAD_LOCALE
-#define SbxERR_NAMED_NOT_FOUND					ERRCODE_SBX_NAMED_NOT_FOUND
-#define SbxERR_NOT_OPTIONAL						ERRCODE_SBX_NOT_OPTIONAL
-#define SbxERR_WRONG_ARGS						ERRCODE_SBX_WRONG_ARGS
-#define SbxERR_NOT_A_COLL						ERRCODE_SBX_NOT_A_COLL
+#define SbxERR_OK                       ERRCODE_SBX_OK
+#define SbxERR_SYNTAX                   ERRCODE_SBX_SYNTAX
+#define SbxERR_NOTIMP                   ERRCODE_SBX_NOTIMP
+#define SbxERR_OVERFLOW                 ERRCODE_SBX_OVERFLOW
+#define SbxERR_BOUNDS                   ERRCODE_SBX_BOUNDS
+#define SbxERR_ZERODIV                  ERRCODE_SBX_ZERODIV
+#define SbxERR_CONVERSION               ERRCODE_SBX_CONVERSION
+#define SbxERR_BAD_PARAMETER            ERRCODE_SBX_BAD_PARAMETER
+#define SbxERR_PROC_UNDEFINED           ERRCODE_SBX_PROC_UNDEFINED
+#define SbxERR_ERROR                    ERRCODE_SBX_ERROR
+#define SbxERR_NO_OBJECT                ERRCODE_SBX_NO_OBJECT
+#define SbxERR_CANNOT_LOAD              ERRCODE_SBX_CANNOT_LOAD
+#define SbxERR_BAD_INDEX                ERRCODE_SBX_BAD_INDEX
+#define SbxERR_NO_ACTIVE_OBJECT         ERRCODE_SBX_NO_ACTIVE_OBJECT
+#define SbxERR_BAD_PROP_VALUE           ERRCODE_SBX_BAD_PROP_VALUE
+#define SbxERR_PROP_READONLY            ERRCODE_SBX_PROP_READONLY
+#define SbxERR_PROP_WRITEONLY           ERRCODE_SBX_PROP_WRITEONLY
+#define SbxERR_INVALID_OBJECT           ERRCODE_SBX_INVALID_OBJECT
+#define SbxERR_NO_METHOD                ERRCODE_SBX_NO_METHOD
+#define SbxERR_INVALID_USAGE_OBJECT     ERRCODE_SBX_INVALID_USAGE_OBJECT
+#define SbxERR_NO_OLE                   ERRCODE_SBX_NO_OLE
+#define SbxERR_BAD_METHOD               ERRCODE_SBX_BAD_METHOD
+#define SbxERR_OLE_ERROR                ERRCODE_SBX_OLE_ERROR
+#define SbxERR_BAD_ACTION               ERRCODE_SBX_BAD_ACTION
+#define SbxERR_NO_NAMED_ARGS            ERRCODE_SBX_NO_NAMED_ARGS
+#define SbxERR_BAD_LOCALE               ERRCODE_SBX_BAD_LOCALE
+#define SbxERR_NAMED_NOT_FOUND          ERRCODE_SBX_NAMED_NOT_FOUND
+#define SbxERR_NOT_OPTIONAL             ERRCODE_SBX_NOT_OPTIONAL
+#define SbxERR_WRONG_ARGS               ERRCODE_SBX_WRONG_ARGS
+#define SbxERR_NOT_A_COLL               ERRCODE_SBX_NOT_A_COLL
 
 
 // Flag-Bits:
-#define SBX_READ      0x0001    // Read permission
-#define SBX_WRITE     0x0002    // Write permission
-#define SBX_READWRITE 0x0003    // Read/Write permission
-#define	SBX_DONTSTORE 0x0004	// Don't store object
-#define	SBX_MODIFIED  0x0008	// Object was changed
-#define SBX_FIXED     0x0010    // Fixed data type (SbxVariable)
-#define SBX_CONST	  0x0020	// Definition of const value
-#define	SBX_OPTIONAL  0x0040	// Parameter is optional
-#define SBX_HIDDEN	  0x0080	// Element is invisible
-#define	SBX_INVISIBLE 0x0100	// Element is not found by Find()
-#define	SBX_EXTSEARCH 0x0200	// Object is searched completely
-#define	SBX_EXTFOUND  0x0400	// Variable was found through extended search
-#define	SBX_GBLSEARCH 0x0800	// Global search via Parents
-#define	SBX_RESERVED  0x1000	// reserved
-#define	SBX_PRIVATE   0x1000	// #110004, #112015, cannot conflict with SBX_RESERVED
-#define	SBX_NO_BROADCAST 0x2000	// No broadcast on Get/Put
-#define	SBX_REFERENCE 0x4000	// Parameter is Reference (DLL-call)
-#define	SBX_NO_MODIFY 0x8000	// SetModified is suppressed
-#define SBX_WITH_EVENTS 0x0080	// Same value as unused SBX_HIDDEN
+#define SBX_READ        0x0001  // Read permission
+#define SBX_WRITE       0x0002  // Write permission
+#define SBX_READWRITE   0x0003  // Read/Write permission
+#define SBX_DONTSTORE   0x0004  // Don't store object
+#define SBX_MODIFIED    0x0008  // Object was changed
+#define SBX_FIXED       0x0010  // Fixed data type (SbxVariable)
+#define SBX_CONST       0x0020  // Definition of const value
+#define SBX_OPTIONAL    0x0040  // Parameter is optional
+#define SBX_HIDDEN      0x0080  // Element is invisible
+#define SBX_INVISIBLE 0x0100    // Element is not found by Find()
+#define SBX_EXTSEARCH 0x0200    // Object is searched completely
+#define SBX_EXTFOUND  0x0400    // Variable was found through extended search
+#define SBX_GBLSEARCH 0x0800    // Global search via Parents
+#define SBX_RESERVED  0x1000    // reserved
+#define SBX_PRIVATE   0x1000    // #110004, #112015, cannot conflict with SBX_RESERVED
+#define SBX_NO_BROADCAST 0x2000 // No broadcast on Get/Put
+#define SBX_REFERENCE 0x4000    // Parameter is Reference (DLL-call)
+#define SBX_NO_MODIFY 0x8000    // SetModified is suppressed
+#define SBX_WITH_EVENTS 0x0080  // Same value as unused SBX_HIDDEN
 
 // Broadcaster-IDs:
-#define SBX_HINT_DYING			SFX_HINT_DYING
-#define	SBX_HINT_DATAWANTED		SFX_HINT_USER00
-#define SBX_HINT_DATACHANGED	SFX_HINT_DATACHANGED
-#define	SBX_HINT_CONVERTED		SFX_HINT_USER01
-#define SBX_HINT_INFOWANTED		SFX_HINT_USER02
-#define SBX_HINT_OBJECTCHANGED	SFX_HINT_USER03
+#define SBX_HINT_DYING          SFX_HINT_DYING
+#define SBX_HINT_DATAWANTED     SFX_HINT_USER00
+#define SBX_HINT_DATACHANGED    SFX_HINT_DATACHANGED
+#define SBX_HINT_CONVERTED      SFX_HINT_USER01
+#define SBX_HINT_INFOWANTED     SFX_HINT_USER02
+#define SBX_HINT_OBJECTCHANGED  SFX_HINT_USER03
 
 // List of all creators for Load/Store
 
-#define SBXCR_SBX			0x20584253		// SBX(blank)
+#define SBXCR_SBX            0x20584253        // SBX(blank)
 
 // List of predefined SBX-IDs. New SBX-IDs must be precisly defined so that
 // they are unique within the Stream and appropriate Factory.
 
-#define	SBXID_VALUE 		0x4E4E	// NN: SbxValue
-#define	SBXID_VARIABLE 		0x4156	// VA: SbxVariable
-#define	SBXID_ARRAY			0x5241	// AR: SbxArray
-#define	SBXID_DIMARRAY		0x4944	// DI: SbxDimArray
-#define	SBXID_OBJECT		0x424F	// OB: SbxObject
-#define	SBXID_COLLECTION	0x4F43	// CO: SbxCollection
-#define	SBXID_FIXCOLLECTION	0x4346	// FC: SbxStdCollection
-#define	SBXID_METHOD		0x454D	// ME: SbxMethod
-#define	SBXID_PROPERTY		0x5250	// PR: SbxProperty
+#define SBXID_VALUE         0x4E4E  // NN: SbxValue
+#define SBXID_VARIABLE      0x4156  // VA: SbxVariable
+#define SBXID_ARRAY         0x5241  // AR: SbxArray
+#define SBXID_DIMARRAY      0x4944  // DI: SbxDimArray
+#define SBXID_OBJECT        0x424F  // OB: SbxObject
+#define SBXID_COLLECTION    0x4F43  // CO: SbxCollection
+#define SBXID_FIXCOLLECTION 0x4346  // FC: SbxStdCollection
+#define SBXID_METHOD        0x454D  // ME: SbxMethod
+#define SBXID_PROPERTY      0x5250  // PR: SbxProperty
 
 // StarBASIC restricts the base data type to different intervals.
-// These intervals are fixed due to portability and independent
+// These intervals are fixed to create 'portability and independent
 // of the implementation. Only type double is greedy and takes
 // what it gets.
 
-#define	SbxMAXCHAR			((sal_Unicode)65535)
-#define	SbxMINCHAR			(0)
-#define	SbxMAXBYTE			( 255)
-#define SbxMAXINT			( 32767)
-#define SbxMININT			(-32768)
-#define	SbxMAXUINT			((UINT16) 65535)
-#define SbxMAXLNG			( 2147483647)
-#define SbxMINLNG			((INT32)(-2147483647-1))
-#define SbxMAXULNG			((UINT32) 0xffffffff)
-
-#define SbxMAXSALINT64   	SAL_MAX_INT64
-#define SbxMINSALINT64		SAL_MIN_INT64
-#define SbxMAXSALUINT64   	SAL_MAX_UINT64
-
-#define SbxMAXSNG			( 3.402823e+38)
-#define SbxMINSNG			(-3.402823e+38)
-#define SbxMAXSNG2			( 1.175494351e-38)
-#define SbxMINSNG2			(-1.175494351e-38)
-#define SbxMAXCURR			( 922337203685477.5807)
-#define SbxMINCURR			(-922337203685477.5808)
-#define CURRENCY_FACTOR		10000
-#define SbxMAXCURRLNG		(SbxMAXLNG/CURRENCY_FACTOR)
-#define SbxMINCURRLNG		(SbxMINLNG/CURRENCY_FACTOR)
+#define SbxMAXCHAR  ((sal_Unicode)65535)
+#define SbxMINCHAR  (0)
+#define SbxMAXBYTE  ( 255)
+#define SbxMAXINT   ( 32767)
+#define SbxMININT   (-32768)
+#define SbxMAXUINT  ((UINT16) 65535)
+#define SbxMAXLNG   ( 2147483647)
+#define SbxMINLNG   ((INT32)(-2147483647-1))
+#define SbxMAXULNG  ((UINT32) 0xffffffff)
+
+#define SbxMAXSALUINT64     SAL_MAX_UINT64
+#define SbxMAXSALINT64      SAL_MAX_INT64
+#define SbxMINSALINT64      SAL_MIN_INT64
+
+        // Currency stored as SbxSALINT64 == sal_Int64
+        // value range limits are ~(2^63 - 1)/10000
+        // fixed precision has 4 digits right of decimal pt
+#define CURRENCY_FACTOR         (10000)
+#define CURRENCY_FACTOR_SQUARE  (100000000)
+
+// TODO effective MAX/MINCURR limits:
+// true value ( 922337203685477.5807) is too precise for correct comparison to 64bit double
+#define SbxMAXCURR      ( 922337203685477.5807)
+#define SbxMINCURR      (-922337203685477.5808)
+
+#define SbxMAXSNG       ( 3.402823e+38)
+#define SbxMINSNG       (-3.402823e+38)
+#define SbxMAXSNG2      ( 1.175494351e-38)
+#define SbxMINSNG2      (-1.175494351e-38)
 
 // Max valid offset index of a Sbx-Array (due to 64K limit)
-#define	SBX_MAXINDEX		0x3FF0
-#define	SBX_MAXINDEX32		SbxMAXLNG
+#define SBX_MAXINDEX    0x3FF0
+#define SBX_MAXINDEX32  SbxMAXLNG
+
 
-// The numeric values of TRUE and FALSE
 enum SbxBOOL { SbxFALSE = 0, SbxTRUE = -1 };
 
-#endif // __RSC
+#endif //ifndef __RSC
 
 #endif
 
diff --git a/basic/inc/basic/sbxvar.hxx b/basic/inc/basic/sbxvar.hxx
index 6e6aee8..787a7df 100644
--- a/basic/inc/basic/sbxvar.hxx
+++ b/basic/inc/basic/sbxvar.hxx
@@ -34,169 +34,47 @@
 #include <com/sun/star/bridge/oleautomation/Decimal.hpp>
 #include <basic/sbxcore.hxx>
 
-#ifndef __SBX_64
-#define __SBX_64
-
-struct SbxINT64
-{
-    INT32 nHigh; UINT32 nLow;
-
-#if FALSE
-    SbxINT64()           : nHigh( 0 ), nLow( 0 ) {}
-    SbxINT64( UINT8  n ) : nHigh( 0 ), nLow( n ) {}
-    SbxINT64( UINT16 n ) : nHigh( 0 ), nLow( n ) {}
-    SbxINT64( UINT32 n ) : nHigh( 0 ), nLow( n ) {}
-    SbxINT64( unsigned int n ) : nHigh( 0 ), nLow( n ) {}
-    SbxINT64( INT8   n ) : nHigh( n < 0 ? -1 : 0 ), nLow( n ) {}
-    SbxINT64( INT16  n ) : nHigh( n < 0 ? -1 : 0 ), nLow( n ) {}
-    SbxINT64( INT32  n ) : nHigh( n < 0 ? -1 : 0 ), nLow( n ) {}
-    SbxINT64( int    n ) : nHigh( n < 0 ? -1 : 0 ), nLow( n ) {}
-    SbxINT64( SbxINT64 &r ) : nHigh( r.nHigh ), nLow( r.nLow ) {}
-
-    SbxINT64( BigInt &r );
-    SbxINT64( double n );
-#endif
-    void CHS()
-    {
-        nLow  ^= (UINT32)-1;
-        nHigh ^= -1;
-        nLow++;
-        if( !nLow )
-            nHigh++;
-    }
-
-    // blc/os2i do not like operator =
-    void Set(double n)
-    {
-        if( n >= 0 )
-        {
-            nHigh = (INT32)(n / (double)4294967296.0);
-            nLow  = (UINT32)(n - ((double)nHigh * (double)4294967296.0) + 0.5);
-        }
-        else {
-            nHigh = (INT32)(-n / (double)4294967296.0);
-            nLow  = (UINT32)(-n - ((double)nHigh * (double)4294967296.0) + 0.5);
-            CHS();
-        }
-    }
-    void Set(INT32 n) { nHigh = n < 0 ? -1 : 0; nLow = n; }
-
-    void SetMax()  { nHigh = 0x7FFFFFFF; nLow = 0xFFFFFFFF; }
-    void SetMin()  { nHigh = 0x80000000; nLow = 0x00000000; }
-    void SetNull() { nHigh = 0x00000000; nLow = 0x00000000; }
-
-    int operator ! () const { return !nHigh && !nLow; }
-
-    SbxINT64 &operator -= ( const SbxINT64 &r );
-    SbxINT64 &operator += ( const SbxINT64 &r );
-    SbxINT64 &operator /= ( const SbxINT64 &r );
-    SbxINT64 &operator %= ( const SbxINT64 &r );
-    SbxINT64 &operator *= ( const SbxINT64 &r );
-    SbxINT64 &operator &= ( const SbxINT64 &r );
-    SbxINT64 &operator |= ( const SbxINT64 &r );
-    SbxINT64 &operator ^= ( const SbxINT64 &r );
-
-    friend SbxINT64 operator - ( const SbxINT64 &l, const SbxINT64 &r );
-    friend SbxINT64 operator + ( const SbxINT64 &l, const SbxINT64 &r );
-    friend SbxINT64 operator / ( const SbxINT64 &l, const SbxINT64 &r );
-    friend SbxINT64 operator % ( const SbxINT64 &l, const SbxINT64 &r );
-    friend SbxINT64 operator * ( const SbxINT64 &l, const SbxINT64 &r );
-    friend SbxINT64 operator & ( const SbxINT64 &l, const SbxINT64 &r );
-    friend SbxINT64 operator | ( const SbxINT64 &l, const SbxINT64 &r );
-    friend SbxINT64 operator ^ ( const SbxINT64 &l, const SbxINT64 &r );
-
-    friend SbxINT64 operator - ( const SbxINT64 &r );
-    friend SbxINT64 operator ~ ( const SbxINT64 &r );
-
-    static double GetMin() { return ((double)0x7FFFFFFF*(double)4294967296.0
-                                     + (double)0xFFFFFFFF)
-                                    / CURRENCY_FACTOR; }
-    static double GetMax() { return ((double)0x80000000*(double)4294967296.0
-                                     + (double)0xFFFFFFFF)
-                                    / CURRENCY_FACTOR; }
-};
-
-struct SbxUINT64
-{
-    UINT32 nHigh; UINT32 nLow;
-    void Set(double n)
-    {
-        nHigh = (UINT32)(n / (double)4294967296.0);
-        nLow  = (UINT32)(n - ((double)nHigh * (double)4294967296.0));
-    }
-
-    void Set(UINT32 n) { nHigh = 0; nLow = n; }
-
-    void SetMax()  { nHigh = 0xFFFFFFFF; nLow = 0xFFFFFFFF; }
-    void SetMin()  { nHigh = 0x00000000; nLow = 0x00000000; }
-    void SetNull() { nHigh = 0x00000000; nLow = 0x00000000; }
-
-    int operator ! () const { return !nHigh && !nLow; }
-
-    SbxUINT64 &operator -= ( const SbxUINT64 &r );
-    SbxUINT64 &operator += ( const SbxUINT64 &r );
-    SbxUINT64 &operator /= ( const SbxUINT64 &r );
-    SbxUINT64 &operator %= ( const SbxUINT64 &r );
-    SbxUINT64 &operator *= ( const SbxUINT64 &r );
-    SbxUINT64 &operator &= ( const SbxUINT64 &r );
-    SbxUINT64 &operator |= ( const SbxUINT64 &r );
-    SbxUINT64 &operator ^= ( const SbxUINT64 &r );
-
-    friend SbxUINT64 operator - ( const SbxUINT64 &l, const SbxUINT64 &r );
-    friend SbxUINT64 operator + ( const SbxUINT64 &l, const SbxUINT64 &r );
-    friend SbxUINT64 operator / ( const SbxUINT64 &l, const SbxUINT64 &r );
-    friend SbxUINT64 operator % ( const SbxUINT64 &l, const SbxUINT64 &r );
-    friend SbxUINT64 operator * ( const SbxUINT64 &l, const SbxUINT64 &r );
-    friend SbxUINT64 operator & ( const SbxUINT64 &l, const SbxUINT64 &r );
-    friend SbxUINT64 operator | ( const SbxUINT64 &l, const SbxUINT64 &r );
-    friend SbxUINT64 operator ^ ( const SbxUINT64 &l, const SbxUINT64 &r );
-
-    friend SbxUINT64 operator ~ ( const SbxUINT64 &r );
-};
-
-#endif
-
 #ifndef __SBX_SBXVALUES_HXX
 #define __SBX_SBXVALUES_HXX
 
-class BigInt;
 class SbxDecimal;
 
 struct SbxValues
 {
     union {
-        sal_Unicode		nChar;
         BYTE			nByte;
-        INT16			nInteger;
-        INT32           nLong;
         UINT16          nUShort;
+        sal_Unicode		nChar;
+        INT16			nInteger;
         UINT32          nULong;
+        INT32           nLong;
+        unsigned int    nUInt;
+        int             nInt;
+        sal_uInt64      uInt64;
+        sal_Int64       nInt64;
+
         float           nSingle;
         double          nDouble;
-        SbxINT64        nLong64;
-        SbxUINT64       nULong64;
-        sal_Int64       nInt64;
-        sal_uInt64      uInt64;
-        int             nInt;
-        unsigned int    nUInt;
-        ::rtl::OUString* pOUString;
+
+        rtl::OUString*  pOUString;
         SbxDecimal*		pDecimal;
 
         SbxBase*        pObj;
-        sal_Unicode*    pChar;
+
         BYTE*	        pByte;
-        INT16*	        pInteger;
-        INT32*	        pLong;
         UINT16*	        pUShort;
+        sal_Unicode*    pChar;
+        INT16*	        pInteger;
         UINT32*	        pULong;
+        INT32*	        pLong;
+        unsigned int*   pUInt;
+        int*	        pInt;
+        sal_uInt64*     puInt64;
+        sal_Int64*      pnInt64;
+
         float*	        pSingle;
         double*	        pDouble;
-        SbxINT64*       pLong64;
-        SbxUINT64*      pULong64;
-        sal_Int64*      pnInt64;
-        sal_uInt64*     puInt64;
-        int*	        pInt;
-        unsigned int*   pUInt;
+
         void*	        pData;
     };
     SbxDataType	 eType;
@@ -209,15 +87,15 @@ struct SbxValues
     SbxValues( long _nLong ): nLong( _nLong ), eType(SbxLONG) {}
     SbxValues( USHORT _nUShort ): nUShort( _nUShort ), eType(SbxUSHORT) {}
     SbxValues( ULONG _nULong ): nULong( _nULong ), eType(SbxULONG) {}
-    SbxValues( float _nSingle ): nSingle( _nSingle ), eType(SbxSINGLE) {}
-    SbxValues( double _nDouble ): nDouble( _nDouble ), eType(SbxDOUBLE) {}
     SbxValues( int _nInt ): nInt( _nInt ), eType(SbxINT) {}
     SbxValues( unsigned int _nUInt ): nUInt( _nUInt ), eType(SbxUINT) {}
+    SbxValues( float _nSingle ): nSingle( _nSingle ), eType(SbxSINGLE) {}
+    SbxValues( double _nDouble ): nDouble( _nDouble ), eType(SbxDOUBLE) {}
     SbxValues( const ::rtl::OUString* _pString ): pOUString( (::rtl::OUString*)_pString ), eType(SbxSTRING) {}
     SbxValues( SbxBase* _pObj ): pObj( _pObj ), eType(SbxOBJECT) {}
     SbxValues( sal_Unicode* _pChar ): pChar( _pChar ), eType(SbxLPSTR) {}
     SbxValues( void* _pData ): pData( _pData ), eType(SbxPOINTER) {}
-    SbxValues( const BigInt &rBig );
+
 };
 
 #endif
@@ -255,28 +133,28 @@ public:
     virtual void Clear();
     virtual BOOL IsFixed() const;
 
-    BOOL IsInteger() const { return BOOL( GetType() == SbxINTEGER  ); }
-    BOOL IsLong()    const { return BOOL( GetType() == SbxLONG     ); }
-    BOOL IsSingle()  const { return BOOL( GetType() == SbxSINGLE   ); }
-    BOOL IsDouble()  const { return BOOL( GetType() == SbxDOUBLE   ); }
-    BOOL IsString()  const { return BOOL( GetType() == SbxSTRING   ); }
-    BOOL IsDate()    const { return BOOL( GetType() == SbxDATE     ); }
-    BOOL IsCurrency()const { return BOOL( GetType() == SbxCURRENCY ); }
-    BOOL IsObject()  const { return BOOL( GetType() == SbxOBJECT   ); }
-    BOOL IsDataObject()const{return BOOL( GetType() == SbxDATAOBJECT);}
-    BOOL IsBool()    const { return BOOL( GetType() == SbxBOOL     ); }
-    BOOL IsErr()     const { return BOOL( GetType() == SbxERROR    ); }
-    BOOL IsEmpty()   const { return BOOL( GetType() == SbxEMPTY    ); }
-    BOOL IsNull()    const { return BOOL( GetType() == SbxNULL     ); }
-    BOOL IsChar()    const { return BOOL( GetType() == SbxCHAR     ); }
-    BOOL IsByte()    const { return BOOL( GetType() == SbxBYTE     ); }
-    BOOL IsUShort()  const { return BOOL( GetType() == SbxUSHORT   ); }
-    BOOL IsULong()   const { return BOOL( GetType() == SbxULONG    ); }
-    BOOL IsInt()     const { return BOOL( GetType() == SbxINT      ); }
-    BOOL IsUInt()    const { return BOOL( GetType() == SbxUINT     ); }
-    BOOL IspChar()   const { return BOOL( GetType() == SbxLPSTR    ); }
-    BOOL IsNumeric() const;
-    BOOL IsNumericRTL() const;	// #41692 Interface for Basic
+    BOOL IsInteger()    const { return BOOL( GetType() == SbxINTEGER  ); }
+    BOOL IsLong()       const { return BOOL( GetType() == SbxLONG     ); }
+    BOOL IsSingle()     const { return BOOL( GetType() == SbxSINGLE   ); }
+    BOOL IsDouble()     const { return BOOL( GetType() == SbxDOUBLE   ); }
+    BOOL IsString()     const { return BOOL( GetType() == SbxSTRING   ); }
+    BOOL IsDate()       const { return BOOL( GetType() == SbxDATE     ); }
+    BOOL IsCurrency()   const { return BOOL( GetType() == SbxCURRENCY ); }
+    BOOL IsObject()     const { return BOOL( GetType() == SbxOBJECT   ); }
+    BOOL IsDataObject() const { return BOOL( GetType() == SbxDATAOBJECT);}
+    BOOL IsBool()       const { return BOOL( GetType() == SbxBOOL     ); }
+    BOOL IsErr()        const { return BOOL( GetType() == SbxERROR    ); }
+    BOOL IsEmpty()      const { return BOOL( GetType() == SbxEMPTY    ); }
+    BOOL IsNull()       const { return BOOL( GetType() == SbxNULL     ); }
+    BOOL IsChar()       const { return BOOL( GetType() == SbxCHAR     ); }
+    BOOL IsByte()       const { return BOOL( GetType() == SbxBYTE     ); }
+    BOOL IsUShort()     const { return BOOL( GetType() == SbxUSHORT   ); }
+    BOOL IsULong()      const { return BOOL( GetType() == SbxULONG    ); }
+    BOOL IsInt()        const { return BOOL( GetType() == SbxINT      ); }
+    BOOL IsUInt()       const { return BOOL( GetType() == SbxUINT     ); }
+    BOOL IspChar()      const { return BOOL( GetType() == SbxLPSTR    ); }
+    BOOL IsNumeric()    const;
+    BOOL IsNumericRTL() const;	        // #41692 Interface for Basic
     BOOL ImpIsNumeric( BOOL bOnlyIntntl ) const;	// Implementation
 
     virtual SbxClassType GetClass() const;
@@ -291,61 +169,70 @@ public:
 
     inline SbxValues * data() { return &aData; }
 
-    SbxINT64 GetCurrency() const;
-    SbxINT64 GetLong64() const;
-    SbxUINT64 GetULong64() const;
-    sal_Int64  GetInt64() const;
-    sal_uInt64 GetUInt64() const;
-    INT16  GetInteger() const;
-    INT32  GetLong() const;
-    float  GetSingle() const;
-    double GetDouble() const;
-    double GetDate() const;
-    BOOL   GetBool() const;
-    UINT16 GetErr() const;
-    const  String& GetString() const;
-    const  String& GetCoreString() const;
-    ::rtl::OUString GetOUString() const;
-    SbxDecimal* GetDecimal() const;
-    SbxBase* GetObject() const;
-    BOOL	 HasObject() const;
-    void*  GetData() const;
+    UINT16      GetErr() const;
+
+    BOOL        GetBool() const;
+    BYTE        GetByte() const;
     sal_Unicode GetChar() const;
-    BYTE   GetByte() const;
-    UINT16 GetUShort() const;
-    UINT32 GetULong() const;
-    int	   GetInt() const;
-
-    BOOL PutCurrency( const SbxINT64& );
-    BOOL PutLong64( const SbxINT64& );
-    BOOL PutULong64( const SbxUINT64& );
-    BOOL PutInt64( sal_Int64 );
-    BOOL PutUInt64( sal_uInt64 );
+    UINT16      GetUShort() const;
+    UINT32      GetULong() const;
+    int         GetInt() const;
+    INT16       GetInteger() const;
+    INT32       GetLong() const;
+    sal_Int64   GetInt64() const;
+    sal_uInt64  GetUInt64() const;
+
+    sal_Int64   GetCurrency() const;
+    SbxDecimal* GetDecimal() const;
+
+    float       GetSingle() const;
+    double      GetDouble() const;
+    double      GetDate() const;
+
+    const String&   GetString() const;
+    const String&   GetCoreString() const;
+    rtl::OUString   GetOUString() const;
+
+    SbxBase*    GetObject() const;
+    BOOL	    HasObject() const;
+    void*       GetData() const;
+
+
+    BOOL PutEmpty();
+    BOOL PutNull();
+    BOOL PutErr( USHORT );
+
+    BOOL PutBool( BOOL );
+    BOOL PutByte( BYTE );
+    BOOL PutChar( sal_Unicode );
+    BOOL PutUShort( UINT16 );
+    BOOL PutULong( UINT32 );
+    BOOL PutInt( int );
     BOOL PutInteger( INT16 );
     BOOL PutLong( INT32 );
+    BOOL PutInt64( sal_Int64 );
+    BOOL PutUInt64( sal_uInt64 );
+
     BOOL PutSingle( float );
     BOOL PutDouble( double );
     BOOL PutDate( double );
-    BOOL PutBool( BOOL );
-    BOOL PutErr( USHORT );
-    BOOL PutStringExt( const ::rtl::OUString& );     // with extended analysis (International, "TRUE"/"FALSE")
+
+            // with extended analysis (International, "TRUE"/"FALSE")
+    BOOL PutStringExt( const ::rtl::OUString& );
     BOOL PutString( const ::rtl::OUString& );
     BOOL PutString( const sal_Unicode* );   // Type = SbxSTRING
     BOOL PutpChar( const sal_Unicode* );    // Type = SbxLPSTR
-    BOOL PutDecimal( SbxDecimal* pDecimal );
-    BOOL PutObject( SbxBase* );
-    BOOL PutData( void* );
-    BOOL PutChar( sal_Unicode );
-    BOOL PutByte( BYTE );
-    BOOL PutUShort( UINT16 );
-    BOOL PutULong( UINT32 );
-    BOOL PutInt( int );
-    BOOL PutEmpty();
-    BOOL PutNull();
 
-    // Special decimal methods
+            // Special methods
     BOOL PutDecimal( com::sun::star::bridge::oleautomation::Decimal& rAutomationDec );
     BOOL fillAutomationDecimal( com::sun::star::bridge::oleautomation::Decimal& rAutomationDec );
+    BOOL PutDecimal( SbxDecimal* pDecimal );
+    BOOL PutCurrency( const sal_Int64& );
+            // Interface for CDbl in Basic
+    static SbxError ScanNumIntnl( const String& rSrc, double& nVal, BOOL bSingle=FALSE );
+
+    BOOL PutObject( SbxBase* );
+    BOOL PutData( void* );
 
     virtual BOOL Convert( SbxDataType );
     virtual BOOL Compute( SbxOperator, const SbxValue& );
@@ -353,12 +240,9 @@ public:
     BOOL Scan( const String&, USHORT* = NULL );
     void Format( String&, const String* = NULL ) const;
 
-    // Interface for CDbl in Basic
-    static SbxError ScanNumIntnl( const String& rSrc, double& nVal, BOOL bSingle=FALSE );
-
     // The following operators are definied for easier handling.
-    // Error conditions (overflow, conversions) are not
-    // taken into consideration.
+    // TODO: Ensure error conditions (overflow, conversions)
+    // are taken into consideration in Compute and Compare
 
     inline int operator ==( const SbxValue& ) const;
     inline int operator !=( const SbxValue& ) const;
@@ -446,7 +330,7 @@ class SbxVariable : public SbxValue
     friend class SbMethod;
 
     SbxVariableImpl* mpSbxVariableImpl;	// Impl data
-    SfxBroadcaster*  pCst;		// Broadcaster, if needed
+    SfxBroadcaster*  pCst;		        // Broadcaster, if needed
     String           maName;            // Name, if available
     SbxArrayRef      mpPar;             // Parameter-Array, if set
     USHORT           nHash;             // Hash-ID for search
diff --git a/basic/source/classes/sbunoobj.cxx b/basic/source/classes/sbunoobj.cxx
index 3a2a0da..bab1cd6 100644
--- a/basic/source/classes/sbunoobj.cxx
+++ b/basic/source/classes/sbunoobj.cxx
@@ -781,13 +781,7 @@ void unoToSbxValue( SbxVariable* pVar, const Any& aValue )
                                 oleautomation::Currency aCurrency;
                                 if( (aValue >>= aCurrency) )
                                 {
-                                    sal_Int64 nValue64 = aCurrency.Value;
-                                    SbxINT64 aInt64;
-                                    aInt64.nHigh =
-                                        sal::static_int_cast< INT32 >(
-                                            nValue64 >> 32);
-                                    aInt64.nLow = (UINT32)( nValue64 & 0xffffffff );
-                                    pVar->PutCurrency( aInt64 );
+                                    pVar->PutCurrency( aCurrency.Value );
                                     break;
                                 }
                             }
@@ -960,8 +954,6 @@ Type getUnoTypeForSbxBaseType( SbxDataType eType )
         case SbxBYTE:       aRetType = ::getCppuType( (sal_Int8*)0 ); break;
         case SbxUSHORT:     aRetType = ::getCppuType( (sal_uInt16*)0 ); break;
         case SbxULONG:      aRetType = ::getCppuType( (sal_uInt32*)0 ); break;
-        //case SbxLONG64:   break;
-        //case SbxULONG64:  break;
         // map machine-dependent ones on hyper for secureness
         case SbxINT:        aRetType = ::getCppuType( (sal_Int32*)0 ); break;
         case SbxUINT:       aRetType = ::getCppuType( (sal_uInt32*)0 ); break;
@@ -1103,7 +1095,7 @@ Type getUnoTypeForSbxValue( SbxValue* pVal )
         }
         // Otherwise it is a No-Uno-Basic-Object -> default==deliver void
     }
-    // No objekt, convert basic type
+    // No object, convert basic type
     else
     {
         aRetType = getUnoTypeForSbxBaseType( eBaseType );
@@ -1157,6 +1149,10 @@ Any sbxToUnoValueImpl( SbxVariable* pVar, bool bBlockConversionToSmallestType =
                         aType = ::getCppuType( (sal_Int16*)0 );
                     else if( d >= -SbxMAXLNG && d <= SbxMAXLNG )
                         aType = ::getCppuType( (sal_Int32*)0 );
+#if MAYBEFUTURE
+                    else
+                        aType = ::getCppuType( (sal_Int64*)0 );
+#endif
                 }
                 break;
             }
@@ -1192,6 +1188,7 @@ Any sbxToUnoValueImpl( SbxVariable* pVar, bool bBlockConversionToSmallestType =
                     aType = ::getCppuType( (sal_uInt16*)0 );
                 break;
             }
+            // TODO: need to add hyper types ?
             default: break;
         }
     }
@@ -1324,13 +1321,8 @@ Any sbxToUnoValue( SbxVariable* pVar, const Type& rType, Property* pUnoProperty
                         }
                         else if( rType == ::getCppuType( (oleautomation::Currency*)0 ) )
                         {
-                            SbxINT64 aInt64 = pVar->GetCurrency();
-                            oleautomation::Currency aCurrency;
-                            sal_Int64& rnValue64 = aCurrency.Value;
-                            rnValue64 = aInt64.nHigh;
-                            rnValue64 <<= 32;
-                            rnValue64 |= aInt64.nLow;
-                            aRetVal <<= aCurrency;
+                            // assumes per previous code that ole Currency is Int64
+                            aRetVal <<= (sal_Int64)( pVar->GetInt64() );
                             break;
                         }
                         else if( rType == ::getCppuType( (oleautomation::Date*)0 ) )
@@ -1363,11 +1355,9 @@ Any sbxToUnoValue( SbxVariable* pVar, const Type& rType, Property* pUnoProperty
         case TypeClass_CLASS:           break;
         case TypeClass_TYPEDEF:         break;
         case TypeClass_UNION:           break;
-        case TypeClass_ENUM:            break;
         case TypeClass_ARRAY:           break;
         */
 
-        // Array -> Sequence
         case TypeClass_ENUM:
         {
             aRetVal = int2enum( pVar->GetLong(), rType );
@@ -1888,8 +1878,6 @@ String Dbg_SbxDataType2String( SbxDataType eType )
         case SbxBYTE:       aRet = String( RTL_CONSTASCII_USTRINGPARAM("SbxBYTE") ); break;
         case SbxUSHORT:     aRet = String( RTL_CONSTASCII_USTRINGPARAM("SbxUSHORT") ); break;
         case SbxULONG:      aRet = String( RTL_CONSTASCII_USTRINGPARAM("SbxULONG") ); break;
-        case SbxLONG64:     aRet = String( RTL_CONSTASCII_USTRINGPARAM("SbxLONG64") ); break;
-        case SbxULONG64:    aRet = String( RTL_CONSTASCII_USTRINGPARAM("SbxULONG64") ); break;
         case SbxSALINT64:   aRet = String( RTL_CONSTASCII_USTRINGPARAM("SbxINT64") ); break;
         case SbxSALUINT64:  aRet = String( RTL_CONSTASCII_USTRINGPARAM("SbxUINT64") ); break;
         case SbxINT:        aRet = String( RTL_CONSTASCII_USTRINGPARAM("SbxINT") ); break;
diff --git a/basic/source/runtime/methods1.cxx b/basic/source/runtime/methods1.cxx
index 2b82281..54768cc 100644
--- a/basic/source/runtime/methods1.cxx
+++ b/basic/source/runtime/methods1.cxx
@@ -158,12 +158,12 @@ RTLFUNC(CByte) // JSM
     rPar.Get(0)->PutByte(nByte);
 }
 
-RTLFUNC(CCur)  // JSM
+RTLFUNC(CCur)
 {
     (void)pBasic;
     (void)bWrite;
 
-    SbxINT64 nCur;
+    sal_Int64 nCur = 0;
     if ( rPar.Count() == 2 )
     {
         SbxVariable *pSbxVariable = rPar.Get(1);
@@ -175,7 +175,7 @@ RTLFUNC(CCur)  // JSM
     rPar.Get(0)->PutCurrency( nCur );
 }
 
-RTLFUNC(CDec)  // JSM
+RTLFUNC(CDec)
 {
     (void)pBasic;
     (void)bWrite;
@@ -881,13 +881,19 @@ BOOL lcl_WriteSbxVariable( const SbxVariable& rVar, SvStream* pStrm,
 
         case SbxLONG:
         case SbxULONG:
-        case SbxLONG64:
-        case SbxULONG64:
                 if( bIsVariant )
                     *pStrm << (USHORT)SbxLONG; // VarType Id
                 *pStrm << rVar.GetLong();
                 break;
-
+#if IMPLEMENTATION_READY
+        case SbxSALINT64:
+        case SbxSALUINT64:
+                if( bIsVariant )
+                    *pStrm << (USHORT)SbxSALINT64; // VarType Id
+                //TODO fix truncating cast with new stream method or 2 part print
+                *pStrm << (sal_Int32)rVar.GetInt64();
+                break;
+#endif
         case SbxSINGLE:
                 if( bIsVariant )
                     *pStrm << (USHORT)eType; // VarType Id
@@ -983,15 +989,23 @@ BOOL lcl_ReadSbxVariable( SbxVariable& rVar, SvStream* pStrm,
 
         case SbxLONG:
         case SbxULONG:
-        case SbxLONG64:
-        case SbxULONG64:
                 {
                 INT32 aInt;
                 *pStrm >> aInt;
                 rVar.PutLong( aInt );
                 }
                 break;
-
+#if IMPLEMENTATION_READY
+        case SbxSALINT64:
+        case SbxSALUINT64:
+                {
+                sal_Int32 aInt;
+                //TODO fix incorrect use of 32bit type with new stream method in tools
+                *pStrm >> aInt;
+                rVar.PutInt64( (sal_Int64)aInt );
+                }
+                break;
+#endif
         case SbxSINGLE:
                 {
                 float nS;
@@ -1354,8 +1368,8 @@ RTLFUNC(TypeLen)
             case SbxDOUBLE:
             case SbxCURRENCY:
             case SbxDATE:
-            case SbxLONG64:
-            case SbxULONG64:
+            case SbxSALINT64:
+            case SbxSALUINT64:
                 nLen = 8;
                 break;
 
diff --git a/basic/source/sbx/makefile.mk b/basic/source/sbx/makefile.mk
index cc20080..9b76f96 100644
--- a/basic/source/sbx/makefile.mk
+++ b/basic/source/sbx/makefile.mk
@@ -58,7 +58,6 @@ SLOFILES=	\
     $(SLO)$/sbxsng.obj 		\
     $(SLO)$/sbxuint.obj		\
     $(SLO)$/sbxulng.obj		\
-    $(SLO)$/sbxvals.obj		\
     $(SLO)$/sbxvar.obj
 
 
diff --git a/basic/source/sbx/sbxbool.cxx b/basic/source/sbx/sbxbool.cxx
index 1f7d510..5c6657b 100644
--- a/basic/source/sbx/sbxbool.cxx
+++ b/basic/source/sbx/sbxbool.cxx
@@ -71,14 +71,10 @@ enum SbxBOOL ImpGetBool( const SbxValues* p )
             }
             break;
         case SbxSALINT64:
+        case SbxCURRENCY:
             nRes = p->nInt64 ? SbxTRUE : SbxFALSE; break;
         case SbxSALUINT64:
             nRes = p->uInt64 ? SbxTRUE : SbxFALSE; break;
-        case SbxULONG64:
-            nRes = !!p->nULong64 ? SbxTRUE : SbxFALSE; break;
-        case SbxLONG64:
-        case SbxCURRENCY:
-            nRes = !!p->nLong64 ? SbxTRUE : SbxFALSE; break;
         case SbxBYREF | SbxSTRING:
         case SbxSTRING:
         case SbxLPSTR:
@@ -139,16 +135,11 @@ enum SbxBOOL ImpGetBool( const SbxValues* p )
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             nRes = ( *p->pDouble != 0 ) ? SbxTRUE : SbxFALSE; break;
+        case SbxBYREF | SbxCURRENCY:
         case SbxBYREF | SbxSALINT64:
             nRes = ( *p->pnInt64 ) ? SbxTRUE : SbxFALSE; break;
         case SbxBYREF | SbxSALUINT64:
             nRes = ( *p->puInt64 ) ? SbxTRUE : SbxFALSE; break;
-        case SbxBYREF | SbxULONG64:
-            nRes = !!*p->pULong64 ? SbxTRUE : SbxFALSE; break;
-        case SbxBYREF | SbxLONG64:
-        case SbxBYREF | SbxCURRENCY:
-            nRes = !!*p->pLong64 ? SbxTRUE : SbxFALSE; break;
-
         default:
             SbxBase::SetError( SbxERR_CONVERSION ); nRes = SbxFALSE;
     }
@@ -180,15 +171,11 @@ void ImpPutBool( SbxValues* p, INT16 n )
         case SbxDATE:
         case SbxDOUBLE:
             p->nDouble = n; break;
+        case SbxCURRENCY:
         case SbxSALINT64:
-            p->nInt64 = n; break;
+            p->nInt64 = (sal_Int64) n; break;
         case SbxSALUINT64:
-            p->uInt64 = n; break;
-        case SbxULONG64:
-            p->nULong64.Set( (UINT32)n ); break;
-        case SbxLONG64:
-        case SbxCURRENCY:
-            p->nLong64.Set( (INT32)n ); break;
+            p->uInt64 = (sal_uInt64) n; break;
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             ImpCreateDecimal( p )->setInt( (INT16)n );
@@ -231,16 +218,11 @@ void ImpPutBool( SbxValues* p, INT16 n )
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             *p->pDouble = n; break;
+        case SbxBYREF | SbxCURRENCY:
         case SbxBYREF | SbxSALINT64:
-            *p->pnInt64 = n; break;
+            *p->pnInt64 = (sal_Int64) n; break;
         case SbxBYREF | SbxSALUINT64:
-            *p->puInt64 = n; break;
-        case SbxBYREF | SbxULONG64:
-            p->pULong64->Set( (UINT32)n ); break;
-        case SbxBYREF | SbxLONG64:
-        case SbxBYREF | SbxCURRENCY:
-            p->pLong64->Set( (INT32)n ); break;
-
+            *p->puInt64 = (sal_uInt64) n; break;
         default:
             SbxBase::SetError( SbxERR_CONVERSION );
     }
diff --git a/basic/source/sbx/sbxbyte.cxx b/basic/source/sbx/sbxbyte.cxx
index 0151f59..2c194f5 100644
--- a/basic/source/sbx/sbxbyte.cxx
+++ b/basic/source/sbx/sbxbyte.cxx
@@ -95,8 +95,13 @@ start:
             else
                 nRes = (BYTE) p->nULong;
             break;
+        case SbxCURRENCY:
         case SbxSALINT64:
-            if( p->nInt64 > SbxMAXBYTE )
+        {
+            sal_Int64 val = p->nInt64;
+            if ( p->eType == SbxCURRENCY )
+                val = val / CURRENCY_FACTOR;
+            if( val > SbxMAXBYTE )
             {
                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
             }
@@ -105,8 +110,9 @@ start:
                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = 0;
             }
             else
-                nRes = (BYTE) p->nInt64;
+                nRes = (BYTE) val;
             break;
+        }
         case SbxSALUINT64:
             if( p->uInt64 > SbxMAXBYTE )
             {
@@ -129,20 +135,11 @@ start:
             break;
         case SbxDATE:
         case SbxDOUBLE:
-        case SbxLONG64:
-        case SbxULONG64:
-        case SbxCURRENCY:
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             {
             double dVal;
-            if( p->eType ==	SbxCURRENCY )
-                dVal = ImpCurrencyToDouble( p->nLong64 );
-            else if( p->eType == SbxLONG64 )
-                dVal = ImpINT64ToDouble( p->nLong64 );
-            else if( p->eType == SbxULONG64 )
-                dVal = ImpUINT64ToDouble( p->nULong64 );
-            else if( p->eType == SbxDECIMAL )
+            if( p->eType == SbxDECIMAL )
             {
                 dVal = 0.0;
                 if( p->pDecimal )
@@ -219,11 +216,7 @@ start:
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             aTmp.nDouble = *p->pDouble; goto ref;
-        case SbxBYREF | SbxULONG64:
-            aTmp.nULong64 = *p->pULong64; goto ref;
-        case SbxBYREF | SbxLONG64:
         case SbxBYREF | SbxCURRENCY:
-            aTmp.nLong64 = *p->pLong64; goto ref;
         case SbxBYREF | SbxSALINT64:
             aTmp.nInt64 = *p->pnInt64; goto ref;
         case SbxBYREF | SbxSALUINT64:
@@ -259,16 +252,12 @@ void ImpPutByte( SbxValues* p, BYTE n )
         case SbxDATE:
         case SbxDOUBLE:
             p->nDouble = n; break;
+        case SbxCURRENCY:
+            p->nInt64 = n * CURRENCY_FACTOR; break;
         case SbxSALINT64:
             p->nInt64 = n; break;
         case SbxSALUINT64:
             p->uInt64 = n; break;
-        case SbxULONG64:
-            p->nULong64 = ImpDoubleToUINT64( (double)n ); break;
-        case SbxLONG64:
-            p->nLong64 = ImpDoubleToINT64( (double)n ); break;
-        case SbxCURRENCY:
-            p->nLong64 = ImpDoubleToCurrency( (double)n ); break;
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             ImpCreateDecimal( p )->setByte( n );
@@ -312,16 +301,12 @@ void ImpPutByte( SbxValues* p, BYTE n )
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             *p->pDouble = n; break;
-        case SbxBYREF | SbxULONG64:
-            *p->pULong64 = ImpDoubleToUINT64( (double)n ); break;
-        case SbxBYREF | SbxLONG64:
-            *p->pLong64 = ImpDoubleToINT64( (double)n ); break;
+        case SbxBYREF | SbxCURRENCY:
+            p->nInt64 = n * CURRENCY_FACTOR; break;
         case SbxBYREF | SbxSALINT64:
             *p->pnInt64 = n; break;
         case SbxBYREF | SbxSALUINT64:
             *p->puInt64 = n; break;
-        case SbxBYREF | SbxCURRENCY:
-            *p->pLong64 = ImpDoubleToCurrency( (double)n ); break;
 
         default:
             SbxBase::SetError( SbxERR_CONVERSION );
diff --git a/basic/source/sbx/sbxchar.cxx b/basic/source/sbx/sbxchar.cxx
index ab0aff6..322f95c 100644
--- a/basic/source/sbx/sbxchar.cxx
+++ b/basic/source/sbx/sbxchar.cxx
@@ -81,8 +81,15 @@ start:
             else
                 nRes = (xub_Unicode) p->nULong;
             break;
+        case SbxCURRENCY:
         case SbxSALINT64:
-            if( p->nInt64 > SbxMAXCHAR )
+        {
+            sal_Int64 val = p->nInt64;
+
+            if ( p->eType == SbxCURRENCY )
+                val = val / CURRENCY_FACTOR;
+
+            if( val > SbxMAXCHAR )
             {
                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXCHAR;
             }
@@ -91,8 +98,9 @@ start:
                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMINCHAR;
             }
             else
-                nRes = (xub_Unicode) p->nInt64;
+                nRes = (xub_Unicode) val;
             break;
+        }
         case SbxSALUINT64:
             if( p->uInt64 > SbxMAXCHAR )
             {
@@ -115,20 +123,11 @@ start:
             break;
         case SbxDATE:
         case SbxDOUBLE:
-        case SbxLONG64:
-        case SbxULONG64:
-        case SbxCURRENCY:
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             {
             double dVal;
-            if( p->eType ==	SbxCURRENCY )
-                dVal = ImpCurrencyToDouble( p->nLong64 );
-            else if( p->eType == SbxLONG64 )
-                dVal = ImpINT64ToDouble( p->nLong64 );
-            else if( p->eType == SbxULONG64 )
-                dVal = ImpUINT64ToDouble( p->nULong64 );
-            else if( p->eType == SbxDECIMAL )
+            if( p->eType == SbxDECIMAL )
             {
                 dVal = 0.0;
                 if( p->pDecimal )
@@ -202,11 +201,7 @@ start:
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             aTmp.nDouble = *p->pDouble; goto ref;
-        case SbxBYREF | SbxULONG64:
-            aTmp.nULong64 = *p->pULong64; goto ref;
-        case SbxBYREF | SbxLONG64:
         case SbxBYREF | SbxCURRENCY:
-            aTmp.nLong64 = *p->pLong64; goto ref;
         case SbxBYREF | SbxSALINT64:
             aTmp.nInt64 = *p->pnInt64; goto ref;
         case SbxBYREF | SbxSALUINT64:
@@ -239,16 +234,12 @@ start:
         case SbxDATE:
         case SbxDOUBLE:
             p->nDouble = n; break;
+        case SbxCURRENCY:
+            p->nInt64 = n * CURRENCY_FACTOR; break;
         case SbxSALINT64:
             p->nInt64 = n; break;
         case SbxSALUINT64:
             p->uInt64 = n; break;
-        case SbxULONG64:
-            p->nULong64 = ImpDoubleToUINT64( (double)n ); break;
-        case SbxLONG64:
-            p->nLong64 = ImpDoubleToINT64( (double)n ); break;
-        case SbxCURRENCY:
-            p->nLong64 = ImpDoubleToCurrency( (double)n ); break;
         case SbxBYREF | SbxDECIMAL:
             ImpCreateDecimal( p )->setChar( n );
             break;
@@ -301,16 +292,12 @@ start:
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             *p->pDouble = (double) n; break;
+        case SbxBYREF | SbxCURRENCY:
+            p->nInt64 = n * CURRENCY_FACTOR; break;
         case SbxBYREF | SbxSALINT64:
             *p->pnInt64 = n; break;
         case SbxBYREF | SbxSALUINT64:
             *p->puInt64 = n; break;
-        case SbxBYREF | SbxULONG64:
-            *p->pULong64 = ImpDoubleToUINT64( (double)n ); break;
-        case SbxBYREF | SbxLONG64:
-            *p->pLong64 = ImpDoubleToINT64( (double)n ); break;
-        case SbxBYREF | SbxCURRENCY:
-            *p->pLong64 = ImpDoubleToCurrency( (double)n ); break;
 
         default:
             SbxBase::SetError( SbxERR_CONVERSION );
diff --git a/basic/source/sbx/sbxconv.hxx b/basic/source/sbx/sbxconv.hxx
index 66ce3fb..8f42345 100644
--- a/basic/source/sbx/sbxconv.hxx
+++ b/basic/source/sbx/sbxconv.hxx
@@ -47,13 +47,15 @@ extern BOOL ImpConvStringExt( ::rtl::OUString& rSrc, SbxDataType eTargetType );
 double 	    ImpRound( double );
 INT16 	    ImpGetInteger( const SbxValues* );
 void        ImpPutInteger( SbxValues*, INT16 );
+
 sal_Int64 	ImpGetInt64( const SbxValues* );
 void        ImpPutInt64( SbxValues*, sal_Int64 );
 sal_uInt64 	ImpGetUInt64( const SbxValues* );
 void        ImpPutUInt64( SbxValues*, sal_uInt64 );
 
-sal_Int64   ImpDoubleToSalInt64( double d );
+sal_Int64   ImpDoubleToSalInt64 ( double d );
 sal_uInt64  ImpDoubleToSalUInt64( double d );
+double      ImpSalInt64ToDouble ( sal_Int64 n );
 double      ImpSalUInt64ToDouble( sal_uInt64 n );
 
 // SBXLNG.CXX
@@ -71,37 +73,18 @@ void    ImpPutSingle( SbxValues*, float );
 double 	ImpGetDouble( const SbxValues* );
 void    ImpPutDouble( SbxValues*, double, BOOL bCoreString=FALSE );
 
-#if FALSE
-// SBX64.CXX
-
-SbxINT64  ImpGetINT64( const SbxValues* );
-void      ImpPutINT64( SbxValues*, const SbxINT64& );
-SbxUINT64 ImpGetUINT64( const SbxValues* );
-void      ImpPutUINT64( SbxValues*, const SbxUINT64& );
-#endif
-
 // SBXCURR.CXX
 
-SbxUINT64 ImpDoubleToUINT64( double );
-double 	  ImpUINT64ToDouble( const SbxUINT64& );
-SbxINT64  ImpDoubleToINT64( double );
-double 	  ImpINT64ToDouble( const SbxINT64& );
+sal_Int64   ImpGetCurrency( const SbxValues* );
+void        ImpPutCurrency( SbxValues*, const sal_Int64 );
 
-#if TRUE
-INT32	  ImpGetCurrLong( const SbxValues* );
-void      ImpPutCurrLong( SbxValues*, INT32 );
-INT32 	  ImpDoubleToCurrLong( double );
-double 	  ImpCurrLongToDouble( INT32 );
-#endif
+inline  sal_Int64   ImpDoubleToCurrency( double d )
+                    {   if (d > 0) return (sal_Int64)( d * CURRENCY_FACTOR + 0.5);
+                              else return (sal_Int64)( d * CURRENCY_FACTOR - 0.5);
+                    }
 
-SbxINT64  ImpGetCurrency( const SbxValues* );
-void      ImpPutCurrency( SbxValues*, const SbxINT64& );
-inline
-SbxINT64  ImpDoubleToCurrency( double d )
-          { return ImpDoubleToINT64( d * CURRENCY_FACTOR ); }
-inline
-double 	  ImpCurrencyToDouble( const SbxINT64 &r )
-          { return ImpINT64ToDouble( r ) / CURRENCY_FACTOR; }
+inline  double 	    ImpCurrencyToDouble( const sal_Int64 r )
+                    { return (double)r / (double)CURRENCY_FACTOR; }
 
 
 // SBXDEC.CXX
@@ -124,7 +107,7 @@ void   	ImpPutString( SbxValues*, const ::rtl::OUString* );
 // SBXCHAR.CXX
 
 sal_Unicode ImpGetChar( const SbxValues* );
-void    ImpPutChar( SbxValues*, sal_Unicode );
+void        ImpPutChar( SbxValues*, sal_Unicode );
 
 // SBXBYTE.CXX
 BYTE 	ImpGetByte( const SbxValues* );
@@ -143,9 +126,9 @@ void    ImpPutULong( SbxValues*, UINT32 );
 // SBXBOOL.CXX
 
 enum SbxBOOL ImpGetBool( const SbxValues* );
-void    ImpPutBool( SbxValues*, INT16 );
+void         ImpPutBool( SbxValues*, INT16 );
 
-// ByteArry <--> String
+// ByteArray <--> String
 SbxArray* StringToByteArray(const ::rtl::OUString& rStr);
 ::rtl::OUString ByteArrayToString(SbxArray* pArr);
 
diff --git a/basic/source/sbx/sbxcurr.cxx b/basic/source/sbx/sbxcurr.cxx
index 0057d6f..f40e0b0 100644
--- a/basic/source/sbx/sbxcurr.cxx
+++ b/basic/source/sbx/sbxcurr.cxx
@@ -29,101 +29,289 @@
 // MARKER(update_precomp.py): autogen include statement, do not remove
 #include "precompiled_basic.hxx"
 
-#include <basic/sbx.hxx>
 #include <tools/errcode.hxx>
+#include <vcl/svapp.hxx>        // for SvtSysLocale
 
-#define _TLBIGINT_INT64
-#include <tools/bigint.hxx>
-
+#include <basic/sbx.hxx>
 #include <basic/sbxvar.hxx>
 #include "sbxconv.hxx"
 
-static ::rtl::OUString   ImpCurrencyToString( const SbxINT64& );
-static SbxINT64 ImpStringToCurrency( const ::rtl::OUString& );
 
-SbxINT64 ImpGetCurrency( const SbxValues* p )
+static rtl::OUString ImpCurrencyToString( const sal_Int64 &rVal )
 {
-    SbxValues aTmp;
-    SbxINT64 nRes;
+    bool isNeg = ( rVal < 0 );
+    sal_Int64 absVal = isNeg ? -rVal : rVal;
+
+    SvtSysLocale aSysLocale;
+    sal_Unicode cDecimalSep = '.', cThousandSep = ',';
+#if MAYBEFUTURE
+    const LocaleDataWrapper& rData = aSysLocale.GetLocaleData();
+    cDecimalSep = rData.getNumDecimalSep().GetBuffer()[0];
+    cThousandSep = rData.getNumThousandSep().GetBuffer()[0];
+#endif
+
+    rtl::OUString aAbsStr = rtl::OUString::valueOf( absVal );
+    rtl::OUStringBuffer aBuf;
+
+    sal_Int32 initialLen = aAbsStr.getLength();
+
+    bool bLessThanOne = false;
+    if ( initialLen  <= 4 )  // if less the 1
+        bLessThanOne = true;
+
+    sal_Int32 nCapacity = 6; // minimum e.g. 0.0000
+
+    if ( !bLessThanOne )
+    {
+        nCapacity = initialLen + 1;
+        if ( initialLen > 5 )
+        {
+            sal_Int32 nThouSeperators = ( initialLen - 5 ) / 3;
+            nCapacity += nThouSeperators;
+        }
+    }
+
+    if ( isNeg )
+        ++nCapacity;
+
+    aBuf.setLength( nCapacity );
+
+
+    sal_Int32 nDigitCount = 0;
+    sal_Int32 nInsertIndex = nCapacity - 1;
+    sal_Int32 nEndIndex = isNeg ? 1 : 0;
+
+    for ( sal_Int32 charCpyIndex = aAbsStr.getLength() - 1; nInsertIndex >= nEndIndex;  ++nDigitCount )
+    {
+        if ( nDigitCount == 4 )
+            aBuf.setCharAt( nInsertIndex--, cDecimalSep );
+        if ( nDigitCount > 4 && ! ( ( nDigitCount - 4  ) % 3) )
+            aBuf.setCharAt( nInsertIndex--, cThousandSep );
+        if ( nDigitCount < initialLen )
+            aBuf.setCharAt( nInsertIndex--, aAbsStr[ charCpyIndex-- ] );
+        else
+        // Handle leading 0's to right of decimal point
+        // Note: in VBA the stringification is a little more complex
+        // but more natural as only the necessary digits
+        // to the right of the decimal places are displayed
+        // It would be great to conditionally be able to display like that too
+        //
+        // Val   OOo (Cur)  VBA (Cur)
+        // ---   ---------  ---------
+        // 0     0.0000     0
+        // 0.1   0.1000     0.1
+
+            aBuf.setCharAt( nInsertIndex--, (sal_Unicode)'0' );
+    }
+    if ( isNeg )
+            aBuf.setCharAt( nInsertIndex, (sal_Unicode)'-' );
+
+    aAbsStr = aBuf.makeStringAndClear();
+    return aAbsStr;
+}
+
+
+static sal_Int64 ImpStringToCurrency( const rtl::OUString &rStr )
+{
+// TODO consider various possible errors: overflow, end-of-string check for leftovers from malformed string
+    sal_Int32   nFractDigit = 4;
+    sal_Int64   nResult = 0;
+    sal_Bool    bNeg = sal_False;
+
+    const sal_Unicode* p = rStr.getStr();
+
+    SvtSysLocale aSysLocale;
+#if MAYBEFUTURE
+    const LocaleDataWrapper& rData = aSysLocale.GetLocaleData();
+    sal_Unicode cLocaleDeciPnt = rData.getNumDecimalSep().GetBuffer()[0];
+    sal_Unicode cLocale1000Sep = rData.getNumThousandSep().GetBuffer()[0];
+#endif
+    sal_Unicode cSpaceSep = sal_Unicode(' ');
+    sal_Unicode cDeciPnt = sal_Unicode('.');
+    sal_Unicode c1000Sep = sal_Unicode(',');
+
+#if MAYBEFUTURE
+        // score each set of separators (Locale and Basic) on total number of matches
+        // if one set has more matches use that set
+        // if tied use the set with the only or rightmost decimal separator match
+        // currency is fixed pt system: usually expect the decimal pt, 1000sep may occur
+    sal_Int32 LocaleScore = 0;
+    sal_Int32 LocaleLastDeci = -1;
+    sal_Int32 LOBasicScore = 0;
+    sal_Int32 LOBasicLastDeci = -1;
+
+    for( int idx=0; idx<rStr.getLength(); idx++ )
+    {
+        if ( *(p+idx) == cLocaleDeciPnt )
+        {
+            LocaleScore++;
+            LocaleLastDeci = idx;
+        }
+        if ( *(p+idx) == cLocale1000Sep )
+            LocaleScore++;
+
+        if ( *(p+idx) == cDeciPnt )
+        {
+            LOBasicScore++;
+            LOBasicLastDeci = idx;
+        }
+        if ( *(p+idx) == c1000Sep )
+            LOBasicScore++;
+    }
+    if ( ( LocaleScore > LOBasicScore )
+       ||( LocaleScore = LOBasicScore && LocaleLastDeci > LOBasicLastDeci ) )
+    {
+        cDeciPnt = cLocaleDeciPnt;
+        c1000Sep = cLocale1000Sep;
+    }
+#endif
+
+    //  p == original param value: re-starting at top of string
+    while( *p == cSpaceSep ) p++;                   // skip leading spaces
+    if( *p == sal_Unicode('-') )
+    {
+        p++;
+        bNeg = sal_True;
+    }
+    else if ( *p == sal_Unicode('+') )
+        p++;
+
+    while( *p == cSpaceSep ) p++;                   // skip space between sign and number
+
+    // always accept space as thousand separator (is never decimal pt; maybe stray)
+    // exits on non-numeric (incl. null terminator)
+    while( ( *p >= '0' && *p <= '9' ) || *p == c1000Sep || *p == cSpaceSep )
+    {
+        if ( *p >= '0' && *p <= '9' )
+            nResult = 10*nResult + (sal_Int64)*p - (sal_Int64)'0';
+        p++;
+        // could be overflow here ... new result < last result (results always > 0)
+    }
+
+    if( *p == cDeciPnt ) {
+        p++;
+        while( (nFractDigit && *p >= '0' && *p <= '9') || *p == cSpaceSep )
+        {
+            nResult = 10*nResult + (sal_Int64)*p - (sal_Int64)'0';
+            nFractDigit--;
+            p++;
+            // could be overflow here ...
+        }
+        while( *p == cSpaceSep ) p++;               // skip mid-number/trailing spaces
+        if( *p >= '5' && *p <= '9' ) nResult ++;    // round 5-9 up = round to nearest
+    }
+    while( *p == cSpaceSep ) p++;                   // skip mid-number/trailing spaces
+    // error cases of junky string skip thru to end up here
+    // warning cases of extra num ignored end up here too
+
+    // make sure all of CURRENCY_FACTOR is applied
+    while( nFractDigit ) {
+        nResult *= 10;
+        nFractDigit--;
+    }
+    if( bNeg )  return -nResult;
+    return nResult;
+}
+
+
+sal_Int64 ImpGetCurrency( const SbxValues* p )
+{
+    SbxValues   aTmp;
+    sal_Int64  nRes;
 start:
     switch( +p->eType )
     {
+        case SbxERROR:
         case SbxNULL:
             SbxBase::SetError( SbxERR_CONVERSION );
+            nRes = 0; break;
         case SbxEMPTY:
-            nRes.SetNull(); break;
-        case SbxCHAR:
-            nRes = ImpDoubleToCurrency( (double)p->nChar ); break;
+            nRes = 0; break;
+        case SbxCURRENCY:
+            nRes = p->nInt64; break;
         case SbxBYTE:
-            nRes = ImpDoubleToCurrency( (double)p->nByte ); break;
-        case SbxINTEGER:
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nByte);
+            break;
+        case SbxCHAR:
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->pChar);
+            break;
         case SbxBOOL:
-            nRes = ImpDoubleToCurrency( (double)p->nInteger ); break;
-        case SbxERROR:
+        case SbxINTEGER:
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nInteger);
+            break;
         case SbxUSHORT:
-            nRes = ImpDoubleToCurrency( (double)p->nUShort ); break;
-        case SbxCURRENCY:
-            nRes = p->nLong64; break;
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nUShort);
+            break;
         case SbxLONG:
-            nRes = ImpDoubleToCurrency( (double)p->nLong );
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nLong);
             break;
         case SbxULONG:
-            nRes = ImpDoubleToCurrency( (double)p->nULong );
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nULong);
             break;
+
         case SbxSALINT64:
-            nRes = ImpDoubleToCurrency( (double)p->nInt64 );
-            break;
+        {
+            nRes = p->nInt64 * CURRENCY_FACTOR; break;
+            if ( nRes > SbxMAXSALINT64 )
+            {
+                SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXSALINT64;
+            }
+        }
         case SbxSALUINT64:
-            nRes = ImpDoubleToCurrency( ImpSalUInt64ToDouble( p->uInt64 ) );
-            break;
-        case SbxSINGLE:
-            if( p->nSingle > SbxMAXCURR )
+            nRes = p->nInt64 * CURRENCY_FACTOR; break;
+            if ( nRes > SbxMAXSALINT64 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMax();
+                SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXSALINT64;
             }
-            else if( p->nSingle < SbxMINCURR )
+            else if ( nRes < SbxMINSALINT64 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMin();
+                SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMINSALINT64;
             }
-            else
-                nRes = ImpDoubleToCurrency( (double)p->nSingle );
             break;
-        case SbxDATE:
-        case SbxDOUBLE:
-            if( p->nDouble > SbxMAXCURR )
+//TODO: bring back SbxINT64 types here for limits -1 with flag value at SAL_MAX/MIN
+        case SbxSINGLE:
+            if( p->nSingle * CURRENCY_FACTOR + 0.5 > (float)SAL_MAX_INT64
+             || p->nSingle * CURRENCY_FACTOR - 0.5 < (float)SAL_MIN_INT64 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMax();
+                nRes = SAL_MAX_INT64;
+                if( p->nSingle * CURRENCY_FACTOR - 0.5 < (float)SAL_MIN_INT64 )
+                    nRes = SAL_MIN_INT64;
+                SbxBase::SetError( SbxERR_OVERFLOW );
+                break;
             }
-            else if( p->nDouble < SbxMINCURR )
+            nRes = ImpDoubleToCurrency( (double)p->nSingle );
+            break;
+
+        case SbxDATE:
+        case SbxDOUBLE:
+            if( p->nDouble * CURRENCY_FACTOR + 0.5 > (double)SAL_MAX_INT64
+             || p->nDouble * CURRENCY_FACTOR - 0.5 < (double)SAL_MIN_INT64 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMin();
+                nRes = SAL_MAX_INT64;
+                if( p->nDouble * CURRENCY_FACTOR - 0.5 < (double)SAL_MIN_INT64 )
+                    nRes = SAL_MIN_INT64;
+                SbxBase::SetError( SbxERR_OVERFLOW );
+                break;
             }
-            else
-                nRes = ImpDoubleToCurrency( p->nDouble );
+            nRes = ImpDoubleToCurrency( p->nDouble );
             break;
+
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             {
             double d = 0.0;
             if( p->pDecimal )
                 p->pDecimal->getDouble( d );
-            if( d > SbxMAXCURR )
-            {
-                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMax();
-            }
-            else if( d < SbxMINCURR )
-            {
-                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMin();
-            }
-            else
-                nRes = ImpDoubleToCurrency( d );
+            nRes = ImpDoubleToCurrency( d );
             break;
             }
+
+
         case SbxBYREF | SbxSTRING:
         case SbxSTRING:
         case SbxLPSTR:
             if( !p->pOUString )
-                nRes.SetNull();
+                nRes=0;
             else
                 nRes = ImpStringToCurrency( *p->pOUString );
             break;
@@ -134,23 +322,26 @@ start:
                 nRes = pVal->GetCurrency();
             else
             {
-                SbxBase::SetError( SbxERR_NO_OBJECT ); nRes.SetNull();
+                SbxBase::SetError( SbxERR_NO_OBJECT );
+                nRes=0;
             }
             break;
         }
 
         case SbxBYREF | SbxCHAR:
-            nRes = ImpDoubleToCurrency( (double)*p->pChar ); break;
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(*p->pChar);
+            break;
         case SbxBYREF | SbxBYTE:
-            nRes = ImpDoubleToCurrency( (double)*p->pByte ); break;
-        case SbxBYREF | SbxINTEGER:
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(*p->pByte);
+            break;
         case SbxBYREF | SbxBOOL:
-            nRes = ImpDoubleToCurrency( (double)*p->pInteger ); break;
+        case SbxBYREF | SbxINTEGER:
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(*p->pInteger);
+            break;
         case SbxBYREF | SbxERROR:
         case SbxBYREF | SbxUSHORT:
-            nRes = ImpDoubleToCurrency( (double)*p->pUShort ); break;
-        case SbxBYREF | SbxCURRENCY:
-            nRes = *p->pLong64; break;
+            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(*p->pUShort);
+            break;
 
         // from here on had to be tested
         case SbxBYREF | SbxLONG:
@@ -162,23 +353,25 @@ start:
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             aTmp.nDouble = *p->pDouble; goto ref;
+        case SbxBYREF | SbxCURRENCY:
         case SbxBYREF | SbxSALINT64:
             aTmp.nInt64 = *p->pnInt64; goto ref;
         case SbxBYREF | SbxSALUINT64:
             aTmp.uInt64 = *p->puInt64; goto ref;
         ref:
-            aTmp.eType = SbxDataType( p->eType & 0x0FFF );
+            aTmp.eType = SbxDataType( p->eType & ~SbxBYREF );
             p = &aTmp; goto start;
 
         default:
-            SbxBase::SetError( SbxERR_CONVERSION ); nRes.SetNull();
+            SbxBase::SetError( SbxERR_CONVERSION );
+            nRes=0;
     }
     return nRes;
 }
 
-void ImpPutCurrency( SbxValues* p, const SbxINT64 &r )
+
+void ImpPutCurrency( SbxValues* p, const sal_Int64 r )
 {
-    double dVal = ImpCurrencyToDouble( r );
     SbxValues aTmp;
 start:
     switch( +p->eType )
@@ -204,21 +397,23 @@ start:
 
         // from here no longer
         case SbxSINGLE:
-            p->nSingle = (float)dVal; break;
+            p->nSingle = (float)( r / CURRENCY_FACTOR ); break;
         case SbxDATE:
         case SbxDOUBLE:
-            p->nDouble = dVal; break;
-        case SbxSALINT64:
-            p->nInt64 = ImpDoubleToSalInt64( dVal ); break;
+            p->nDouble =  ImpCurrencyToDouble( r ); break;
         case SbxSALUINT64:
-            p->uInt64 = ImpDoubleToSalUInt64( dVal ); break;
+            p->uInt64 = r / CURRENCY_FACTOR; break;
+        case SbxSALINT64:
+            p->nInt64 = r / CURRENCY_FACTOR; break;
+
         case SbxCURRENCY:
-            p->nLong64 = r; break;
+            p->nInt64 = r; break;
+
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             {
             SbxDecimal* pDec = ImpCreateDecimal( p );
-            if( !pDec->setDouble( dVal ) )
+            if( !pDec->setDouble( ImpCurrencyToDouble( r ) / CURRENCY_FACTOR ) )
                 SbxBase::SetError( SbxERR_OVERFLOW ); 
             break;
             }
@@ -226,7 +421,7 @@ start:
         case SbxSTRING:
         case SbxLPSTR:
             if( !p->pOUString )
-                p->pOUString = new ::rtl::OUString;
+                p->pOUString = new rtl::OUString;
 
             *p->pOUString = ImpCurrencyToString( r );
             break;
@@ -240,158 +435,100 @@ start:
             break;
         }
         case SbxBYREF | SbxCHAR:
-            if( dVal > SbxMAXCHAR )
+        {
+            sal_Int64 val = r / CURRENCY_FACTOR;
+            if( val > SbxMAXCHAR )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXCHAR;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXCHAR;
             }
-            else if( dVal < SbxMINCHAR )
+            else if( val < SbxMINCHAR )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMINCHAR;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMINCHAR;
             }
-            *p->pChar = (xub_Unicode) dVal; break;
+            *p->pChar = (sal_Unicode) val; break;
+        }
         case SbxBYREF | SbxBYTE:
-            if( dVal > SbxMAXBYTE )
+        {
+            sal_Int64 val = r / CURRENCY_FACTOR;
+            if( val > SbxMAXBYTE )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXBYTE;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXBYTE;
             }
-            else if( dVal < 0 )
+            else if( val < 0 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = 0;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = 0;
             }
-            *p->pByte = (BYTE) dVal; break;
+            *p->pByte = (BYTE) val; break;
+        }
         case SbxBYREF | SbxINTEGER:
         case SbxBYREF | SbxBOOL:
-            if( dVal > SbxMAXINT )
+        {
+            sal_Int64 val = r / CURRENCY_FACTOR;
+            if( r > SbxMAXINT )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXINT;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXINT;
             }
-            else if( dVal < SbxMININT )
+            else if( r < SbxMININT )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMININT;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMININT;
             }
-            *p->pInteger = (INT16) dVal; break;
+            *p->pInteger = (INT16) r; break;
+        }
         case SbxBYREF | SbxERROR:
         case SbxBYREF | SbxUSHORT:
-            if( dVal > SbxMAXUINT )
+        {
+            sal_Int64 val = r / CURRENCY_FACTOR;
+            if( val > SbxMAXUINT )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXUINT;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXUINT;
             }
-            else if( dVal < 0 )
+            else if( val < 0 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = 0;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = 0;
             }
-            *p->pUShort = (UINT16) dVal; break;
+            *p->pUShort = (UINT16) val; break;
+        }
         case SbxBYREF | SbxLONG:
-            if( dVal > SbxMAXLNG )
+        {
+            sal_Int64 val = r / CURRENCY_FACTOR;
+            if( val > SbxMAXLNG )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXLNG;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXLNG;
             }
-            else if( dVal < SbxMINLNG )
+            else if( val < SbxMINLNG )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMINLNG;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMINLNG;
             }
-            *p->pLong = (INT32) dVal; break;
+            *p->pLong = (INT32) val; break;
+        }
         case SbxBYREF | SbxULONG:
-            if( dVal > SbxMAXULNG )
+        {
+            sal_Int64 val = r / CURRENCY_FACTOR;
+            if( val > SbxMAXULNG )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXULNG;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXULNG;
             }
-            else if( dVal < 0 )
+            else if( val < 0 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = 0;
+                SbxBase::SetError( SbxERR_OVERFLOW ); val = 0;
             }
-            *p->pULong = (UINT32) dVal; break;
+            *p->pULong = (UINT32) val;
+            break;
+        }
+        case SbxBYREF | SbxCURRENCY:
+            *p->pnInt64 = r; break;
         case SbxBYREF | SbxSALINT64:
-            *p->pnInt64 = ImpDoubleToSalInt64( dVal ); break;
+            *p->pnInt64 = r / CURRENCY_FACTOR; break;
         case SbxBYREF | SbxSALUINT64:
-            *p->puInt64 = ImpDoubleToSalUInt64( dVal ); break;
+            *p->puInt64 = (sal_uInt64)r / CURRENCY_FACTOR; break;
         case SbxBYREF | SbxSINGLE:
-            *p->pSingle = (float) dVal; break;
+            p->nSingle = (float)( r / CURRENCY_FACTOR ); break;
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
-            *p->pDouble = (double) dVal; break;
-        case SbxBYREF | SbxCURRENCY:
-            *p->pLong64 = r; break;
-
+            *p->pDouble = ImpCurrencyToDouble( r ); break;
         default:
             SbxBase::SetError( SbxERR_CONVERSION );
     }
 }
 
-// help functions for the conversion
-
-static ::rtl::OUString ImpCurrencyToString( const SbxINT64 &r )
-{
-    BigInt a10000 = 10000;
-
-    //return GetpApp()->GetAppInternational().GetCurr( BigInt( r ), 4 );
-    BigInt aInt( r );
-    aInt.Abs();
-    BigInt aFrac = aInt;
-    aInt  /= a10000;
-    aFrac %= a10000;
-    aFrac += a10000;
-
-    ::rtl::OUString aString;
-    if( r.nHigh < 0 )
-        aString = ::rtl::OUString( (sal_Unicode)'-' );

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list