summaryrefslogtreecommitdiff
path: root/l10ntools/source/po.cxx
diff options
context:
space:
mode:
authorZolnai Tamás <zolnaitamas2000g@gmail.com>2012-11-19 18:19:52 +0100
committerZolnai Tamás <zolnaitamas2000g@gmail.com>2012-11-19 18:34:32 +0100
commit7429ab2e2caa49466a455ad3e2e04057524225d0 (patch)
tree0a08ac334ad55ff4e2214c9eae2f092efce05225 /l10ntools/source/po.cxx
parentc82935d52db04230c77b4a6df7dda07507b34805 (diff)
Use icu regex in l10ntools instead of i18nregexp
Change-Id: I9062aafa2fefa26b7b1edf0440f4675b2f469e5d
Diffstat (limited to 'l10ntools/source/po.cxx')
-rw-r--r--l10ntools/source/po.cxx77
1 files changed, 26 insertions, 51 deletions
diff --git a/l10ntools/source/po.cxx b/l10ntools/source/po.cxx
index 648634c2f569..1be60ecaf312 100644
--- a/l10ntools/source/po.cxx
+++ b/l10ntools/source/po.cxx
@@ -7,10 +7,6 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
-#include <com/sun/star/util/SearchOptions.hpp>
-#include <com/sun/star/util/SearchFlags.hpp>
-#include <com/sun/star/i18n/XExtendedTransliteration.hpp>
-#include <regexp/reclass.hxx>
#include <rtl/ustring.hxx>
#include <cstring>
@@ -21,12 +17,15 @@
#include <string>
#include <boost/crc.hpp>
+#include <unicode/regex.h>
#include "po.hxx"
#define POESCAPED OString("\\n\\t\\r\\\\\\\"")
#define POUNESCAPED OString("\n\t\r\\\"")
+using namespace U_ICU_NAMESPACE;
+
//Class GenPoEntry
class GenPoEntry
@@ -317,61 +316,37 @@ namespace
return lcl_UnEscapeText(rText,"\\n\\t\\r","\n\t\r");
}
- //Miminize the length of the regular expression result
- static void lcl_Minimize(
- const OUString& rText, Regexpr& io_rRegExp, re_registers& io_rRegs )
- {
- re_registers aPrevRegs;
- const sal_Int32 nStart = io_rRegs.start[0];
- do
- {
- const OUString sTemp = rText.copy(0,io_rRegs.end[0]-1);
- memcpy(
- static_cast<void*>(&aPrevRegs),
- static_cast<void*>(&io_rRegs),
- sizeof(re_registers));
- memset(static_cast<void*>(&io_rRegs), 0, sizeof(re_registers));
- io_rRegExp.set_line(sTemp.getStr(),sTemp.getLength());
- io_rRegExp.re_search(&io_rRegs,nStart);
- } while(io_rRegs.num_of_match);
-
- memcpy(static_cast<void*>(&io_rRegs),static_cast<void*>(&aPrevRegs),
- sizeof(re_registers));
- io_rRegExp.set_line(rText.getStr(),rText.getLength());
- }
-
//Find all special tag in a string using a regular expression
static void lcl_FindAllTag(
const OString& rText,std::vector<OString>& o_vFoundTags )
{
- ::com::sun::star::util::SearchOptions aOptions;
- aOptions.algorithmType =
- ::com::sun::star::util::SearchAlgorithms_REGEXP;
- aOptions.searchFlag =
- ::com::sun::star::util::SearchFlags::NORM_WORD_ONLY;
- aOptions.searchString = "<[/]?[a-z_\\-]+(| +[a-z]+=\".*\") *[/]?>";
- ::com::sun::star::uno::Reference<
- ::com::sun::star::i18n::XExtendedTransliteration > xTrans;
-
- Regexpr aRegExp(aOptions,xTrans);
- const OUString sTemp(OStringToOUString(rText,RTL_TEXTENCODING_UTF8));
- aRegExp.set_line(sTemp.getStr(),sTemp.getLength());
-
- re_registers aRegs;
- memset(static_cast<void*>(&aRegs), 0, sizeof(re_registers));
- sal_Int32 nStart = 0;
- o_vFoundTags.resize(0);
- aRegExp.re_search(&aRegs,nStart);
- while(aRegs.num_of_match)
+
+ UErrorCode nIcuErr = U_ZERO_ERROR;
+ sal_uInt32 nSearchFlags = UREGEX_DOTALL | UREGEX_CASE_INSENSITIVE;
+ OUString sLocaleText( OStringToOUString(rText,RTL_TEXTENCODING_UTF8) );
+ OUString sPattern( "<[/]??[a-z_-]+?(?:| +[a-z]+?=\".*?\") *[/]??>" );
+ UnicodeString sSearchPat(
+ reinterpret_cast<const UChar*>(
+ sPattern.getStr()), sPattern.getLength() );
+ UnicodeString sSource(
+ reinterpret_cast<const UChar*>(
+ sLocaleText.getStr()), sLocaleText.getLength() );
+
+ RegexMatcher aRegexMatcher( sSearchPat, nSearchFlags, nIcuErr );
+ aRegexMatcher.reset( sSource );
+ int64_t nStartPos = 0;
+ while( aRegexMatcher.find(nStartPos, nIcuErr) &&
+ nIcuErr == U_ZERO_ERROR )
{
- lcl_Minimize(sTemp,aRegExp,aRegs);
+ UnicodeString sMatch =
+ aRegexMatcher.group(nIcuErr);
o_vFoundTags.push_back(
OUStringToOString(
- sTemp.copy(aRegs.start[0],aRegs.end[0]-aRegs.start[0]),
+ OUString(
+ reinterpret_cast<const sal_Unicode*>(
+ sMatch.getBuffer()),sMatch.length()),
RTL_TEXTENCODING_UTF8));
- nStart = aRegs.end[0];
- memset(static_cast<void*>(&aRegs), 0, sizeof(re_registers));
- aRegExp.re_search(&aRegs,nStart);
+ nStartPos = aRegexMatcher.start(nIcuErr)+1;
}
}