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


Forgot to add PATCH to the subject line.

August Sodora
augsod@gmail.com
(201) 280-8138



On Tue, Oct 18, 2011 at 3:01 PM, August Sodora <augsod@gmail.com> wrote:
Thanks Markus!

I've attached a new patch that includes some tests for the BASIC
scanner. Most of the test cases are just to get an idea of how the
scanner handles certain situations but I tried to make sure I included
ones that specifically trigger where the GetBufferAccess was.

August Sodora
augsod@gmail.com
(201) 280-8138



On Mon, Oct 17, 2011 at 2:23 PM, Markus Mohrhard
<markus.mohrhard@googlemail.com> wrote:
Hello August,

as promised on IRC this patch resolves all linking problems.

If you have any more problems feel free to ask here or on IRC.

Thanks a lot for your work.

Markus


From ee07bfa53dde6aa5d44fdafe6bc4755fdc8d08f3 Mon Sep 17 00:00:00 2001
From: August Sodora <augsod@gmail.com>
Date: Tue, 18 Oct 2011 14:50:21 -0400
Subject: [PATCH] String->OUString, with accompanying tests

---
 basic/CppunitTest_basic_scanner.mk |   33 ++
 basic/Module_basic.mk              |    4 +
 basic/qa/cppunit/test_scanner.cxx  |  578 ++++++++++++++++++++++++++++++++++++
 basic/source/comp/parser.cxx       |    6 +-
 basic/source/comp/scanner.cxx      |   31 ++-
 basic/source/comp/token.cxx        |   40 ++-
 basic/source/inc/expr.hxx          |    2 +-
 basic/source/inc/scanner.hxx       |    4 +-
 basic/source/inc/token.hxx         |    2 +-
 sal/inc/rtl/ustring.hxx            |    7 +-
 10 files changed, 672 insertions(+), 35 deletions(-)
 create mode 100644 basic/CppunitTest_basic_scanner.mk
 create mode 100644 basic/qa/cppunit/test_scanner.cxx

diff --git a/basic/CppunitTest_basic_scanner.mk b/basic/CppunitTest_basic_scanner.mk
new file mode 100644
index 0000000..bf8237c
--- /dev/null
+++ b/basic/CppunitTest_basic_scanner.mk
@@ -0,0 +1,33 @@
+$(eval $(call gb_CppunitTest_CppunitTest,basic_scanner))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,basic_scanner, \
+    basic/qa/cppunit/test_scanner \
+))
+
+$(eval $(call gb_CppunitTest_add_library_objects,basic_scanner,sb))
+
+# add a list of all needed libraries here
+$(eval $(call gb_CppunitTest_add_linked_libs,basic_scanner, \
+    comphelper \
+    cppu \
+    cppuhelper \
+    sal \
+    salhelper \
+    sb \
+    sfx \
+    sot \
+    svl \
+    svt \
+    tl \
+    utl \
+    vcl \
+    xcr \
+    $(gb_STDLIBS) \
+))
+
+$(eval $(call gb_CppunitTest_set_include,basic_scanner,\
+-I$(realpath $(SRCDIR)/basic/source/inc) \
+-I$(realpath $(SRCDIR)/basic/inc) \
+$$(INCLUDE) \
+-I$(OUTDIR)/inc \
+))
diff --git a/basic/Module_basic.mk b/basic/Module_basic.mk
index e7f9393..d1b5dee 100644
--- a/basic/Module_basic.mk
+++ b/basic/Module_basic.mk
@@ -37,4 +37,8 @@ $(eval $(call gb_Module_add_targets,basic,\
        StaticLibrary_sample \
 ))
 
+$(eval $(call gb_Module_add_check_targets,basic,\
+     CppunitTest_basic_scanner \
+)) 
+
 # vim: set noet sw=4 ts=4:
diff --git a/basic/qa/cppunit/test_scanner.cxx b/basic/qa/cppunit/test_scanner.cxx
new file mode 100644
index 0000000..f6459a5
--- /dev/null
+++ b/basic/qa/cppunit/test_scanner.cxx
@@ -0,0 +1,578 @@
+#include "sal/config.h"
+#include "sal/precppunit.hxx"
+
+#include "cppunit/TestAssert.h"
+#include "cppunit/TestFixture.h"
+#include "cppunit/extensions/HelperMacros.h"
+#include "cppunit/plugin/TestPlugIn.h"
+
+#include "osl/file.hxx"
+#include "osl/process.h"
+
+#include "scanner.hxx"
+
+namespace
+{
+  struct Symbol
+  {
+    sal_uInt16 line;
+    sal_uInt16 col1;
+    sal_uInt16 col2;
+    rtl::OUString text;
+    double number;
+    SbxDataType type;
+  };
+
+  /**
+   * Perform tests on Scanner.
+   */
+  class ScannerTest : public CppUnit::TestFixture
+  {
+  private:
+    void testBlankLines();
+    void testOperators();
+    void testAlphanum();
+    void testComments();
+    void testGoto();
+    void testExclamation();
+    void testNumbers();
+    
+    // Adds code needed to register the test suite
+    CPPUNIT_TEST_SUITE(ScannerTest);
+
+    // Declares the method as a test to call
+    CPPUNIT_TEST(testBlankLines);
+    CPPUNIT_TEST(testOperators);
+    CPPUNIT_TEST(testAlphanum);
+    CPPUNIT_TEST(testComments);
+    CPPUNIT_TEST(testGoto);
+    CPPUNIT_TEST(testExclamation);
+    CPPUNIT_TEST(testNumbers);
+
+    // End of test suite definition
+    CPPUNIT_TEST_SUITE_END();
+  public:
+    void setUp()
+    {
+    }
+    
+    void tearDown()
+    {
+    }
+  };
+
+  const static rtl::OUString cr(RTL_CONSTASCII_USTRINGPARAM("\n"));
+  const static rtl::OUString rem(RTL_CONSTASCII_USTRINGPARAM("REM"));
+  const static rtl::OUString asdf(RTL_CONSTASCII_USTRINGPARAM("asdf"));
+  const static rtl::OUString dot(RTL_CONSTASCII_USTRINGPARAM("."));
+  const static rtl::OUString goto_(RTL_CONSTASCII_USTRINGPARAM("goto"));
+  const static rtl::OUString excl(RTL_CONSTASCII_USTRINGPARAM("!"));
+
+  std::vector<Symbol> getSymbols(const rtl::OUString& source)
+  {
+    std::vector<Symbol> symbols;
+    SbiScanner scanner(source);
+    while(scanner.NextSym())
+    {
+      Symbol symbol;
+      symbol.line = scanner.GetLine();
+      symbol.col1 = scanner.GetCol1();
+      symbol.col2 = scanner.GetCol2();
+      symbol.text = scanner.GetSym();
+      symbol.number = scanner.GetDbl();
+      symbol.type = scanner.GetType();
+      symbols.push_back(symbol);
+    }
+    return symbols;
+  }
+
+  void ScannerTest::testBlankLines()
+  {
+    const rtl::OUString source1(RTL_CONSTASCII_USTRINGPARAM(""));
+    const rtl::OUString source2(RTL_CONSTASCII_USTRINGPARAM("\r\n"));
+    const rtl::OUString source3(RTL_CONSTASCII_USTRINGPARAM("\n"));
+    const rtl::OUString source4(RTL_CONSTASCII_USTRINGPARAM("\r"));
+    const rtl::OUString source5(RTL_CONSTASCII_USTRINGPARAM("\r\n\r\n"));
+    const rtl::OUString source6(RTL_CONSTASCII_USTRINGPARAM("\n\r"));
+    const rtl::OUString source7(RTL_CONSTASCII_USTRINGPARAM("\n\r\n"));
+    const rtl::OUString source8(RTL_CONSTASCII_USTRINGPARAM("\r\n\r"));
+    const rtl::OUString source9(RTL_CONSTASCII_USTRINGPARAM("      "));
+
+    std::vector<Symbol> symbols;
+    symbols = getSymbols(source1);
+    CPPUNIT_ASSERT(symbols.empty());
+
+    symbols = getSymbols(source2);
+    CPPUNIT_ASSERT(symbols.size() == 1);
+    CPPUNIT_ASSERT(symbols[0].text == cr);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+
+    symbols = getSymbols(source3);
+    CPPUNIT_ASSERT(symbols.size() == 1);
+    CPPUNIT_ASSERT(symbols[0].text == cr);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+
+    symbols = getSymbols(source4);
+    CPPUNIT_ASSERT(symbols.size() == 1);
+    CPPUNIT_ASSERT(symbols[0].text == cr);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+
+    symbols = getSymbols(source5);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == cr);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source6);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == cr);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source7);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == cr);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source8);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == cr);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source9);
+    CPPUNIT_ASSERT(symbols.size() == 1);
+    CPPUNIT_ASSERT(symbols[0].text == cr);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+  }
+
+  void ScannerTest::testOperators()
+  {
+    const rtl::OUString sourceE(RTL_CONSTASCII_USTRINGPARAM("="));
+    const rtl::OUString sourceLT(RTL_CONSTASCII_USTRINGPARAM("<"));
+    const rtl::OUString sourceGT(RTL_CONSTASCII_USTRINGPARAM(">"));
+    const rtl::OUString sourceLTE(RTL_CONSTASCII_USTRINGPARAM("<="));
+    const rtl::OUString sourceGTE(RTL_CONSTASCII_USTRINGPARAM(">="));
+    const rtl::OUString sourceEE(RTL_CONSTASCII_USTRINGPARAM("=="));
+    const rtl::OUString sourceNE(RTL_CONSTASCII_USTRINGPARAM("<>"));
+    const rtl::OUString sourceA(RTL_CONSTASCII_USTRINGPARAM(":="));
+
+    std::vector<Symbol> symbols;
+
+    symbols = getSymbols(sourceE);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == sourceE);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(sourceLT);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == sourceLT);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(sourceGT);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == sourceGT);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(sourceLTE);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == sourceLTE);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(sourceGTE);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == sourceGTE);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(sourceEE);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == sourceE);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == sourceE);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+
+    symbols = getSymbols(sourceNE);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == sourceNE);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(sourceA);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == sourceA);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+  }
+
+  void ScannerTest::testAlphanum()
+  {
+    const rtl::OUString source1(RTL_CONSTASCII_USTRINGPARAM("asdfghefg"));
+    const rtl::OUString source2(RTL_CONSTASCII_USTRINGPARAM("1asfdasfd"));
+    const rtl::OUString source3(RTL_CONSTASCII_USTRINGPARAM("AdfsaAUdsl10987"));
+    const rtl::OUString source4(RTL_CONSTASCII_USTRINGPARAM("asdfa_mnvcnm"));
+    const rtl::OUString source5(RTL_CONSTASCII_USTRINGPARAM("_asdf1"));
+    const rtl::OUString source6(RTL_CONSTASCII_USTRINGPARAM("_6"));
+    const rtl::OUString source7(RTL_CONSTASCII_USTRINGPARAM("joxclk_"));
+    const rtl::OUString source8(RTL_CONSTASCII_USTRINGPARAM("   asdf    "));
+    const rtl::OUString source9(RTL_CONSTASCII_USTRINGPARAM(" 19395  asdfa "));
+    const rtl::OUString source10(RTL_CONSTASCII_USTRINGPARAM("\n1\n2\na sdf"));
+    const rtl::OUString source11(RTL_CONSTASCII_USTRINGPARAM("asdf.asdf"));
+    const rtl::OUString source12(RTL_CONSTASCII_USTRINGPARAM(".."));
+
+    std::vector<Symbol> symbols;
+
+    symbols = getSymbols(source1);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == source1);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source2);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text.isEmpty()); // Can't start symbol with a digit
+    CPPUNIT_ASSERT(symbols[0].number == 1);
+    CPPUNIT_ASSERT(symbols[0].type == SbxINTEGER);
+    CPPUNIT_ASSERT(symbols[1].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("asfdasfd")));
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+
+    symbols = getSymbols(source3);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == source3);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source4);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == source4);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source5);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == source5);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source6);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == source6);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source7);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("joxclk_")));
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(source7 == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("joxclk "))); // Change 
the trailing '_' to a ' '
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source8);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("asdf")));
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source9);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text.isEmpty());
+    CPPUNIT_ASSERT(symbols[0].number = 19395);
+    CPPUNIT_ASSERT(symbols[0].type == SbxINTEGER);
+    CPPUNIT_ASSERT(symbols[1].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("asdfa")));
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+                  
+    symbols = getSymbols(source10);
+    CPPUNIT_ASSERT(symbols.size() == 8);
+    CPPUNIT_ASSERT(symbols[0].text == cr);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text.isEmpty());
+    CPPUNIT_ASSERT(symbols[1].number == 1);
+    CPPUNIT_ASSERT(symbols[1].type == SbxINTEGER);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[3].text.isEmpty());
+    CPPUNIT_ASSERT(symbols[3].number == 2);
+    CPPUNIT_ASSERT(symbols[3].type == SbxINTEGER);
+    CPPUNIT_ASSERT(symbols[4].text == cr);
+    CPPUNIT_ASSERT(symbols[4].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[5].text.getLength() == 1);
+    CPPUNIT_ASSERT(symbols[5].text[0] == 'a');
+    CPPUNIT_ASSERT(symbols[5].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[6].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdf")));
+    CPPUNIT_ASSERT(symbols[6].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[7].text == cr);
+    CPPUNIT_ASSERT(symbols[7].type == SbxVARIANT);
+
+    symbols = getSymbols(source11);
+    CPPUNIT_ASSERT(symbols.size() == 4);
+    CPPUNIT_ASSERT(symbols[0].text == asdf);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == dot);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[2].text == asdf);
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[3].text == cr);
+    CPPUNIT_ASSERT(symbols[3].type == SbxVARIANT);
+
+    symbols = getSymbols(source12);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == dot);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == dot);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+  }
+
+  void ScannerTest::testComments()
+  {
+    const rtl::OUString source1(RTL_CONSTASCII_USTRINGPARAM("REM asdf"));
+    const rtl::OUString source2(RTL_CONSTASCII_USTRINGPARAM("REMasdf"));
+    const rtl::OUString source3(RTL_CONSTASCII_USTRINGPARAM("'asdf"));
+    const rtl::OUString source4(RTL_CONSTASCII_USTRINGPARAM("asdf _\n'100"));
+    const rtl::OUString source5(RTL_CONSTASCII_USTRINGPARAM("'asdf _\n100"));
+    const rtl::OUString source6(RTL_CONSTASCII_USTRINGPARAM("'asdf _\n'100"));
+    const rtl::OUString source7(RTL_CONSTASCII_USTRINGPARAM("'asdf _\n 1234 _\n asdf'"));
+
+    std::vector<Symbol> symbols;
+
+    symbols = getSymbols(source1);
+    CPPUNIT_ASSERT(symbols.size() == 1);
+    CPPUNIT_ASSERT(symbols[0].text == rem);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+
+    symbols = getSymbols(source2);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("REMasdf")));
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source3);
+    CPPUNIT_ASSERT(symbols.size() == 1);
+    CPPUNIT_ASSERT(symbols[0].text == rem);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+
+    symbols = getSymbols(source4);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == asdf);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == rem);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source5);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == rem);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text.isEmpty());
+    CPPUNIT_ASSERT(symbols[1].number == 100);
+    CPPUNIT_ASSERT(symbols[1].type == SbxINTEGER);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+
+    symbols = getSymbols(source6);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == rem);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == rem);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+    
+    symbols = getSymbols(source7);
+    CPPUNIT_ASSERT(symbols.size() == 4);
+    CPPUNIT_ASSERT(symbols[0].text == rem);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text.isEmpty());
+    CPPUNIT_ASSERT(symbols[1].number == 1234);
+    CPPUNIT_ASSERT(symbols[1].type == SbxINTEGER);
+    CPPUNIT_ASSERT(symbols[2].text == asdf);
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[3].text == rem);
+    CPPUNIT_ASSERT(symbols[3].type == SbxVARIANT);
+  }
+
+  void ScannerTest::testGoto()
+  {
+    const rtl::OUString source1(RTL_CONSTASCII_USTRINGPARAM("goto"));
+    const rtl::OUString source2(RTL_CONSTASCII_USTRINGPARAM("go  to"));
+    const rtl::OUString source3(RTL_CONSTASCII_USTRINGPARAM("go\nto"));
+
+    std::vector<Symbol> symbols;
+
+    symbols = getSymbols(source1);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == goto_);
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+
+    symbols = getSymbols(source2);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("go")));
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("to")));
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+
+    symbols = getSymbols(source3);
+    CPPUNIT_ASSERT(symbols.size() == 4);
+    CPPUNIT_ASSERT(symbols[0].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("go")));
+    CPPUNIT_ASSERT(symbols[0].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    CPPUNIT_ASSERT(symbols[1].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[2].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("to")));
+    CPPUNIT_ASSERT(symbols[2].type == SbxVARIANT);
+    CPPUNIT_ASSERT(symbols[3].text == cr);
+    CPPUNIT_ASSERT(symbols[3].type == SbxVARIANT);
+  }
+
+  void ScannerTest::testExclamation()
+  {
+    const rtl::OUString source1(RTL_CONSTASCII_USTRINGPARAM("asdf!asdf"));
+    const rtl::OUString source2(RTL_CONSTASCII_USTRINGPARAM("!1234"));
+    const rtl::OUString source3(RTL_CONSTASCII_USTRINGPARAM("!_3"));
+    const rtl::OUString source4(RTL_CONSTASCII_USTRINGPARAM("!$"));
+    const rtl::OUString source5(RTL_CONSTASCII_USTRINGPARAM("!%"));
+    const rtl::OUString source6(RTL_CONSTASCII_USTRINGPARAM("!\n"));
+
+    std::vector<Symbol> symbols;
+
+    symbols = getSymbols(source1);
+    CPPUNIT_ASSERT(symbols.size() == 4);
+    CPPUNIT_ASSERT(symbols[0].text == asdf);
+    CPPUNIT_ASSERT(symbols[1].text == excl);
+    CPPUNIT_ASSERT(symbols[2].text == asdf);
+    CPPUNIT_ASSERT(symbols[3].text == cr);    
+
+    symbols = getSymbols(source2);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == excl);
+    CPPUNIT_ASSERT(symbols[1].text.isEmpty());
+    CPPUNIT_ASSERT(symbols[1].number == 1234);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+
+    symbols = getSymbols(source3);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == excl);
+    CPPUNIT_ASSERT(symbols[1].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_3")));
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+
+    symbols = getSymbols(source4);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == excl);
+    CPPUNIT_ASSERT(symbols[1].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("$")));
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+
+    symbols = getSymbols(source5);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == excl);
+    CPPUNIT_ASSERT(symbols[1].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")));
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+  
+    symbols = getSymbols(source6);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].text == excl);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+  }
+
+  void ScannerTest::testNumbers()
+  {
+    const rtl::OUString source1(RTL_CONSTASCII_USTRINGPARAM("12345"));
+    const rtl::OUString source2(RTL_CONSTASCII_USTRINGPARAM("1.2.3"));
+    const rtl::OUString source3(RTL_CONSTASCII_USTRINGPARAM("123.4"));
+    const rtl::OUString source4(RTL_CONSTASCII_USTRINGPARAM("0.5"));
+    const rtl::OUString source5(RTL_CONSTASCII_USTRINGPARAM("5.0"));
+    const rtl::OUString source6(RTL_CONSTASCII_USTRINGPARAM("0.0"));
+    const rtl::OUString source7(RTL_CONSTASCII_USTRINGPARAM("-3"));
+    const rtl::OUString source8(RTL_CONSTASCII_USTRINGPARAM("-0.0"));
+    const rtl::OUString source9(RTL_CONSTASCII_USTRINGPARAM("12dE3"));
+    const rtl::OUString source10(RTL_CONSTASCII_USTRINGPARAM("12e3"));
+
+    std::vector<Symbol> symbols;
+
+    symbols = getSymbols(source1);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].number == 12345);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    
+    symbols = getSymbols(source2);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].number == 1.23);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+    
+    symbols = getSymbols(source3);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].number = 123.4);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+
+    symbols = getSymbols(source4);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].number == .5);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+
+    symbols = getSymbols(source5);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].number == 5);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+
+    symbols = getSymbols(source6);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].number == 0);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+
+    symbols = getSymbols(source7);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-")));
+    CPPUNIT_ASSERT(symbols[1].number == 3);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+
+    symbols = getSymbols(source8);
+    CPPUNIT_ASSERT(symbols.size() == 3);
+    CPPUNIT_ASSERT(symbols[0].text == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-")));
+    CPPUNIT_ASSERT(symbols[1].number == 0);
+    CPPUNIT_ASSERT(symbols[2].text == cr);
+
+    symbols = getSymbols(source9);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].number == 12000);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+
+    symbols = getSymbols(source10);
+    CPPUNIT_ASSERT(symbols.size() == 2);
+    CPPUNIT_ASSERT(symbols[0].number == 12000);
+    CPPUNIT_ASSERT(symbols[1].text == cr);
+  }
+
+  // Put the test suite in the registry
+  CPPUNIT_TEST_SUITE_REGISTRATION(ScannerTest);
+} // namespace
+CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/basic/source/comp/parser.cxx b/basic/source/comp/parser.cxx
index b8fb78f..965381e 100644
--- a/basic/source/comp/parser.cxx
+++ b/basic/source/comp/parser.cxx
@@ -676,7 +676,7 @@ void SbiParser::DefXXX()
     while( !bAbort )
     {
         if( Next() != SYMBOL ) break;
-        ch1 = aSym.ToUpperAscii().GetBuffer()[0];
+        ch1 = aSym.toAsciiUpperCase()[0];
         ch2 = 0;
         if( Peek() == MINUS )
         {
@@ -684,7 +684,7 @@ void SbiParser::DefXXX()
             if( Next() != SYMBOL ) Error( SbERR_SYMBOL_EXPECTED );
             else
             {
-                ch2 = aSym.ToUpperAscii().GetBuffer()[0];
+                ch2 = aSym.toAsciiUpperCase()[0];
                 if( ch2 < ch1 ) Error( SbERR_SYNTAX ), ch2 = 0;
             }
         }
@@ -784,7 +784,7 @@ void SbiParser::Option()
             SbiToken eTok = Next();
             if( eTok == BINARY )
                 bText = sal_False;
-            else if( eTok == SYMBOL && GetSym().EqualsIgnoreCaseAscii("text") )
+            else if( eTok == SYMBOL && 
GetSym().equalsIgnoreAsciiCaseAsciiL(RTL_CONSTASCII_STRINGPARAM("text")) )
                 bText = sal_True;
             else
                 Error( SbERR_EXPECTED, "Text/Binary" );
diff --git a/basic/source/comp/scanner.cxx b/basic/source/comp/scanner.cxx
index 1dec4db..998ecbf 100644
--- a/basic/source/comp/scanner.cxx
+++ b/basic/source/comp/scanner.cxx
@@ -173,7 +173,7 @@ sal_Bool SbiScanner::NextSym()
     bHash = sal_False;
 
     eScanType = SbxVARIANT;
-    aSym.Erase();
+    aSym = ::rtl::OUString();
     bSymbol =
     bNumber = bSpaces = sal_False;
 
@@ -241,7 +241,7 @@ sal_Bool SbiScanner::NextSym()
         aSym = aLine.copy( n, nCol - n );
 
         // Special handling for "go to"
-        if( bCompatible && *pLine && aSym.EqualsIgnoreCaseAscii( "go" ) )
+        if( bCompatible && *pLine && aSym.equalsIgnoreAsciiCaseAsciiL( 
RTL_CONSTASCII_STRINGPARAM("go") ) )
         {
             const sal_Unicode* pTestLine = pLine;
             short nTestCol = nCol;
@@ -267,8 +267,15 @@ sal_Bool SbiScanner::NextSym()
         // (wrong line continuation otherwise)
         if( !bUsedForHilite && !*pLine && *(pLine-1) == '_' )
         {
-            aSym.GetBufferAccess();     // #109693 force copy if necessary
             *((sal_Unicode*)(pLine-1)) = ' ';       // cast because of const
+
+            ::rtl::OUStringBuffer aLineBuf(aLine);
+            aLineBuf[nCol - 1] = ' ';               // just to keep pLine and aLine in sync
+            aLine = aLineBuf.makeStringAndClear();
+
+            ::rtl::OUStringBuffer aSymBuf(aSym);
+            aSymBuf[aSymBuf.getLength() - 1] = '_'; // to match behavior from back when 
GetBufferAccess was used
+            aSym = aSymBuf.makeStringAndClear();
         }
         // type recognition?
         // don't test the exclamation mark
@@ -384,7 +391,9 @@ sal_Bool SbiScanner::NextSym()
                 break;
             default :
                 // treated as an operator
-                pLine--; nCol--; nCol1 = nCol-1; aSym = '&'; return SYMBOL;
+                pLine--; nCol--; nCol1 = nCol-1; 
+                aSym = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("&"));
+                return SYMBOL;
         }
         bNumber = sal_True;
         long l = 0;
@@ -453,10 +462,12 @@ sal_Bool SbiScanner::NextSym()
         sal_uInt16 nIdx = 0;
         do
         {
-            nIdx = aSym.Search( s, nIdx );
+            nIdx = aSym.indexOf( s, nIdx );
             if( nIdx == STRING_NOTFOUND )
                 break;
-            aSym.Erase( nIdx, 1 );
+            ::rtl::OUStringBuffer aSymBuf(aSym);
+            aSymBuf.remove(nIdx, 1);
+            aSym = aSymBuf.makeStringAndClear();
             nIdx++;
         }
         while( true );
@@ -487,10 +498,10 @@ sal_Bool SbiScanner::NextSym()
 PrevLineCommentLbl:
 
     if( bPrevLineExtentsComment || (eScanType != SbxSTRING &&
-        ( aSym.GetBuffer()[0] == '\'' || aSym.EqualsIgnoreCaseAscii( "REM" ) ) ) )
+                                    ( aSym[0] == '\'' || aSym.equalsIgnoreAsciiCaseAsciiL( 
RTL_CONSTASCII_STRINGPARAM("REM") ) ) ) )
     {
         bPrevLineExtentsComment = sal_False;
-        aSym = String::CreateFromAscii( "REM" );
+        aSym = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("REM"));
         sal_uInt16 nLen = String( pLine ).Len();
         if( bCompatible && pLine[ nLen - 1 ] == '_' && pLine[ nLen - 2 ] == ' ' )
             bPrevLineExtentsComment = sal_True;
@@ -505,7 +516,7 @@ eoln:
     {
         pLine = NULL;
         bool bRes = NextSym();
-        if( bVBASupportOn && aSym.GetBuffer()[0] == '.' )
+        if( bVBASupportOn && aSym[0] == '.' )
         {
             // object _
             //    .Method
@@ -521,7 +532,7 @@ eoln:
         nLine = nOldLine;
         nCol1 = nOldCol1;
         nCol2 = nOldCol2;
-        aSym = '\n';
+        aSym = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\n"));
         nColLock = 0;
         return sal_True;
     }
diff --git a/basic/source/comp/token.cxx b/basic/source/comp/token.cxx
index 1027d5b..d09d539 100644
--- a/basic/source/comp/token.cxx
+++ b/basic/source/comp/token.cxx
@@ -281,19 +281,25 @@ SbiToken SbiTokenizer::Peek()
 
 // For decompilation. Numbers and symbols return an empty string.
 
-const String& SbiTokenizer::Symbol( SbiToken t )
+const ::rtl::OUString& SbiTokenizer::Symbol( SbiToken t )
 {
     // character token?
     if( t < FIRSTKWD )
     {
-        aSym = (char) t;
+        aSym = ::rtl::OUString::valueOf(sal::static_int_cast<sal_Unicode>(t));
         return aSym;
     }
     switch( t )
     {
-        case NEG   : aSym = '-'; return aSym;
-        case EOS   : aSym = String::CreateFromAscii( ":/CRLF" ); return aSym;
-        case EOLN  : aSym = String::CreateFromAscii( "CRLF" ); return aSym;
+        case NEG   : 
+            aSym = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("-"));
+            return aSym;
+        case EOS   : 
+            aSym = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(":/CRLF"));
+            return aSym;
+        case EOLN  :
+            aSym = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CRLF"));
+            return aSym;
         default: break;
     }
     TokenTable* tp = pTokTable;
@@ -301,12 +307,13 @@ const String& SbiTokenizer::Symbol( SbiToken t )
     {
         if( tp->t == t )
         {
-            aSym = String::CreateFromAscii( tp->s );
+            aSym = ::rtl::OStringToOUString(tp->s, RTL_TEXTENCODING_ASCII_US);
             return aSym;
         }
     }
-    const sal_Unicode *p = aSym.GetBuffer();
-    if (*p <= ' ') aSym = String::CreateFromAscii( "???" );
+    const sal_Unicode *p = aSym.getStr();
+    if (*p <= ' ')
+        aSym = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("???"));
     return aSym;
 }
 
@@ -337,7 +344,7 @@ SbiToken SbiTokenizer::Next()
         return eCurTok = EOLN;
     }
 
-    if( aSym.GetBuffer()[0] == '\n' )
+    if( aSym[0] == '\n' )
     {
         bEos = sal_True; return eCurTok = EOLN;
     }
@@ -350,9 +357,9 @@ SbiToken SbiTokenizer::Next()
         return eCurTok = FIXSTRING;
     // Special cases of characters that are between "Z" and "a". ICompare()
     // evaluates the position of these characters in different ways.
-    else if( aSym.GetBuffer()[0] == '^' )
+    else if( aSym[0] == '^' )
         return eCurTok = EXPON;
-    else if( aSym.GetBuffer()[0] == '\\' )
+    else if( aSym[0] == '\\' )
         return eCurTok = IDIV;
     else
     {
@@ -367,17 +374,16 @@ SbiToken SbiTokenizer::Next()
         {
             delta = (ub - lb) >> 1;
             tp = &pTokTable[ lb + delta ];
-            StringCompare res = aSym.CompareIgnoreCaseToAscii( tp->s );
+            sal_Int32 res = aSym.compareToIgnoreAsciiCaseAscii( tp->s );
 
-            if( res == COMPARE_EQUAL )
+            if( res == 0 )
                 goto special;
 
-            if( res == COMPARE_LESS )
+            if( res < 0 )
             {
                 if ((ub - lb) == 2) ub = lb;
                 else ub = ub - delta;
             }
-
             else
             {
                 if ((ub -lb) == 2) lb = ub;
@@ -385,7 +391,7 @@ SbiToken SbiTokenizer::Next()
             }
         } while( delta );
         // Symbol? if not >= token
-        sal_Unicode ch = aSym.GetBuffer()[0];
+        sal_Unicode ch = aSym[0];
         if( !BasicSimpleCharClass::isAlpha( ch, bCompatible ) && !bSymbol )
             return eCurTok = (SbiToken) (ch & 0x00FF);
         return eCurTok = SYMBOL;
@@ -457,7 +463,7 @@ special:
     if( bCompatible )
     {
         // #129904 Suppress system
-        if( eTok == STOP && aSym.CompareIgnoreCaseToAscii( "system" ) == COMPARE_EQUAL )
+        if( eTok == STOP && aSym.equalsIgnoreAsciiCaseAsciiL(RTL_CONSTASCII_STRINGPARAM("system")) 
)
             eCurTok = SYMBOL;
 
         if( eTok == GET && bStartOfLine )
diff --git a/basic/source/inc/expr.hxx b/basic/source/inc/expr.hxx
index 3cc12b0..0a7d4aa 100644
--- a/basic/source/inc/expr.hxx
+++ b/basic/source/inc/expr.hxx
@@ -55,7 +55,7 @@ struct SbVar {
 
 struct KeywordSymbolInfo
 {
-    String          m_aKeywordSymbol;
+    ::rtl::OUString m_aKeywordSymbol;
     SbxDataType     m_eSbxDataType;
     SbiToken        m_eTok;
 };
diff --git a/basic/source/inc/scanner.hxx b/basic/source/inc/scanner.hxx
index 06447fa..baba425 100644
--- a/basic/source/inc/scanner.hxx
+++ b/basic/source/inc/scanner.hxx
@@ -46,7 +46,7 @@ class SbiScanner
     const sal_Unicode* pLine;
     const sal_Unicode* pSaveLine;
 protected:
-    String aSym;
+    ::rtl::OUString aSym;
     String aError;
     SbxDataType eScanType;
     StarBASIC* pBasic;                  // instance for error callbacks
@@ -96,7 +96,7 @@ public:
     sal_Bool  DoesColonFollow();
 
     sal_Bool NextSym();
-    const String& GetSym()          { return aSym;  }
+    const ::rtl::OUString& GetSym() { return aSym;  }
     SbxDataType GetType()           { return eScanType; }
     double    GetDbl()              { return nVal;  }
 };
diff --git a/basic/source/inc/token.hxx b/basic/source/inc/token.hxx
index 666c8e4..1048176 100644
--- a/basic/source/inc/token.hxx
+++ b/basic/source/inc/token.hxx
@@ -155,7 +155,7 @@ public:
     inline sal_Bool IsEos()             { return bEos; }
 
     void  Push( SbiToken );
-    const String& Symbol( SbiToken );   // reconversion
+    const ::rtl::OUString& Symbol( SbiToken );   // reconversion
 
     SbiToken Peek();                    // read the next token
     SbiToken Next();                    // read a token
diff --git a/sal/inc/rtl/ustring.hxx b/sal/inc/rtl/ustring.hxx
index e104f0d..63bab18 100644
--- a/sal/inc/rtl/ustring.hxx
+++ b/sal/inc/rtl/ustring.hxx
@@ -413,7 +413,7 @@ public:
                                                            str.pData->buffer, str.pData->length ) 
== 0;
     }
 
-    /**
+   /**
       Match against a substring appearing in this string.
 
       The result is true if and only if the second string appears as a substring
@@ -598,6 +598,11 @@ public:
         return rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, 
asciiStr ) == 0;
     }
 
+    sal_Int32 compareToIgnoreAsciiCaseAscii( const sal_Char * asciiStr ) const SAL_THROW(())
+    {
+        return rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, 
asciiStr );
+    }
+
     /**
       Perform a ASCII lowercase comparison of two strings.
 
-- 
1.7.4.4


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.