Apparently the issue was that I actually wasn't using the parameter :) I've attached a preliminary patch (my first!) for review.
August Sodora aug...@gmail.com (201) 280-8138 On Sun, Oct 2, 2011 at 3:16 AM, Tor Lillqvist <t...@iki.fi> wrote: >> It sounds at least reasonable to me. The normal thing is to add new >> in-line functions to ustring.hxx, that saves punching a hole in the >> (accursed) map file for libsal (in sal/util/sal.map) - > > I am not 100% sure, but I think that in some cases (--enable-dbgutil build > with MSVC is what I am thinking of) an explicit implementation is needed > anyway. (Can't check right now.) > > --tml
From 0868784236ecf6f0393da143d3783bf35e5bc123 Mon Sep 17 00:00:00 2001 From: August Sodora <aasod...@oc8513601644.ibm.com> Date: Sun, 2 Oct 2011 17:33:10 -0400 Subject: [PATCH 1/2] String->OUString --- basic/source/comp/exprtree.cxx | 2 +- basic/source/comp/parser.cxx | 6 +++--- basic/source/comp/scanner.cxx | 31 +++++++++++++++++-------------- basic/source/comp/token.cxx | 39 ++++++++++++++++++++++----------------- basic/source/inc/expr.hxx | 2 +- basic/source/inc/scanner.hxx | 4 ++-- basic/source/inc/token.hxx | 2 +- sal/inc/rtl/ustring.hxx | 5 +++++ 8 files changed, 52 insertions(+), 39 deletions(-) diff --git a/basic/source/comp/exprtree.cxx b/basic/source/comp/exprtree.cxx index 1c7ec1b..2acf90cc 100644 --- a/basic/source/comp/exprtree.cxx +++ b/basic/source/comp/exprtree.cxx @@ -208,7 +208,7 @@ SbiExprNode* SbiExpression::Term( const KeywordSymbolInfo* pKeywordSymbolInfo ) SbiToken eTok = (pKeywordSymbolInfo == NULL) ? pParser->Next() : pKeywordSymbolInfo->m_eTok; // memorize the parsing's begin pParser->LockColumn(); - String aSym( (pKeywordSymbolInfo == NULL) ? pParser->GetSym() : pKeywordSymbolInfo->m_aKeywordSymbol ); + ::rtl::OUString aSym( (pKeywordSymbolInfo == NULL) ? pParser->GetSym() : pKeywordSymbolInfo->m_aKeywordSymbol ); SbxDataType eType = (pKeywordSymbolInfo == NULL) ? pParser->GetType() : pKeywordSymbolInfo->m_eSbxDataType; SbiParameters* pPar = NULL; SbiExprListVector* pvMoreParLcl = NULL; diff --git a/basic/source/comp/parser.cxx b/basic/source/comp/parser.cxx index b8fb78f..3b09dc5 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().getStr()[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().getStr()[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..767945f 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; @@ -266,10 +266,8 @@ sal_Bool SbiScanner::NextSym() // replace closing '_' by space when end of line is following // (wrong line continuation otherwise) if( !bUsedForHilite && !*pLine && *(pLine-1) == '_' ) - { - aSym.GetBufferAccess(); // #109693 force copy if necessary *((sal_Unicode*)(pLine-1)) = ' '; // cast because of const - } + // type recognition? // don't test the exclamation mark // if there's a symbol behind it @@ -384,7 +382,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; @@ -450,13 +450,15 @@ sal_Bool SbiScanner::NextSym() // get out duplicate string delimiters String s( cSep ); s += cSep; - sal_uInt16 nIdx = 0; + sal_Int32 nIdx = 0; do { - nIdx = aSym.Search( s, nIdx ); - if( nIdx == STRING_NOTFOUND ) + ::rtl::OUStringBuffer aSymBuf(aSym); + nIdx = aSym.indexOf( s, nIdx ); + if( nIdx >= 0 ) break; - aSym.Erase( nIdx, 1 ); + aSymBuf.remove( nIdx, 1 ); + aSym = aSymBuf.makeStringAndClear(); nIdx++; } while( true ); @@ -487,10 +489,11 @@ sal_Bool SbiScanner::NextSym() PrevLineCommentLbl: if( bPrevLineExtentsComment || (eScanType != SbxSTRING && - ( aSym.GetBuffer()[0] == '\'' || aSym.EqualsIgnoreCaseAscii( "REM" ) ) ) ) + ( aSym.getStr()[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 +508,7 @@ eoln: { pLine = NULL; bool bRes = NextSym(); - if( bVBASupportOn && aSym.GetBuffer()[0] == '.' ) + if( bVBASupportOn && aSym.getStr()[0] == '.' ) { // object _ // .Method @@ -521,7 +524,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..3bf1037 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,12 @@ const String& SbiTokenizer::Symbol( SbiToken t ) { if( tp->t == t ) { - aSym = String::CreateFromAscii( tp->s ); + aSym = ::rtl::OUString::createFromAscii( tp->s ); 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 +343,7 @@ SbiToken SbiTokenizer::Next() return eCurTok = EOLN; } - if( aSym.GetBuffer()[0] == '\n' ) + if( aSym.getStr()[0] == '\n' ) { bEos = sal_True; return eCurTok = EOLN; } @@ -350,9 +356,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.getStr()[0] == '^' ) return eCurTok = EXPON; - else if( aSym.GetBuffer()[0] == '\\' ) + else if( aSym.getStr()[0] == '\\' ) return eCurTok = IDIV; else { @@ -367,17 +373,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 +390,7 @@ SbiToken SbiTokenizer::Next() } } while( delta ); // Symbol? if not >= token - sal_Unicode ch = aSym.GetBuffer()[0]; + sal_Unicode ch = aSym.getStr()[0]; if( !BasicSimpleCharClass::isAlpha( ch, bCompatible ) && !bSymbol ) return eCurTok = (SbiToken) (ch & 0x00FF); return eCurTok = SYMBOL; @@ -457,7 +462,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 ed268d9..1587077 100644 --- a/sal/inc/rtl/ustring.hxx +++ b/sal/inc/rtl/ustring.hxx @@ -596,6 +596,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 From 5c5779575db7bf30d3a267395aa6391b33485b70 Mon Sep 17 00:00:00 2001 From: August Sodora <aasod...@oc8513601644.ibm.com> Date: Sun, 2 Oct 2011 19:39:05 -0400 Subject: [PATCH 2/2] String->OUString --- basic/source/comp/scanner.cxx | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/basic/source/comp/scanner.cxx b/basic/source/comp/scanner.cxx index 767945f..9e67144 100644 --- a/basic/source/comp/scanner.cxx +++ b/basic/source/comp/scanner.cxx @@ -448,14 +448,14 @@ sal_Bool SbiScanner::NextSym() else aSym = aLine.copy( n, nCol - n - 1 ); // get out duplicate string delimiters - String s( cSep ); - s += cSep; + ::rtl::OUString s = ::rtl::OUString::valueOf( static_cast<sal_Unicode>( cSep ) ); + s += s; sal_Int32 nIdx = 0; do { ::rtl::OUStringBuffer aSymBuf(aSym); nIdx = aSym.indexOf( s, nIdx ); - if( nIdx >= 0 ) + if( nIdx < 0 ) break; aSymBuf.remove( nIdx, 1 ); aSym = aSymBuf.makeStringAndClear(); -- 1.7.4.4
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice