Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


libo@pechlaner.at wrote:
I've made the new Functions BITAND, BITOR, BITXOR BITRSHIFT
and BITLSHIFT,, how declared in the ODF 1.2 specification. Can anyone
have a look on this Patches. 

Wonderful, great stuff - I have to apologize, the many whitespace
changes in the calc part of the patch are because of my substandard
mentoring - cleaned-up version of the first patch attached.

Cheers,

-- Thorsten
From 9536eed6be175243f9e55f5715d1fb784a6f5f4f Mon Sep 17 00:00:00 2001
From: Wolfgang Pechlaner <libo@pechlaner.at>
Date: Sun, 4 Sep 2011 14:40:25 +0200
Subject: [PATCH] BITxxx functions for ODF 1.2

---
 sc/inc/helpids.h                 |    5 +
 sc/qa/unit/ucalc.cxx             |    5 +
 sc/source/core/inc/interpre.hxx  |    5 +
 sc/source/core/tool/interpr1.cxx |  101 ++++++++++++++++++++++++
 sc/source/core/tool/interpr4.cxx |    5 +
 sc/source/ui/src/scfuncs.src     |  156 ++++++++++++++++++++++++++++++++++++++
 sc/util/hidother.src             |    5 +
 7 files changed, 282 insertions(+), 0 deletions(-)

diff --git a/sc/inc/helpids.h b/sc/inc/helpids.h
index c80dd1b..b04aa77 100644
--- a/sc/inc/helpids.h
+++ b/sc/inc/helpids.h
@@ -692,3 +692,8 @@
 #define HID_FUNC_UNICODE                                        "SC_HID_FUNC_UNICODE"
 #define HID_FUNC_UNICHAR                                        "SC_HID_FUNC_UNICHAR"
 #define HID_FUNC_NUMBERVALUE                                    "SC_HID_FUNC_NUMBERVALUE"
+#define HID_FUNC_BITAND                                                                    
"SC_HID_FUNC_BITAND"
+#define HID_FUNC_BITOR                                                             
"SC_HID_FUNC_BITOR"
+#define HID_FUNC_BITXOR                                                                    
"SC_HID_FUNC_BITXOR"
+#define HID_FUNC_BITLSHIFT                                                         
"SC_HID_FUNC_BITLSHIFT"
+#define HID_FUNC_BITRSHIFT                                                         
"SC_HID_FUNC_BITRSHIFT"
diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx
index 7430a60..533fbe2 100644
--- a/sc/qa/unit/ucalc.cxx
+++ b/sc/qa/unit/ucalc.cxx
@@ -1742,6 +1742,11 @@ void Test::testFunctionLists()
 
     const char* aLogical[] = {
         "AND",
+        "BITAND",
+        "BITLSHIFT",
+        "BITOR",
+        "BITRSHIFT",
+        "BITXOR",
         "FALSE",
         "IF",
         "NOT",
diff --git a/sc/source/core/inc/interpre.hxx b/sc/source/core/inc/interpre.hxx
index 27027d5..50881d6 100644
--- a/sc/source/core/inc/interpre.hxx
+++ b/sc/source/core/inc/interpre.hxx
@@ -412,6 +412,11 @@ void ScAnd();
 void ScOr();
 void ScNot();
 void ScNeg();
+void ScBitAnd();
+void ScBitOr();
+void ScBitXor();
+void ScBitRshift();
+void ScBitLshift();
 void ScPercentSign();
 void ScIntersect();
 void ScRangeFunc();
diff --git a/sc/source/core/tool/interpr1.cxx b/sc/source/core/tool/interpr1.cxx
index f581ac7..3921e0e 100644
--- a/sc/source/core/tool/interpr1.cxx
+++ b/sc/source/core/tool/interpr1.cxx
@@ -1391,6 +1391,107 @@ void ScInterpreter::ScNeg()
 }
 
 
+void ScInterpreter::ScBitAnd()
+{
+    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScBitAnd" );
+
+    if ( !MustHaveParamCount( GetByte(), 2 ) )
+      return;
+
+     double num1, num2;
+     num1 = GetDouble();
+     num2 = GetDouble();
+     if ((num1 > 281474976710655) or (num1 < 0) or
+         (num2 > 281474976710655) or (num2 < 0)) {
+        PushIllegalArgument();
+     }
+
+      PushDouble ((sal_uInt64) num1 & (sal_uInt64) num2);
+}
+
+
+void ScInterpreter::ScBitOr()
+{
+    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScBitOr" );
+
+      if ( !MustHaveParamCount( GetByte(), 2 ) )
+      return;
+
+    double num1, num2;
+    num1 = GetDouble();
+    num2 = GetDouble();
+    if ((num1 > 281474976710655) or (num1 < 0) or
+        (num2 > 281474976710655) or (num2 < 0)) {
+          PushIllegalArgument();
+    }
+
+    PushDouble ((sal_uInt64) num1 | (sal_uInt64) num2);
+}
+
+
+void ScInterpreter::ScBitXor()
+{
+    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScBitXor" );
+
+    if ( !MustHaveParamCount( GetByte(), 2 ) )
+      return;
+
+    double num1, num2;
+    num1 = GetDouble();
+    num2 = GetDouble();
+    if ((num1 > 281474976710655) or (num1 < 0) or
+        (num2 > 281474976710655) or (num2 < 0)) {
+         PushIllegalArgument();
+    }
+
+    PushDouble ((sal_uInt64) num1 ^ (sal_uInt64) num2);
+}
+
+
+void ScInterpreter::ScBitLshift()
+{
+    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScBitLshift" );
+
+    if ( !MustHaveParamCount( GetByte(), 2 ) )
+      return;
+
+    sal_uInt64 erg;
+    sal_Int32 ishift = GetDouble();
+    double num = GetDouble();
+        if ((num > 281474976710655) or (num < 0))  {
+            PushIllegalArgument();
+    }
+    if (ishift < 0) {
+      erg = (sal_uInt64) num >> -ishift;
+    } else {
+      erg = (sal_uInt64) num << ishift;
+    }
+    PushDouble (erg);
+}
+
+void ScInterpreter::ScBitRshift()
+{
+    RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScBitRshift" );
+
+    if ( !MustHaveParamCount( GetByte(), 2 ) )
+      return;
+    sal_uInt64 erg;
+    sal_Int32 ishift = GetDouble();
+    double num = GetDouble();
+        if ((num > 281474976710655) or (num < 0))  {
+          PushIllegalArgument();
+    }
+    if (ishift < 0) {
+      erg = (sal_uInt64) num << -ishift;
+    } else {
+      erg = (sal_uInt64) num >> ishift;
+    }
+    PushDouble (erg);
+}
+
+
+
+
 void ScInterpreter::ScPercentSign()
 {
     RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "sc", "er", "ScInterpreter::ScPercentSign" );
diff --git a/sc/source/core/tool/interpr4.cxx b/sc/source/core/tool/interpr4.cxx
index 05ff646..8e0eb5f 100644
--- a/sc/source/core/tool/interpr4.cxx
+++ b/sc/source/core/tool/interpr4.cxx
@@ -4064,6 +4064,11 @@ StackVar ScInterpreter::Interpret()
                 case ocUnicode          : ScUnicode();                  break;
                 case ocUnichar          : ScUnichar();                  break;
                 case ocTTT              : ScTTT();                      break;
+                case ocBitAnd           : ScBitAnd();                   break;
+                case ocBitOr            : ScBitOr();                    break;
+                case ocBitXor           : ScBitXor();                   break;
+                case ocBitRshift        : ScBitRshift();                break;
+                case ocBitLshift        : ScBitLshift();                break;
                 case ocNone : nFuncFmtType = NUMBERFORMAT_UNDEFINED;    break;
                 default : PushError( errUnknownOpCode);                 break;
             }
diff --git a/sc/source/ui/src/scfuncs.src b/sc/source/ui/src/scfuncs.src
index 4f99f90..e67b76b 100644
--- a/sc/source/ui/src/scfuncs.src
+++ b/sc/source/ui/src/scfuncs.src
@@ -9037,6 +9037,162 @@ Resource RID_SC_FUNCTION_DESCRIPTIONS2
             Text [ en-US ] = "Defines the character used as the decimal point." ;
         };
     };
+
+    Resource SC_OPCODE_BITAND
+    {
+    String 1 // Description
+    {
+        Text [ en-US ] = "Logical and of 2 integers.";
+    };
+    ExtraData =
+    {
+        0;
+        ID_FUNCTION_GRP_LOGIC;
+        U2S( HID_FUNC_BITAND );
+        2;  0;  0;
+        0;
+    };
+       String 2 // Name of Parameter 1
+        {
+            Text [ en-US ] = "number" ;
+        };
+        String 3 // Description of Parameter 1
+        {
+            Text [ en-US ] = "positive interger less then 2^48-1." ;
+        };
+        String 4 // Name of Parameter 2
+        {
+                Text [ en-US ] = "number" ;
+        };
+        String 5 // Description of Parameter 2
+        {
+            Text [ en-US ] = "positive interger less then 2^48-1." ;
+        };
+    };
+    Resource SC_OPCODE_BITOR
+    {
+    String 1 // Description
+    {
+        Text [ en-US ] = "Logical or of 2 integers.";
+    };
+    ExtraData =
+    {
+        0;
+        ID_FUNCTION_GRP_LOGIC;
+        U2S( HID_FUNC_BITOR );
+        2;  0;  0;
+        0;
+    };
+       String 2 // Name of Parameter 1
+        {
+            Text [ en-US ] = "number" ;
+        };
+        String 3 // Description of Parameter 1
+        {
+            Text [ en-US ] = "positive interger less then 2^48-1." ;
+        };
+        String 4 // Name of Parameter 2
+        {
+                Text [ en-US ] = "number" ;
+        };
+        String 5 // Description of Parameter 2
+        {
+            Text [ en-US ] = "positive interger less then 2^48-1." ;
+        };
+    };
+    Resource SC_OPCODE_BITXOR
+    {
+    String 1 // Description
+    {
+        Text [ en-US ] = "Logical exclusive or of 2 integers.";
+    };
+    ExtraData =
+    {
+        0;
+        ID_FUNCTION_GRP_LOGIC;
+        U2S( HID_FUNC_BITXOR );
+        2;  0;  0;
+        0;
+    };
+       String 2 // Name of Parameter 1
+        {
+            Text [ en-US ] = "number" ;
+        };
+        String 3 // Description of Parameter 1
+        {
+            Text [ en-US ] = "positive interger less then 2^48-1." ;
+        };
+        String 4 // Name of Parameter 2
+        {
+                Text [ en-US ] = "number" ;
+        };
+        String 5 // Description of Parameter 2
+        {
+            Text [ en-US ] = "positive interger less then 2^48-1." ;
+        };
+    };
+    Resource SC_OPCODE_BITRSHIFT
+    {
+    String 1 // Description
+    {
+        Text [ en-US ] = "Logical right shift.";
+    };
+    ExtraData =
+    {
+        0;
+        ID_FUNCTION_GRP_LOGIC;
+        U2S( HID_FUNC_BITRSHIFT );
+        2;  0;  0;
+        0;
+    };
+       String 2 // Name of Parameter 1
+        {
+            Text [ en-US ] = "number" ;
+        };
+        String 3 // Description of Parameter 1
+        {
+            Text [ en-US ] = "positive interger less then 2^48-1." ;
+        };
+        String 4 // Name of Parameter 2
+        {
+                Text [ en-US ] = "number" ;
+        };
+        String 5 // Description of Parameter 2
+        {
+            Text [ en-US ] = "number between - 48 and 48" ;
+        };
+    };
+    Resource SC_OPCODE_BITLSHIFT
+    {
+    String 1 // Description
+    {
+        Text [ en-US ] = "Logical left shift.";
+    };
+    ExtraData =
+    {
+        0;
+        ID_FUNCTION_GRP_LOGIC;
+        U2S( HID_FUNC_BITLSHIFT );
+        2;  0;  0;
+        0;
+    };
+       String 2 // Name of Parameter 1
+        {
+            Text [ en-US ] = "number" ;
+        };
+        String 3 // Description of Parameter 1
+        {
+            Text [ en-US ] = "positive interger less then 2^48-1." ;
+        };
+        String 4 // Name of Parameter 2
+        {
+                Text [ en-US ] = "number" ;
+        };
+        String 5 // Description of Parameter 2
+        {
+            Text [ en-US ] = "number between - 48 and 48" ;
+        };
+    };
 };
 
 #if defined(U2S)
diff --git a/sc/util/hidother.src b/sc/util/hidother.src
index d575580..37798c3 100644
--- a/sc/util/hidother.src
+++ b/sc/util/hidother.src
@@ -363,6 +363,11 @@ hidspecial HID_FUNC_NUMBERVALUE     { HelpID = HID_FUNC_NUMBERVALUE; };
 hidspecial HID_FUNC_GAMMA           { HelpID = HID_FUNC_GAMMA; };
 hidspecial HID_FUNC_CHISQDIST       { HelpID = HID_FUNC_CHISQDIST; };
 hidspecial HID_FUNC_CHISQINV        { HelpID = HID_FUNC_CHISQINV; };
+hidspecial HID_FUNC_BITAND                 { HelpID = HID_FUNC_BITAND; };
+hidspecial HID_FUNC_BITOR                  { HelpID = HID_FUNC_BITOR; };
+hidspecial HID_FUNC_BITXOR                 { HelpID = HID_FUNC_BITXOR; };
+hidspecial HID_FUNC_BITRSHIFT          { HelpID = HID_FUNC_BITRSHIFT; };
+hidspecial HID_FUNC_BITLSHIFT          { HelpID = HID_FUNC_BITLSHIFT; };
 
 // ... and from Analysis Addin
 
-- 
1.7.3.4

Attachment: pgpseKZjDk3wH.pgp
Description: PGP signature


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.