diff options
author | August Sodora <augsod@gmail.com> | 2011-11-20 17:15:33 -0500 |
---|---|---|
committer | August Sodora <augsod@gmail.com> | 2011-11-20 17:16:35 -0500 |
commit | 7cc258f35b5b2eef542827ddf03323c5c2b6c794 (patch) | |
tree | fc3c759c8e1fc1a47ec3cca0e017b0436d484a81 /basic | |
parent | 13f1110f6e990c4304cbc84b258f07244c05a5d2 (diff) |
Refactor BasicCharClass out from scanner and make it a singleton
Diffstat (limited to 'basic')
-rw-r--r-- | basic/Library_sb.mk | 1 | ||||
-rw-r--r-- | basic/source/comp/scanner.cxx | 110 | ||||
-rw-r--r-- | basic/source/comp/token.cxx | 4 | ||||
-rw-r--r-- | basic/source/inc/scanner.hxx | 40 |
4 files changed, 13 insertions, 142 deletions
diff --git a/basic/Library_sb.mk b/basic/Library_sb.mk index 8b2e152a874c..50608d4e0585 100644 --- a/basic/Library_sb.mk +++ b/basic/Library_sb.mk @@ -80,6 +80,7 @@ $(eval $(call gb_Library_add_exception_objects,sb,\ basic/source/classes/sbintern \ basic/source/classes/sbunoobj \ basic/source/classes/sbxmod \ + basic/source/comp/basiccharclass \ basic/source/comp/buffer \ basic/source/comp/codegen \ basic/source/comp/dim \ diff --git a/basic/source/comp/scanner.cxx b/basic/source/comp/scanner.cxx index 3336f0d4ce5d..8c0d10c2b6d7 100644 --- a/basic/source/comp/scanner.cxx +++ b/basic/source/comp/scanner.cxx @@ -29,6 +29,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_basic.hxx" +#include "basiccharclass.hxx" #include "sbcomp.hxx" #include <vcl/svapp.hxx> @@ -151,20 +152,10 @@ static SbxDataType GetSuffixType( sal_Unicode c ) // return value is sal_False at EOF or errors #define BUF_SIZE 80 -namespace { - -/** Returns true, if the passed character is a white space character. */ -inline bool lclIsWhitespace( sal_Unicode cChar ) -{ - return (cChar == ' ') || (cChar == '\t') || (cChar == '\f'); -} - -} // namespace - void SbiScanner::scanGoto() { short nTestCol = nCol; - while(nTestCol < aLine.getLength() && lclIsWhitespace(aLine[nTestCol])) + while(nTestCol < aLine.getLength() && theBasicCharClass::get().isWhitespace(aLine[nTestCol])) nTestCol++; if(nTestCol + 1 < aLine.getLength()) @@ -206,7 +197,7 @@ bool SbiScanner::NextSym() p2++, n++; // #163944# ignore trailing whitespace sal_Int32 nCopyEndPos = n; - while( (nBufPos < nCopyEndPos) && lclIsWhitespace( aBuf[ nCopyEndPos - 1 ] ) ) + while( (nBufPos < nCopyEndPos) && theBasicCharClass::get().isWhitespace( aBuf[ nCopyEndPos - 1 ] ) ) --nCopyEndPos; aLine = aBuf.copy( nBufPos, nCopyEndPos - nBufPos ); if( n < nLen ) @@ -224,7 +215,7 @@ bool SbiScanner::NextSym() } - while( lclIsWhitespace( *pLine ) ) + while( theBasicCharClass::get().isWhitespace( *pLine ) ) pLine++, nCol++, bSpaces = true; nCol1 = nCol; @@ -244,7 +235,7 @@ bool SbiScanner::NextSym() } // copy character if symbol - if( BasicSimpleCharClass::isAlpha( *pLine, bCompatible ) || *pLine == '_' ) + if( theBasicCharClass::get().isAlpha( *pLine, bCompatible ) || *pLine == '_' ) { // if there's nothing behind '_' , it's the end of a line! if( *pLine == '_' && !*(pLine+1) ) @@ -252,7 +243,7 @@ bool SbiScanner::NextSym() goto eoln; } bSymbol = true; short n = nCol; - for ( ; (BasicSimpleCharClass::isAlphaNumeric( *pLine, bCompatible ) || ( *pLine == '_' ) ); pLine++ ) + for ( ; (theBasicCharClass::get().isAlphaNumeric( *pLine, bCompatible ) || ( *pLine == '_' ) ); pLine++ ) nCol++; aSym = aLine.copy( n, nCol - n ); @@ -275,7 +266,7 @@ bool SbiScanner::NextSym() // type recognition? // don't test the exclamation mark // if there's a symbol behind it - else if( *pLine != '!' || !BasicSimpleCharClass::isAlpha( pLine[ 1 ], bCompatible ) ) + else if( *pLine != '!' || !theBasicCharClass::get().isAlpha( pLine[ 1 ], bCompatible ) ) { SbxDataType t = GetSuffixType( *pLine ); if( t != SbxVARIANT ) @@ -288,8 +279,8 @@ bool SbiScanner::NextSym() } // read in and convert if number - else if( BasicSimpleCharClass::isDigit( *pLine & 0xFF ) - || ( *pLine == '.' && BasicSimpleCharClass::isDigit( *(pLine+1) & 0xFF ) ) ) + else if( theBasicCharClass::get().isDigit( *pLine & 0xFF ) + || ( *pLine == '.' && theBasicCharClass::get().isDigit( *(pLine+1) & 0xFF ) ) ) { short exp = 0; short comma = 0; @@ -394,7 +385,7 @@ bool SbiScanner::NextSym() long l = 0; int i; bool bBufOverflow = false; - while( BasicSimpleCharClass::isAlphaNumeric( *pLine & 0xFF, bCompatible ) ) + while( theBasicCharClass::get().isAlphaNumeric( *pLine & 0xFF, bCompatible ) ) { sal_Unicode ch = sal::static_int_cast< sal_Unicode >( toupper( *pLine & 0xFF ) ); @@ -527,85 +518,4 @@ eoln: } } -LetterTable BasicSimpleCharClass::aLetterTable; - -LetterTable::LetterTable( void ) -{ - for( int i = 0 ; i < 256 ; ++i ) - IsLetterTab[i] = false; - - IsLetterTab[0xC0] = true; // , CAPITAL LETTER A WITH GRAVE ACCENT - IsLetterTab[0xC1] = true; // , CAPITAL LETTER A WITH ACUTE ACCENT - IsLetterTab[0xC2] = true; // , CAPITAL LETTER A WITH CIRCUMFLEX ACCENT - IsLetterTab[0xC3] = true; // , CAPITAL LETTER A WITH TILDE - IsLetterTab[0xC4] = true; // , CAPITAL LETTER A WITH DIAERESIS - IsLetterTab[0xC5] = true; // , CAPITAL LETTER A WITH RING ABOVE - IsLetterTab[0xC6] = true; // , CAPITAL LIGATURE AE - IsLetterTab[0xC7] = true; // , CAPITAL LETTER C WITH CEDILLA - IsLetterTab[0xC8] = true; // , CAPITAL LETTER E WITH GRAVE ACCENT - IsLetterTab[0xC9] = true; // , CAPITAL LETTER E WITH ACUTE ACCENT - IsLetterTab[0xCA] = true; // , CAPITAL LETTER E WITH CIRCUMFLEX ACCENT - IsLetterTab[0xCB] = true; // , CAPITAL LETTER E WITH DIAERESIS - IsLetterTab[0xCC] = true; // , CAPITAL LETTER I WITH GRAVE ACCENT - IsLetterTab[0xCD] = true; // , CAPITAL LETTER I WITH ACUTE ACCENT - IsLetterTab[0xCE] = true; // , CAPITAL LETTER I WITH CIRCUMFLEX ACCENT - IsLetterTab[0xCF] = true; // , CAPITAL LETTER I WITH DIAERESIS - IsLetterTab[0xD0] = true; // , CAPITAL LETTER ETH - IsLetterTab[0xD1] = true; // , CAPITAL LETTER N WITH TILDE - IsLetterTab[0xD2] = true; // , CAPITAL LETTER O WITH GRAVE ACCENT - IsLetterTab[0xD3] = true; // , CAPITAL LETTER O WITH ACUTE ACCENT - IsLetterTab[0xD4] = true; // , CAPITAL LETTER O WITH CIRCUMFLEX ACCENT - IsLetterTab[0xD5] = true; // , CAPITAL LETTER O WITH TILDE - IsLetterTab[0xD6] = true; // , CAPITAL LETTER O WITH DIAERESIS - IsLetterTab[0xD8] = true; // , CAPITAL LETTER O WITH STROKE - IsLetterTab[0xD9] = true; // , CAPITAL LETTER U WITH GRAVE ACCENT - IsLetterTab[0xDA] = true; // , CAPITAL LETTER U WITH ACUTE ACCENT - IsLetterTab[0xDB] = true; // , CAPITAL LETTER U WITH CIRCUMFLEX ACCENT - IsLetterTab[0xDC] = true; // , CAPITAL LETTER U WITH DIAERESIS - IsLetterTab[0xDD] = true; // , CAPITAL LETTER Y WITH ACUTE ACCENT - IsLetterTab[0xDE] = true; // , CAPITAL LETTER THORN - IsLetterTab[0xDF] = true; // , SMALL LETTER SHARP S - IsLetterTab[0xE0] = true; // , SMALL LETTER A WITH GRAVE ACCENT - IsLetterTab[0xE1] = true; // , SMALL LETTER A WITH ACUTE ACCENT - IsLetterTab[0xE2] = true; // , SMALL LETTER A WITH CIRCUMFLEX ACCENT - IsLetterTab[0xE3] = true; // , SMALL LETTER A WITH TILDE - IsLetterTab[0xE4] = true; // , SMALL LETTER A WITH DIAERESIS - IsLetterTab[0xE5] = true; // , SMALL LETTER A WITH RING ABOVE - IsLetterTab[0xE6] = true; // , SMALL LIGATURE AE - IsLetterTab[0xE7] = true; // , SMALL LETTER C WITH CEDILLA - IsLetterTab[0xE8] = true; // , SMALL LETTER E WITH GRAVE ACCENT - IsLetterTab[0xE9] = true; // , SMALL LETTER E WITH ACUTE ACCENT - IsLetterTab[0xEA] = true; // , SMALL LETTER E WITH CIRCUMFLEX ACCENT - IsLetterTab[0xEB] = true; // , SMALL LETTER E WITH DIAERESIS - IsLetterTab[0xEC] = true; // , SMALL LETTER I WITH GRAVE ACCENT - IsLetterTab[0xED] = true; // , SMALL LETTER I WITH ACUTE ACCENT - IsLetterTab[0xEE] = true; // , SMALL LETTER I WITH CIRCUMFLEX ACCENT - IsLetterTab[0xEF] = true; // , SMALL LETTER I WITH DIAERESIS - IsLetterTab[0xF0] = true; // , SMALL LETTER ETH - IsLetterTab[0xF1] = true; // , SMALL LETTER N WITH TILDE - IsLetterTab[0xF2] = true; // , SMALL LETTER O WITH GRAVE ACCENT - IsLetterTab[0xF3] = true; // , SMALL LETTER O WITH ACUTE ACCENT - IsLetterTab[0xF4] = true; // , SMALL LETTER O WITH CIRCUMFLEX ACCENT - IsLetterTab[0xF5] = true; // , SMALL LETTER O WITH TILDE - IsLetterTab[0xF6] = true; // , SMALL LETTER O WITH DIAERESIS - IsLetterTab[0xF8] = true; // , SMALL LETTER O WITH OBLIQUE BAR - IsLetterTab[0xF9] = true; // , SMALL LETTER U WITH GRAVE ACCENT - IsLetterTab[0xFA] = true; // , SMALL LETTER U WITH ACUTE ACCENT - IsLetterTab[0xFB] = true; // , SMALL LETTER U WITH CIRCUMFLEX ACCENT - IsLetterTab[0xFC] = true; // , SMALL LETTER U WITH DIAERESIS - IsLetterTab[0xFD] = true; // , SMALL LETTER Y WITH ACUTE ACCENT - IsLetterTab[0xFE] = true; // , SMALL LETTER THORN - IsLetterTab[0xFF] = true; // , SMALL LETTER Y WITH DIAERESIS -} - -bool LetterTable::isLetterUnicode( sal_Unicode c ) -{ - static CharClass* pCharClass = NULL; - if( pCharClass == NULL ) - pCharClass = new CharClass( Application::GetSettings().GetLocale() ); - String aStr( c ); - bool bRet = pCharClass->isLetter( aStr, 0 ); - return bRet; -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/basic/source/comp/token.cxx b/basic/source/comp/token.cxx index dc8287fe39e4..e3d7b1c0ea13 100644 --- a/basic/source/comp/token.cxx +++ b/basic/source/comp/token.cxx @@ -29,7 +29,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_basic.hxx" -#include <ctype.h> +#include "basiccharclass.hxx" #include "sbcomp.hxx" struct TokenTable { SbiToken t; const char *s; }; @@ -392,7 +392,7 @@ SbiToken SbiTokenizer::Next() } while( delta ); // Symbol? if not >= token sal_Unicode ch = aSym[0]; - if( !BasicSimpleCharClass::isAlpha( ch, bCompatible ) && !bSymbol ) + if( !theBasicCharClass::get().isAlpha( ch, bCompatible ) && !bSymbol ) return eCurTok = (SbiToken) (ch & 0x00FF); return eCurTok = SYMBOL; } diff --git a/basic/source/inc/scanner.hxx b/basic/source/inc/scanner.hxx index e98ebc32c9f3..c254cf2977b3 100644 --- a/basic/source/inc/scanner.hxx +++ b/basic/source/inc/scanner.hxx @@ -103,46 +103,6 @@ public: double GetDbl() { return nVal; } }; -class LetterTable -{ - bool IsLetterTab[256]; - -public: - LetterTable( void ); - - inline bool isLetter( sal_Unicode c ) - { - bool bRet = (c < 256) ? IsLetterTab[c] : isLetterUnicode( c ); - return bRet; - } - bool isLetterUnicode( sal_Unicode c ); -}; - -class BasicSimpleCharClass -{ - static LetterTable aLetterTable; - -public: - static sal_Bool isAlpha( sal_Unicode c, bool bCompatible ) - { - sal_Bool bRet = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') - || (bCompatible && aLetterTable.isLetter( c )); - return bRet; - } - - static sal_Bool isDigit( sal_Unicode c ) - { - sal_Bool bRet = (c >= '0' && c <= '9'); - return bRet; - } - - static sal_Bool isAlphaNumeric( sal_Unicode c, bool bCompatible ) - { - sal_Bool bRet = isDigit( c ) || isAlpha( c, bCompatible ); - return bRet; - } -}; - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |