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

Noel Power noelp at kemper.freedesktop.org
Tue Dec 21 07:05:08 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/sbxvalue.cxx     |  389 ++++++++++++++++++-----------
 21 files changed, 1370 insertions(+), 1035 deletions(-)

New commits:
commit 98b9bce000046288a3f65fc26158965469292afc
Author: Noel Power <noel.power at novell.com>
Date:   Tue Dec 21 15:04:14 2010 +0000

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

diff --git a/basic/inc/basic/sbx.hxx b/basic/inc/basic/sbx.hxx
index 9b5acf4..54450c6 100644
--- a/basic/inc/basic/sbx.hxx
+++ b/basic/inc/basic/sbx.hxx
@@ -33,13 +33,14 @@
 #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;
@@ -51,6 +52,8 @@ 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 84c9832..e5881ab 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,99 +54,90 @@ 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)
-
-//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
+    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
 };
 
 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     (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
+                        // 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
 };
 
 #endif
@@ -154,179 +145,204 @@ 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)
-#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
-
+#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
 #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 to create 'portability and independent
+// These intervals are fixed due to 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 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)
+#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)
 
 // 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 //ifndef __RSC
+#endif // __RSC
 
 #endif
 
diff --git a/basic/inc/basic/sbxvar.hxx b/basic/inc/basic/sbxvar.hxx
index 787a7df..6e6aee8 100644
--- a/basic/inc/basic/sbxvar.hxx
+++ b/basic/inc/basic/sbxvar.hxx
@@ -34,47 +34,169 @@
 #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 {
-        BYTE			nByte;
-        UINT16          nUShort;
         sal_Unicode		nChar;
+        BYTE			nByte;
         INT16			nInteger;
-        UINT32          nULong;
         INT32           nLong;
-        unsigned int    nUInt;
-        int             nInt;
-        sal_uInt64      uInt64;
-        sal_Int64       nInt64;
-
+        UINT16          nUShort;
+        UINT32          nULong;
         float           nSingle;
         double          nDouble;
-
-        rtl::OUString*  pOUString;
+        SbxINT64        nLong64;
+        SbxUINT64       nULong64;
+        sal_Int64       nInt64;
+        sal_uInt64      uInt64;
+        int             nInt;
+        unsigned int    nUInt;
+        ::rtl::OUString* pOUString;
         SbxDecimal*		pDecimal;
 
         SbxBase*        pObj;
-
-        BYTE*	        pByte;
-        UINT16*	        pUShort;
         sal_Unicode*    pChar;
+        BYTE*	        pByte;
         INT16*	        pInteger;
-        UINT32*	        pULong;
         INT32*	        pLong;
-        unsigned int*   pUInt;
-        int*	        pInt;
-        sal_uInt64*     puInt64;
-        sal_Int64*      pnInt64;
-
+        UINT16*	        pUShort;
+        UINT32*	        pULong;
         float*	        pSingle;
         double*	        pDouble;
-
+        SbxINT64*       pLong64;
+        SbxUINT64*      pULong64;
+        sal_Int64*      pnInt64;
+        sal_uInt64*     puInt64;
+        int*	        pInt;
+        unsigned int*   pUInt;
         void*	        pData;
     };
     SbxDataType	 eType;
@@ -87,15 +209,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( 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( int _nInt ): nInt( _nInt ), eType(SbxINT) {}
+    SbxValues( unsigned int _nUInt ): nUInt( _nUInt ), eType(SbxUINT) {}
     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
@@ -133,28 +255,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;
@@ -169,70 +291,61 @@ public:
 
     inline SbxValues * data() { return &aData; }
 
-    UINT16      GetErr() const;
-
-    BOOL        GetBool() const;
-    BYTE        GetByte() const;
-    sal_Unicode GetChar() const;
-    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;
+    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;
-
-    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 );
+    SbxBase* GetObject() const;
+    BOOL	 HasObject() const;
+    void*  GetData() 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 );
-
+    BOOL PutInteger( INT16 );
+    BOOL PutLong( INT32 );
     BOOL PutSingle( float );
     BOOL PutDouble( double );
     BOOL PutDate( double );
-
-            // with extended analysis (International, "TRUE"/"FALSE")
-    BOOL PutStringExt( const ::rtl::OUString& );
+    BOOL PutBool( BOOL );
+    BOOL PutErr( USHORT );
+    BOOL PutStringExt( const ::rtl::OUString& );     // with extended analysis (International, "TRUE"/"FALSE")
     BOOL PutString( const ::rtl::OUString& );
     BOOL PutString( const sal_Unicode* );   // Type = SbxSTRING
     BOOL PutpChar( const sal_Unicode* );    // Type = SbxLPSTR
-
-            // 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* );
+    BOOL PutChar( sal_Unicode );
+    BOOL PutByte( BYTE );
+    BOOL PutUShort( UINT16 );
+    BOOL PutULong( UINT32 );
+    BOOL PutInt( int );
+    BOOL PutEmpty();
+    BOOL PutNull();
+
+    // Special decimal methods
+    BOOL PutDecimal( com::sun::star::bridge::oleautomation::Decimal& rAutomationDec );
+    BOOL fillAutomationDecimal( com::sun::star::bridge::oleautomation::Decimal& rAutomationDec );
 
     virtual BOOL Convert( SbxDataType );
     virtual BOOL Compute( SbxOperator, const SbxValue& );
@@ -240,9 +353,12 @@ 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.
-    // TODO: Ensure error conditions (overflow, conversions)
-    // are taken into consideration in Compute and Compare
+    // Error conditions (overflow, conversions) are not
+    // taken into consideration.
 
     inline int operator ==( const SbxValue& ) const;
     inline int operator !=( const SbxValue& ) const;
@@ -330,7 +446,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 c979455..3a2a0da 100644
--- a/basic/source/classes/sbunoobj.cxx
+++ b/basic/source/classes/sbunoobj.cxx
@@ -781,7 +781,13 @@ void unoToSbxValue( SbxVariable* pVar, const Any& aValue )
                                 oleautomation::Currency aCurrency;
                                 if( (aValue >>= aCurrency) )
                                 {
-                                    pVar->PutCurrency( aCurrency.Value );
+                                    sal_Int64 nValue64 = aCurrency.Value;
+                                    SbxINT64 aInt64;
+                                    aInt64.nHigh =
+                                        sal::static_int_cast< INT32 >(
+                                            nValue64 >> 32);
+                                    aInt64.nLow = (UINT32)( nValue64 & 0xffffffff );
+                                    pVar->PutCurrency( aInt64 );
                                     break;
                                 }
                             }
@@ -954,6 +960,8 @@ 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;
@@ -1095,7 +1103,7 @@ Type getUnoTypeForSbxValue( SbxValue* pVal )
         }
         // Otherwise it is a No-Uno-Basic-Object -> default==deliver void
     }
-    // No object, convert basic type
+    // No objekt, convert basic type
     else
     {
         aRetType = getUnoTypeForSbxBaseType( eBaseType );
@@ -1184,7 +1192,6 @@ Any sbxToUnoValueImpl( SbxVariable* pVar, bool bBlockConversionToSmallestType =
                     aType = ::getCppuType( (sal_uInt16*)0 );
                 break;
             }
-            // TODO: need to add hyper types ?
             default: break;
         }
     }
@@ -1317,8 +1324,13 @@ Any sbxToUnoValue( SbxVariable* pVar, const Type& rType, Property* pUnoProperty
                         }
                         else if( rType == ::getCppuType( (oleautomation::Currency*)0 ) )
                         {
-                            // assumes per previous code that ole Currency is Int64
-                            aRetVal <<= (sal_Int64)( pVar->GetInt64() );
+                            SbxINT64 aInt64 = pVar->GetCurrency();
+                            oleautomation::Currency aCurrency;
+                            sal_Int64& rnValue64 = aCurrency.Value;
+                            rnValue64 = aInt64.nHigh;
+                            rnValue64 <<= 32;
+                            rnValue64 |= aInt64.nLow;
+                            aRetVal <<= aCurrency;
                             break;
                         }
                         else if( rType == ::getCppuType( (oleautomation::Date*)0 ) )
@@ -1351,9 +1363,11 @@ 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 );
@@ -1874,6 +1888,8 @@ 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 36af58b..2b82281 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)
+RTLFUNC(CCur)  // JSM
 {
     (void)pBasic;
     (void)bWrite;
 
-    sal_Int64 nCur = 0;
+    SbxINT64 nCur;
     if ( rPar.Count() == 2 )
     {
         SbxVariable *pSbxVariable = rPar.Get(1);
@@ -175,7 +175,7 @@ RTLFUNC(CCur)
     rPar.Get(0)->PutCurrency( nCur );
 }
 
-RTLFUNC(CDec)
+RTLFUNC(CDec)  // JSM
 {
     (void)pBasic;
     (void)bWrite;
@@ -881,16 +881,13 @@ 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;
-        case SbxSALINT64:
-        case SbxSALUINT64:
-                if( bIsVariant )
-                    *pStrm << (USHORT)SbxSALINT64; // VarType Id
-                *pStrm << (sal_uInt64)rVar.GetInt64();
-                break;
+
         case SbxSINGLE:
                 if( bIsVariant )
                     *pStrm << (USHORT)eType; // VarType Id
@@ -986,20 +983,15 @@ BOOL lcl_ReadSbxVariable( SbxVariable& rVar, SvStream* pStrm,
 
         case SbxLONG:
         case SbxULONG:
+        case SbxLONG64:
+        case SbxULONG64:
                 {
                 INT32 aInt;
                 *pStrm >> aInt;
                 rVar.PutLong( aInt );
                 }
                 break;
-        case SbxSALINT64:
-        case SbxSALUINT64:
-                {
-                sal_uInt32 aInt;
-                *pStrm >> aInt;
-                rVar.PutInt64( (sal_Int64)aInt );
-                }
-                break;
+
         case SbxSINGLE:
                 {
                 float nS;
@@ -1362,8 +1354,8 @@ RTLFUNC(TypeLen)
             case SbxDOUBLE:
             case SbxCURRENCY:
             case SbxDATE:
-            case SbxSALINT64:
-            case SbxSALUINT64:
+            case SbxLONG64:
+            case SbxULONG64:
                 nLen = 8;
                 break;
 
diff --git a/basic/source/sbx/makefile.mk b/basic/source/sbx/makefile.mk
index 9b76f96..cc20080 100644
--- a/basic/source/sbx/makefile.mk
+++ b/basic/source/sbx/makefile.mk
@@ -58,6 +58,7 @@ 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 5c6657b..1f7d510 100644
--- a/basic/source/sbx/sbxbool.cxx
+++ b/basic/source/sbx/sbxbool.cxx
@@ -71,10 +71,14 @@ 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:
@@ -135,11 +139,16 @@ 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;
     }
@@ -171,11 +180,15 @@ void ImpPutBool( SbxValues* p, INT16 n )
         case SbxDATE:
         case SbxDOUBLE:
             p->nDouble = n; break;
-        case SbxCURRENCY:
         case SbxSALINT64:
-            p->nInt64 = (sal_Int64) n; break;
+            p->nInt64 = n; break;
         case SbxSALUINT64:
-            p->uInt64 = (sal_uInt64) n; break;
+            p->uInt64 = n; break;
+        case SbxULONG64:
+            p->nULong64.Set( (UINT32)n ); break;
+        case SbxLONG64:
+        case SbxCURRENCY:
+            p->nLong64.Set( (INT32)n ); break;
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             ImpCreateDecimal( p )->setInt( (INT16)n );
@@ -218,11 +231,16 @@ void ImpPutBool( SbxValues* p, INT16 n )
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             *p->pDouble = n; break;
-        case SbxBYREF | SbxCURRENCY:
         case SbxBYREF | SbxSALINT64:
-            *p->pnInt64 = (sal_Int64) n; break;
+            *p->pnInt64 = n; break;
         case SbxBYREF | SbxSALUINT64:
-            *p->puInt64 = (sal_uInt64) n; break;
+            *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;
+
         default:
             SbxBase::SetError( SbxERR_CONVERSION );
     }
diff --git a/basic/source/sbx/sbxbyte.cxx b/basic/source/sbx/sbxbyte.cxx
index 2c194f5..0151f59 100644
--- a/basic/source/sbx/sbxbyte.cxx
+++ b/basic/source/sbx/sbxbyte.cxx
@@ -95,13 +95,8 @@ start:
             else
                 nRes = (BYTE) p->nULong;
             break;
-        case SbxCURRENCY:
         case SbxSALINT64:
-        {
-            sal_Int64 val = p->nInt64;
-            if ( p->eType == SbxCURRENCY )
-                val = val / CURRENCY_FACTOR;
-            if( val > SbxMAXBYTE )
+            if( p->nInt64 > SbxMAXBYTE )
             {
                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXBYTE;
             }
@@ -110,9 +105,8 @@ start:
                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = 0;
             }
             else
-                nRes = (BYTE) val;
+                nRes = (BYTE) p->nInt64;
             break;
-        }
         case SbxSALUINT64:
             if( p->uInt64 > SbxMAXBYTE )
             {
@@ -135,11 +129,20 @@ start:
             break;
         case SbxDATE:
         case SbxDOUBLE:
+        case SbxLONG64:
+        case SbxULONG64:
+        case SbxCURRENCY:
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             {
             double dVal;
-            if( p->eType == SbxDECIMAL )
+            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 )
             {
                 dVal = 0.0;
                 if( p->pDecimal )
@@ -216,7 +219,11 @@ 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:
@@ -252,12 +259,16 @@ 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 );
@@ -301,12 +312,16 @@ void ImpPutByte( SbxValues* p, BYTE n )
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             *p->pDouble = n; break;
-        case SbxBYREF | SbxCURRENCY:
-            p->nInt64 = n * CURRENCY_FACTOR; break;
+        case SbxBYREF | SbxULONG64:
+            *p->pULong64 = ImpDoubleToUINT64( (double)n ); break;
+        case SbxBYREF | SbxLONG64:
+            *p->pLong64 = ImpDoubleToINT64( (double)n ); 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 322f95c..ab0aff6 100644
--- a/basic/source/sbx/sbxchar.cxx
+++ b/basic/source/sbx/sbxchar.cxx
@@ -81,15 +81,8 @@ start:
             else
                 nRes = (xub_Unicode) p->nULong;
             break;
-        case SbxCURRENCY:
         case SbxSALINT64:
-        {
-            sal_Int64 val = p->nInt64;
-
-            if ( p->eType == SbxCURRENCY )
-                val = val / CURRENCY_FACTOR;
-
-            if( val > SbxMAXCHAR )
+            if( p->nInt64 > SbxMAXCHAR )
             {
                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXCHAR;
             }
@@ -98,9 +91,8 @@ start:
                 SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMINCHAR;
             }
             else
-                nRes = (xub_Unicode) val;
+                nRes = (xub_Unicode) p->nInt64;
             break;
-        }
         case SbxSALUINT64:
             if( p->uInt64 > SbxMAXCHAR )
             {
@@ -123,11 +115,20 @@ start:
             break;
         case SbxDATE:
         case SbxDOUBLE:
+        case SbxLONG64:
+        case SbxULONG64:
+        case SbxCURRENCY:
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             {
             double dVal;
-            if( p->eType == SbxDECIMAL )
+            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 )
             {
                 dVal = 0.0;
                 if( p->pDecimal )
@@ -201,7 +202,11 @@ 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:
@@ -234,12 +239,16 @@ 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;
@@ -292,12 +301,16 @@ 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 8f42345..66ce3fb 100644
--- a/basic/source/sbx/sbxconv.hxx
+++ b/basic/source/sbx/sbxconv.hxx
@@ -47,15 +47,13 @@ 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
@@ -73,18 +71,37 @@ 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
 
-sal_Int64   ImpGetCurrency( const SbxValues* );
-void        ImpPutCurrency( SbxValues*, const sal_Int64 );
+SbxUINT64 ImpDoubleToUINT64( double );
+double 	  ImpUINT64ToDouble( const SbxUINT64& );
+SbxINT64  ImpDoubleToINT64( double );
+double 	  ImpINT64ToDouble( const SbxINT64& );
 
-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);
-                    }
+#if TRUE
+INT32	  ImpGetCurrLong( const SbxValues* );
+void      ImpPutCurrLong( SbxValues*, INT32 );
+INT32 	  ImpDoubleToCurrLong( double );
+double 	  ImpCurrLongToDouble( INT32 );
+#endif
 
-inline  double 	    ImpCurrencyToDouble( const sal_Int64 r )
-                    { return (double)r / (double)CURRENCY_FACTOR; }
+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; }
 
 
 // SBXDEC.CXX
@@ -107,7 +124,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* );
@@ -126,9 +143,9 @@ void    ImpPutULong( SbxValues*, UINT32 );
 // SBXBOOL.CXX
 
 enum SbxBOOL ImpGetBool( const SbxValues* );
-void         ImpPutBool( SbxValues*, INT16 );
+void    ImpPutBool( SbxValues*, INT16 );
 
-// ByteArray <--> String
+// ByteArry <--> 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 9278ada..0057d6f 100644
--- a/basic/source/sbx/sbxcurr.cxx
+++ b/basic/source/sbx/sbxcurr.cxx
@@ -29,290 +29,101 @@
 // 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
 
-#include <basic/sbx.hxx>
+#define _TLBIGINT_INT64
+#include <tools/bigint.hxx>
+
 #include <basic/sbxvar.hxx>
 #include "sbxconv.hxx"
 
+static ::rtl::OUString   ImpCurrencyToString( const SbxINT64& );
+static SbxINT64 ImpStringToCurrency( const ::rtl::OUString& );
 
-static rtl::OUString ImpCurrencyToString( const sal_Int64 &rVal )
-{
-    bool isNeg = ( rVal < 0 );
-    sal_Int64 absVal = isNeg ? -rVal : rVal;
-
-    SvtSysLocale aSysLocale;
-    sal_Unicode cDecimalSep = '.';
-#if MAYBEFUTURE
-    sal_Unicode cThousandSep = ',';
-    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 MAYBEFUTURE
-        if ( initialLen > 5 )
-        {
-            sal_Int32 nThouSeperators = ( initialLen - 5 ) / 3;
-            nCapacity += nThouSeperators;
-        }
-#endif
-    }
-
-    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 MAYBEFUTURE
-        if ( nDigitCount > 4 && ! ( ( nDigitCount - 4  ) % 3) )
-            aBuf.setCharAt( nInsertIndex--, cThousandSep );
-#endif
-        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 )
-{
-
-    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];
-
-        // 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
-
-    // 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();
-
-    // normalise string number by removeing thousands & decimal point seperators
-    rtl::OUStringBuffer sNormalisedNumString( sTmp.getLength() +  nFractDigit );
-
-    if ( *p == '-'  || *p == '+' )
-        sNormalisedNumString.append( *p );
-
-    while ( ( *p >= '0' && *p <= '9' ) )
-    {
-        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 )
-    {
-        p++;
-        while( nFractDigit && *p >= '0' && *p <= '9' )
-        {
-            sNormalisedNumString.append( *p++ );
-            nFractDigit--;
-        }
-    }
-    // can we raise error here ? ( previous behaviour was more forgiving )
-    // so... not sure that could bread existing code, lets see if anyone
-    // complains.
-
-    if ( p != sTmp.getStr() + sTmp.getLength() )
-        SbxBase::SetError( SbxERR_CONVERSION );
-    while( nFractDigit )
-    {
-        sNormalisedNumString.append( '0' );
-        nFractDigit--;
-    }
-
-    sal_Int64 result = sNormalisedNumString.makeStringAndClear().toInt64();
-    return result;
-}
-
-
-sal_Int64 ImpGetCurrency( const SbxValues* p )
+SbxINT64 ImpGetCurrency( const SbxValues* p )
 {
-    SbxValues   aTmp;
-    sal_Int64  nRes;
+    SbxValues aTmp;
+    SbxINT64 nRes;
 start:
     switch( +p->eType )
     {
-        case SbxERROR:
         case SbxNULL:
             SbxBase::SetError( SbxERR_CONVERSION );
-            nRes = 0; break;
         case SbxEMPTY:
-            nRes = 0; break;
-        case SbxCURRENCY:
-            nRes = p->nInt64; break;
-        case SbxBYTE:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nByte);
-            break;
+            nRes.SetNull(); break;
         case SbxCHAR:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->pChar);
-            break;
-        case SbxBOOL:
+            nRes = ImpDoubleToCurrency( (double)p->nChar ); break;
+        case SbxBYTE:
+            nRes = ImpDoubleToCurrency( (double)p->nByte ); break;
         case SbxINTEGER:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nInteger);
-            break;
+        case SbxBOOL:
+            nRes = ImpDoubleToCurrency( (double)p->nInteger ); break;
+        case SbxERROR:
         case SbxUSHORT:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nUShort);
-            break;
+            nRes = ImpDoubleToCurrency( (double)p->nUShort ); break;
+        case SbxCURRENCY:
+            nRes = p->nLong64; break;
         case SbxLONG:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nLong);
+            nRes = ImpDoubleToCurrency( (double)p->nLong );
             break;
         case SbxULONG:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(p->nULong);
+            nRes = ImpDoubleToCurrency( (double)p->nULong );
             break;
-
         case SbxSALINT64:
-        {
-            nRes = p->nInt64 * CURRENCY_FACTOR; break;
-            if ( nRes > SbxMAXSALINT64 )
-            {
-                SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXSALINT64;
-            }
-        }
+            nRes = ImpDoubleToCurrency( (double)p->nInt64 );
+            break;
         case SbxSALUINT64:
-            nRes = p->nInt64 * CURRENCY_FACTOR; break;
-            if ( nRes > SbxMAXSALINT64 )
-            {
-                SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXSALINT64;
-            }
-            else if ( nRes < SbxMINSALINT64 )
-            {
-                SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMINSALINT64;
-            }
+            nRes = ImpDoubleToCurrency( ImpSalUInt64ToDouble( p->uInt64 ) );
             break;
-//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 )
+            if( p->nSingle > SbxMAXCURR )
             {
-                nRes = SAL_MAX_INT64;
-                if( p->nSingle * CURRENCY_FACTOR - 0.5 < (float)SAL_MIN_INT64 )
-                    nRes = SAL_MIN_INT64;
-                SbxBase::SetError( SbxERR_OVERFLOW );
-                break;
+                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMax();
             }
-            nRes = ImpDoubleToCurrency( (double)p->nSingle );
+            else if( p->nSingle < SbxMINCURR )
+            {
+                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMin();
+            }
+            else
+                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 )
+            if( p->nDouble > SbxMAXCURR )
+            {
+                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMax();
+            }
+            else if( p->nDouble < SbxMINCURR )
             {
-                nRes = SAL_MAX_INT64;
-                if( p->nDouble * CURRENCY_FACTOR - 0.5 < (double)SAL_MIN_INT64 )
-                    nRes = SAL_MIN_INT64;
-                SbxBase::SetError( SbxERR_OVERFLOW );
-                break;
+                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMin();
             }
-            nRes = ImpDoubleToCurrency( p->nDouble );
+            else
+                nRes = ImpDoubleToCurrency( p->nDouble );
             break;
-
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             {
             double d = 0.0;
             if( p->pDecimal )
                 p->pDecimal->getDouble( d );
-            nRes = ImpDoubleToCurrency( d );
+            if( d > SbxMAXCURR )
+            {
+                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMax();
+            }
+            else if( d < SbxMINCURR )
+            {
+                SbxBase::SetError( SbxERR_OVERFLOW ); nRes.SetMin();
+            }
+            else
+                nRes = ImpDoubleToCurrency( d );
             break;
             }
-
-
         case SbxBYREF | SbxSTRING:
         case SbxSTRING:
         case SbxLPSTR:
             if( !p->pOUString )
-                nRes=0;
+                nRes.SetNull();
             else
                 nRes = ImpStringToCurrency( *p->pOUString );
             break;
@@ -323,26 +134,23 @@ start:
                 nRes = pVal->GetCurrency();
             else
             {
-                SbxBase::SetError( SbxERR_NO_OBJECT );
-                nRes=0;
+                SbxBase::SetError( SbxERR_NO_OBJECT ); nRes.SetNull();
             }
             break;
         }
 
         case SbxBYREF | SbxCHAR:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(*p->pChar);
-            break;
+            nRes = ImpDoubleToCurrency( (double)*p->pChar ); break;
         case SbxBYREF | SbxBYTE:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(*p->pByte);
-            break;
-        case SbxBYREF | SbxBOOL:
+            nRes = ImpDoubleToCurrency( (double)*p->pByte ); break;
         case SbxBYREF | SbxINTEGER:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(*p->pInteger);
-            break;
+        case SbxBYREF | SbxBOOL:
+            nRes = ImpDoubleToCurrency( (double)*p->pInteger ); break;
         case SbxBYREF | SbxERROR:
         case SbxBYREF | SbxUSHORT:
-            nRes = (sal_Int64)CURRENCY_FACTOR * (sal_Int64)(*p->pUShort);
-            break;
+            nRes = ImpDoubleToCurrency( (double)*p->pUShort ); break;
+        case SbxBYREF | SbxCURRENCY:
+            nRes = *p->pLong64; break;
 
         // from here on had to be tested
         case SbxBYREF | SbxLONG:
@@ -354,25 +162,23 @@ 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 & ~SbxBYREF );
+            aTmp.eType = SbxDataType( p->eType & 0x0FFF );
             p = &aTmp; goto start;
 
         default:
-            SbxBase::SetError( SbxERR_CONVERSION );
-            nRes=0;
+            SbxBase::SetError( SbxERR_CONVERSION ); nRes.SetNull();
     }
     return nRes;
 }
 
-
-void ImpPutCurrency( SbxValues* p, const sal_Int64 r )
+void ImpPutCurrency( SbxValues* p, const SbxINT64 &r )
 {
+    double dVal = ImpCurrencyToDouble( r );
     SbxValues aTmp;
 start:
     switch( +p->eType )
@@ -398,23 +204,21 @@ start:
 
         // from here no longer
         case SbxSINGLE:
-            p->nSingle = (float)( r / CURRENCY_FACTOR ); break;
+            p->nSingle = (float)dVal; break;
         case SbxDATE:
         case SbxDOUBLE:
-            p->nDouble =  ImpCurrencyToDouble( r ); break;
-        case SbxSALUINT64:
-            p->uInt64 = r / CURRENCY_FACTOR; break;
+            p->nDouble = dVal; break;
         case SbxSALINT64:
-            p->nInt64 = r / CURRENCY_FACTOR; break;
-
+            p->nInt64 = ImpDoubleToSalInt64( dVal ); break;
+        case SbxSALUINT64:
+            p->uInt64 = ImpDoubleToSalUInt64( dVal ); break;
         case SbxCURRENCY:
-            p->nInt64 = r; break;
-
+            p->nLong64 = r; break;
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
             {
             SbxDecimal* pDec = ImpCreateDecimal( p );
-            if( !pDec->setDouble( ImpCurrencyToDouble( r ) / CURRENCY_FACTOR ) )
+            if( !pDec->setDouble( dVal ) )
                 SbxBase::SetError( SbxERR_OVERFLOW ); 
             break;
             }
@@ -422,7 +226,7 @@ start:
         case SbxSTRING:
         case SbxLPSTR:
             if( !p->pOUString )
-                p->pOUString = new rtl::OUString;
+                p->pOUString = new ::rtl::OUString;
 
             *p->pOUString = ImpCurrencyToString( r );
             break;
@@ -436,100 +240,158 @@ start:
             break;
         }
         case SbxBYREF | SbxCHAR:
-        {
-            sal_Int64 val = r / CURRENCY_FACTOR;
-            if( val > SbxMAXCHAR )
+            if( dVal > SbxMAXCHAR )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXCHAR;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXCHAR;
             }
-            else if( val < SbxMINCHAR )
+            else if( dVal < SbxMINCHAR )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMINCHAR;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMINCHAR;
             }
-            *p->pChar = (sal_Unicode) val; break;
-        }
+            *p->pChar = (xub_Unicode) dVal; break;
         case SbxBYREF | SbxBYTE:
-        {
-            sal_Int64 val = r / CURRENCY_FACTOR;
-            if( val > SbxMAXBYTE )
+            if( dVal > SbxMAXBYTE )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXBYTE;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXBYTE;
             }
-            else if( val < 0 )
+            else if( dVal < 0 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = 0;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = 0;
             }
-            *p->pByte = (BYTE) val; break;
-        }
+            *p->pByte = (BYTE) dVal; break;
         case SbxBYREF | SbxINTEGER:
         case SbxBYREF | SbxBOOL:
-        {
-            sal_Int64 val = r / CURRENCY_FACTOR;
-            if( r > SbxMAXINT )
+            if( dVal > SbxMAXINT )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXINT;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXINT;
             }
-            else if( r < SbxMININT )
+            else if( dVal < SbxMININT )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMININT;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMININT;
             }
-            *p->pInteger = (INT16) r; break;
-        }
+            *p->pInteger = (INT16) dVal; break;
         case SbxBYREF | SbxERROR:
         case SbxBYREF | SbxUSHORT:
-        {
-            sal_Int64 val = r / CURRENCY_FACTOR;
-            if( val > SbxMAXUINT )
+            if( dVal > SbxMAXUINT )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXUINT;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXUINT;
             }
-            else if( val < 0 )
+            else if( dVal < 0 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = 0;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = 0;
             }
-            *p->pUShort = (UINT16) val; break;
-        }
+            *p->pUShort = (UINT16) dVal; break;
         case SbxBYREF | SbxLONG:
-        {
-            sal_Int64 val = r / CURRENCY_FACTOR;
-            if( val > SbxMAXLNG )
+            if( dVal > SbxMAXLNG )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXLNG;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXLNG;
             }
-            else if( val < SbxMINLNG )
+            else if( dVal < SbxMINLNG )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMINLNG;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMINLNG;
             }
-            *p->pLong = (INT32) val; break;
-        }
+            *p->pLong = (INT32) dVal; break;
         case SbxBYREF | SbxULONG:
-        {
-            sal_Int64 val = r / CURRENCY_FACTOR;
-            if( val > SbxMAXULNG )
+            if( dVal > SbxMAXULNG )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = SbxMAXULNG;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = SbxMAXULNG;
             }
-            else if( val < 0 )
+            else if( dVal < 0 )
             {
-                SbxBase::SetError( SbxERR_OVERFLOW ); val = 0;
+                SbxBase::SetError( SbxERR_OVERFLOW ); dVal = 0;
             }
-            *p->pULong = (UINT32) val;
-            break;
-        }
-        case SbxBYREF | SbxCURRENCY:
-            *p->pnInt64 = r; break;
+            *p->pULong = (UINT32) dVal; break;
         case SbxBYREF | SbxSALINT64:
-            *p->pnInt64 = r / CURRENCY_FACTOR; break;
+            *p->pnInt64 = ImpDoubleToSalInt64( dVal ); break;
         case SbxBYREF | SbxSALUINT64:
-            *p->puInt64 = (sal_uInt64)r / CURRENCY_FACTOR; break;
+            *p->puInt64 = ImpDoubleToSalUInt64( dVal ); break;
         case SbxBYREF | SbxSINGLE:
-            p->nSingle = (float)( r / CURRENCY_FACTOR ); break;
+            *p->pSingle = (float) dVal; break;
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
-            *p->pDouble = ImpCurrencyToDouble( r ); break;
+            *p->pDouble = (double) dVal; break;
+        case SbxBYREF | SbxCURRENCY:
+            *p->pLong64 = 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)'-' );
+    aString += aInt.GetString();
+    aString += ::rtl::OUString( (sal_Unicode)'.' );
+    aString += aFrac.GetString().GetBuffer()+1;
+    return aString;
+}
+
+static SbxINT64 ImpStringToCurrency( const ::rtl::OUString &r )
+{
+    int nDec = 4;
+    String aStr;
+    const sal_Unicode* p = r.getStr();
+
+    if( *p == '-' )
+        aStr += *p++;
+
+    while( *p >= '0' && *p <= '9' ) {
+        aStr += *p++;
+        if( *p == ',' )
+            p++;
+    }
+
+    if( *p == '.' ) {
+        p++;
+        while( nDec && *p >= '0' && *p <= '9' ) {
+            aStr += *p++;
+            nDec--;
+        }
+    }
+    while( nDec ) {
+        aStr += '0';
+        nDec--;
+    }
+
+    BigInt aBig( aStr );
+    SbxINT64 nRes;
+    aBig.INT64( &nRes );
+    return nRes;
+}
+
+double ImpINT64ToDouble( const SbxINT64 &r )
+{ return (double)r.nHigh*(double)4294967296.0 + (double)r.nLow; }
+
+SbxINT64 ImpDoubleToINT64( double d )
+{
+    SbxINT64 nRes;
+    nRes.Set( d );
+    return nRes;
+}
+
+double ImpUINT64ToDouble( const SbxUINT64 &r )
+{ return (double)r.nHigh*(double)4294967296.0 + (double)r.nLow; }
+
+SbxUINT64 ImpDoubleToUINT64( double d )
+{
+    SbxUINT64 nRes;
+    nRes.Set( d );
+    return nRes;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basic/source/sbx/sbxdate.cxx b/basic/source/sbx/sbxdate.cxx
index 3638b49..ed151a7 100644
--- a/basic/source/sbx/sbxdate.cxx
+++ b/basic/source/sbx/sbxdate.cxx
@@ -67,8 +67,12 @@ double ImpGetDate( const SbxValues* p )
         case SbxDATE:
         case SbxDOUBLE:
             nRes = p->nDouble; break;
+        case SbxULONG64:
+            nRes = ImpUINT64ToDouble( p->nULong64 ); break;
+        case SbxLONG64:
+            nRes = ImpINT64ToDouble( p->nLong64 ); break;
         case SbxCURRENCY:
-            nRes = ImpCurrencyToDouble( p->nInt64 ); break;
+            nRes = ImpCurrencyToDouble( p->nLong64 ); break;
         case SbxSALINT64:
             nRes = static_cast< double >(p->nInt64); break;
         case SbxSALUINT64:
@@ -174,8 +178,12 @@ double ImpGetDate( const SbxValues* p )
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             nRes = *p->pDouble; break;
+        case SbxBYREF | SbxULONG64:
+            nRes = ImpUINT64ToDouble( *p->pULong64 ); break;
+        case SbxBYREF | SbxLONG64:
+            nRes = ImpINT64ToDouble( *p->pLong64 ); break;
         case SbxBYREF | SbxCURRENCY:
-            nRes = ImpCurrencyToDouble( *p->pnInt64 ); break;
+            nRes = ImpCurrencyToDouble( *p->pLong64 ); break;
         case SbxBYREF | SbxSALINT64:
             nRes = static_cast< double >(*p->pnInt64); break;
         case SbxBYREF | SbxSALUINT64:
@@ -215,7 +223,11 @@ start:
             aTmp.pUShort = &p->nUShort; goto direct;
         case SbxSINGLE:
             aTmp.pSingle = &p->nSingle; goto direct;
+        case SbxULONG64:
+            aTmp.pULong64 = &p->nULong64; goto direct;
+        case SbxLONG64:
         case SbxCURRENCY:
+            aTmp.pLong64 = &p->nLong64; goto direct;
         case SbxSALINT64:
             aTmp.pnInt64 = &p->nInt64; goto direct;
         case SbxSALUINT64:
@@ -394,7 +406,7 @@ start:
             {
                 SbxBase::SetError( SbxERR_OVERFLOW ); n = SbxMINCURR;
             }
-            *p->pnInt64 = ImpDoubleToCurrency( n ); break;
+            *p->pLong64 = ImpDoubleToCurrency( n ); break;
 
         default:
             SbxBase::SetError( SbxERR_CONVERSION );
diff --git a/basic/source/sbx/sbxdbl.cxx b/basic/source/sbx/sbxdbl.cxx
index 045349a..32d4a89 100644
--- a/basic/source/sbx/sbxdbl.cxx
+++ b/basic/source/sbx/sbxdbl.cxx
@@ -62,7 +62,7 @@ double ImpGetDouble( const SbxValues* p )
         case SbxDOUBLE:
             nRes = p->nDouble; break;
         case SbxCURRENCY:
-            nRes = ImpCurrencyToDouble( p->nInt64 ); break;
+            nRes = ImpCurrencyToDouble( p->nLong64 ); break;
         case SbxSALINT64:
             nRes = static_cast< double >(p->nInt64); break;
         case SbxSALUINT64:
@@ -129,7 +129,7 @@ double ImpGetDouble( const SbxValues* p )
         case SbxBYREF | SbxDOUBLE:
             nRes = *p->pDouble; break;
         case SbxBYREF | SbxCURRENCY:
-            nRes = ImpCurrencyToDouble( *p->pnInt64 ); break;
+            nRes = ImpCurrencyToDouble( *p->pLong64 ); break;
         case SbxBYREF | SbxSALINT64:
             nRes = static_cast< double >(*p->pnInt64); break;
         case SbxBYREF | SbxSALUINT64:
@@ -156,6 +156,7 @@ start:
         case SbxBOOL:
             aTmp.pInteger = &p->nInteger; goto direct;
         case SbxLONG:
+        case SbxCURRENCY:
             aTmp.pLong = &p->nLong; goto direct;
         case SbxULONG:
             aTmp.pULong = &p->nULong; goto direct;
@@ -176,18 +177,6 @@ start:
             aTmp.eType = SbxDataType( p->eType | SbxBYREF );
             p = &aTmp; goto start;
 
-        case SbxCURRENCY:
-            if( n > SbxMAXCURR )
-            {
-                SbxBase::SetError( SbxERR_OVERFLOW ); n = SbxMAXCURR;
-            }
-            else if( n < SbxMINCURR )
-            {
-                SbxBase::SetError( SbxERR_OVERFLOW ); n = SbxMINCURR;
-            }
-            p->nInt64 = ImpDoubleToCurrency( n );
-            break;
-
             // from here on no longer
         case SbxSALINT64:
             p->nInt64 = ImpDoubleToSalInt64( n ); break;
@@ -309,7 +298,7 @@ start:
             {
                 SbxBase::SetError( SbxERR_OVERFLOW ); n = SbxMINCURR;
             }
-            *p->pnInt64 = ImpDoubleToCurrency( n ); break;
+            *p->pLong64 = ImpDoubleToCurrency( n ); break;
 
         default:
             SbxBase::SetError( SbxERR_CONVERSION );
diff --git a/basic/source/sbx/sbxdec.cxx b/basic/source/sbx/sbxdec.cxx
index 1121ec7..f33e366 100644
--- a/basic/source/sbx/sbxdec.cxx
+++ b/basic/source/sbx/sbxdec.cxx
@@ -36,11 +36,14 @@
 #include <com/sun/star/bridge/oleautomation/Decimal.hpp>
 
 
+// int GnDecCounter = 0;
+
 // Implementation SbxDecimal
 SbxDecimal::SbxDecimal( void )
 {
     setInt( 0 );
     mnRefCount = 0;
+    // GnDecCounter++;
 }
 
 SbxDecimal::SbxDecimal( const SbxDecimal& rDec )
@@ -51,6 +54,7 @@ SbxDecimal::SbxDecimal( const SbxDecimal& rDec )
     (void)rDec;
 #endif
     mnRefCount = 0;
+    // GnDecCounter++;
 }
 
 SbxDecimal::SbxDecimal
@@ -490,32 +494,38 @@ start:
             if( !pnDecRes->setSingle( p->nSingle ) )
                 SbxBase::SetError( SbxERR_OVERFLOW );
             break;
-        case SbxCURRENCY:
-            {
-                if( !pnDecRes->setDouble( ImpCurrencyToDouble( p->nInt64 ) ) )
-                    SbxBase::SetError( SbxERR_OVERFLOW );
-                break;
-            }
         case SbxSALINT64:
             {
-                if( !pnDecRes->setDouble( (double)p->nInt64 ) )
-                    SbxBase::SetError( SbxERR_OVERFLOW );
+                double d = (double)p->nInt64;
+                pnDecRes->setDouble( d );
                 break;
             }
         case SbxSALUINT64:
             {
-                if( !pnDecRes->setDouble( (double)p->uInt64 ) )
-                    SbxBase::SetError( SbxERR_OVERFLOW );
+                double d = ImpSalUInt64ToDouble( p->uInt64 );
+                pnDecRes->setDouble( d );
                 break;
             }
         case SbxDATE:
         case SbxDOUBLE:
-        {
-            double dVal = p->nDouble;
+        case SbxLONG64:
+        case SbxULONG64:
+        case SbxCURRENCY:
+            {
+            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
+                dVal = p->nDouble;
+
             if( !pnDecRes->setDouble( dVal ) )
                 SbxBase::SetError( SbxERR_OVERFLOW );
             break;
-        }
+            }
         case SbxLPSTR:
         case SbxSTRING:
         case SbxBYREF | SbxSTRING:
@@ -554,7 +564,11 @@ 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:
@@ -594,17 +608,17 @@ start:
         case SbxERROR:
         case SbxUSHORT:
             aTmp.pUShort = &p->nUShort; goto direct;
+        case SbxSALUINT64:
+            aTmp.puInt64 = &p->uInt64; goto direct;
         case SbxINTEGER:
         case SbxBOOL:
             aTmp.pInteger = &p->nInteger; goto direct;
         case SbxLONG:
             aTmp.pLong = &p->nLong; goto direct;
-        case SbxCURRENCY:
         case SbxSALINT64:
             aTmp.pnInt64 = &p->nInt64; goto direct;
-        case SbxSALUINT64:
-            aTmp.puInt64 = &p->uInt64; goto direct;
-
+        case SbxCURRENCY:
+            aTmp.pLong64 = &p->nLong64; goto direct;
         direct:
             aTmp.eType = SbxDataType( p->eType | SbxBYREF );
             p = &aTmp; goto start;
@@ -616,6 +630,8 @@ start:
             if( pDec != p->pDecimal )
             {
                 releaseDecimalPtr( p->pDecimal );
+                // if( p->pDecimal )
+                    // p->pDecimal->ReleaseRef();
                 p->pDecimal = pDec;
                 if( pDec )
                     pDec->addRef();
@@ -637,6 +653,20 @@ start:
             p->nDouble = d;
             break;
         }
+        case SbxULONG64:
+        {
+            double d;
+            pDec->getDouble( d );
+            p->nULong64 = ImpDoubleToUINT64( d );
+            break;
+        }
+        case SbxLONG64:
+        {
+            double d;
+            pDec->getDouble( d );
+            p->nLong64 = ImpDoubleToINT64( d );
+            break;
+        }
 
         case SbxLPSTR:
         case SbxSTRING:
@@ -701,13 +731,6 @@ start:
                 *p->pULong = 0;
             }
             break;
-        case SbxBYREF | SbxCURRENCY:
-            double d;
-            if( !pDec->getDouble( d ) )
-                SbxBase::SetError( SbxERR_OVERFLOW );
-            pDec->getDouble( d );
-            *p->pnInt64 = ImpDoubleToCurrency( d );
-            break;
         case SbxBYREF | SbxSALINT64:
             {
             double d;
@@ -732,8 +755,8 @@ start:
                 SbxBase::SetError( SbxERR_OVERFLOW ); 
                 *p->pSingle = 0;
             }
-            *p->pSingle = (float) n;
             break;
+            // *p->pSingle = (float) n; break;
         case SbxBYREF | SbxDATE:
         case SbxBYREF | SbxDOUBLE:
             if( !pDec->getDouble( *p->pDouble ) )
@@ -742,6 +765,27 @@ start:
                 *p->pDouble = 0;
             }
             break;
+        case SbxBYREF | SbxULONG64:
+        {
+            double d;
+            pDec->getDouble( d );
+            *p->pULong64 = ImpDoubleToUINT64( d );
+            break;
+        }
+        case SbxBYREF | SbxLONG64:
+        {
+            double d;
+            pDec->getDouble( d );
+            *p->pLong64 = ImpDoubleToINT64( d );
+            break;
+        }
+        case SbxBYREF | SbxCURRENCY:
+        {
+            double d;
+            pDec->getDouble( d );
+            *p->pLong64 = ImpDoubleToCurrency( d );
+            break;
+        }
 
         default:
             SbxBase::SetError( SbxERR_CONVERSION );
diff --git a/basic/source/sbx/sbxint.cxx b/basic/source/sbx/sbxint.cxx
index d73bc57..1bf1836 100644
--- a/basic/source/sbx/sbxint.cxx
+++ b/basic/source/sbx/sbxint.cxx
@@ -96,22 +96,6 @@ start:
             else
                 nRes = (INT16) ImpRound( p->nSingle );
             break;
-        case SbxCURRENCY:
-            {
-                sal_Int64 tstVal = (sal_Int64) p->nInt64 / (sal_Int64) CURRENCY_FACTOR;
-
-                if( tstVal > SbxMAXINT )
-                {
-                    SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMAXINT;
-                }
-                else if( tstVal  < SbxMININT )
-                {
-                    SbxBase::SetError( SbxERR_OVERFLOW ); nRes = SbxMININT;
-                }
-                else
-                    nRes = (INT16) (tstVal);
-                break;
-            }
         case SbxSALINT64:
             if( p->nInt64 > SbxMAXINT )
             {
@@ -134,12 +118,22 @@ start:
             break;
         case SbxDATE:
         case SbxDOUBLE:
+        case SbxLONG64:
+        case SbxULONG64:
+        case SbxCURRENCY:
         case SbxDECIMAL:
         case SbxBYREF | SbxDECIMAL:
-        {
-            double dVal = 0.0;
-            if( p->eType == SbxDECIMAL )
             {
+            double dVal;

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list