This is an automated email from the ASF dual-hosted git repository.

damjan pushed a commit to branch icu-c-api
in repository https://gitbox.apache.org/repos/asf/openoffice.git

commit dd866940559eeefe0eedaee0ab9840604e5eacc3
Author: Damjan Jovanovic <[email protected]>
AuthorDate: Thu May 1 10:59:17 2025 +0200

    Use only the C API for ICU in forms, so it can use newer ICU versions.
    
    Patch by: me
---
 main/forms/source/xforms/datatypes.cxx             | 31 +++++++++++++---------
 main/forms/source/xforms/datatypes.hxx             |  4 +--
 .../source/xforms/warnings_guard_unicode_regex.h   |  5 +++-
 3 files changed, 24 insertions(+), 16 deletions(-)

diff --git a/main/forms/source/xforms/datatypes.cxx 
b/main/forms/source/xforms/datatypes.cxx
index 29d828c6d0..6b30ad2a9e 100644
--- a/main/forms/source/xforms/datatypes.cxx
+++ b/main/forms/source/xforms/datatypes.cxx
@@ -84,6 +84,8 @@ namespace xforms
     //--------------------------------------------------------------------
     OXSDDataType::~OXSDDataType()
     {
+        if ( m_pPatternMatcher )
+            uregex_close( m_pPatternMatcher );
     }
 
     //--------------------------------------------------------------------
@@ -207,24 +209,26 @@ namespace xforms
     //--------------------------------------------------------------------
     namespace
     {
-        static void lcl_initializePatternMatcher( ::std::auto_ptr< 
RegexMatcher >& _rpMatcher, const ::rtl::OUString& _rPattern )
+        static void lcl_initializePatternMatcher( URegularExpression 
**_ppMatcher, const ::rtl::OUString& _rPattern )
         {
             UErrorCode nMatchStatus = U_ZERO_ERROR;
-            UnicodeString aIcuPattern( reinterpret_cast<const UChar 
*>(_rPattern.getStr()), _rPattern.getLength() );   // UChar != sal_Unicode in 
MinGW
-            _rpMatcher.reset( new RegexMatcher( aIcuPattern, 0, nMatchStatus ) 
);
+            if ( *_ppMatcher ) {
+                uregex_close( *_ppMatcher );
+                *_ppMatcher = NULL;
+            }
+            *_ppMatcher = uregex_open( reinterpret_cast<const UChar 
*>(_rPattern.getStr()), _rPattern.getLength(), 0, NULL, &nMatchStatus );
             OSL_ENSURE( U_SUCCESS( nMatchStatus ), 
"lcl_initializePatternMatcher: invalid pattern property!" );
                 // if asserts, then something changed our pattern without 
going to convertFastPropertyValue/checkPropertySanity
         }
 
-        static bool lcl_matchString( RegexMatcher& _rMatcher, const 
::rtl::OUString& _rText )
+        static bool lcl_matchString( URegularExpression *_pMatcher, const 
::rtl::OUString& _rText )
         {
             UErrorCode nMatchStatus = U_ZERO_ERROR;
-            UnicodeString aInput( reinterpret_cast<const UChar 
*>(_rText.getStr()), _rText.getLength() );      // UChar != sal_Unicode in MinGW
-            _rMatcher.reset( aInput );
-            if ( _rMatcher.matches( nMatchStatus ) )
+            uregex_setText( _pMatcher, reinterpret_cast<const UChar 
*>(_rText.getStr()), _rText.getLength(), &nMatchStatus ); // UChar != 
sal_Unicode in MinGW
+            if ( uregex_matches( _pMatcher, 0, &nMatchStatus ) )
             {
-                int32_t nStart = _rMatcher.start( nMatchStatus );
-                int32_t nEnd   = _rMatcher.end  ( nMatchStatus );
+                int32_t nStart = uregex_start( _pMatcher, 0, &nMatchStatus );
+                int32_t nEnd   = uregex_end  ( _pMatcher, 0, &nMatchStatus );
                 if ( ( nStart == 0 ) && ( nEnd == _rText.getLength() ) )
                     return true;
             }
@@ -245,12 +249,12 @@ namespace xforms
             // ensure our pattern matcher is up to date
             if ( m_bPatternMatcherDirty )
             {
-                lcl_initializePatternMatcher( m_pPatternMatcher, m_sPattern );
+                lcl_initializePatternMatcher( &m_pPatternMatcher, m_sPattern );
                 m_bPatternMatcherDirty = false;
             }
 
             // let it match the string
-            if ( !lcl_matchString( *m_pPatternMatcher.get(), _rValue ) )
+            if ( !lcl_matchString( m_pPatternMatcher, _rValue ) )
                 return RID_STR_XFORMS_PATTERN_DOESNT_MATCH;
         }
 
@@ -293,14 +297,15 @@ namespace xforms
             ::rtl::OUString sPattern;
             OSL_VERIFY( _rNewValue >>= sPattern );
 
-            UnicodeString aIcuPattern( reinterpret_cast<const UChar 
*>(sPattern.getStr()), sPattern.getLength() );     // UChar != sal_Unicode in 
MinGW
             UErrorCode nMatchStatus = U_ZERO_ERROR;
-            RegexMatcher aMatcher( aIcuPattern, 0, nMatchStatus );
+            // UChar != sal_Unicode in MinGW
+            URegularExpression *aMatcher = uregex_open( reinterpret_cast<const 
UChar *>(sPattern.getStr()), sPattern.getLength(), 0, NULL, &nMatchStatus );
             if ( U_FAILURE( nMatchStatus ) )
             {
                 _rErrorMessage = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 
"This is no valid pattern." ) );
                 return false;
             }
+            uregex_close( aMatcher );
         }
         return true;
     }
diff --git a/main/forms/source/xforms/datatypes.hxx 
b/main/forms/source/xforms/datatypes.hxx
index db68d6a7de..58c6d0c180 100644
--- a/main/forms/source/xforms/datatypes.hxx
+++ b/main/forms/source/xforms/datatypes.hxx
@@ -67,8 +67,8 @@ namespace xforms
         sal_uInt16      m_nWST;
         // </properties>
 
-        ::std::auto_ptr< U_NAMESPACE_QUALIFIER RegexMatcher >
-                        m_pPatternMatcher;
+        URegularExpression
+                       *m_pPatternMatcher;
         bool            m_bPatternMatcherDirty;
 
     protected:
diff --git a/main/forms/source/xforms/warnings_guard_unicode_regex.h 
b/main/forms/source/xforms/warnings_guard_unicode_regex.h
index 10566e84ea..326fa498b4 100644
--- a/main/forms/source/xforms/warnings_guard_unicode_regex.h
+++ b/main/forms/source/xforms/warnings_guard_unicode_regex.h
@@ -24,6 +24,9 @@
 #ifndef INCLUDED_WARNINGS_GUARD_UNICODE_REGEX_H
 #define INCLUDED_WARNINGS_GUARD_UNICODE_REGEX_H
 
+#define U_SHOW_CPLUSPLUS_API 0
+#define U_SHOW_CPLUSPLUS_HEADER_API 0
+
 // Because the GCC system_header mechanism doesn't work in .c/.cxx compilation
 // units and more important affects the rest of the current include file, the
 // warnings guard is separated into this header file on its own.
@@ -36,7 +39,7 @@
 #elif defined __GNUC__
 #pragma GCC system_header
 #endif
-#include <unicode/regex.h>
+#include <unicode/uregex.h>
 #ifdef _MSC_VER
 #pragma warning(pop)
 #endif

Reply via email to