tdf#147921 Filesave DOC: wrong layout and then all missing from 7.3
regression from
commit 990b2cb056788f7f412656a303456d90c003cf83
Author: Noel Grandin <noel@peralex.com>
Date: Mon Jun 21 13:00:07 2021 +0200
simplify and improve Wildcard
Cannot pass a string_view into something expecting a char* because
then it gets the length wrong.
Change-Id: I638660a1e9a8a0d17e4d2f77500b3f01365a43d3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131396
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
(cherry picked from commit a378ac93e1b4e3c0dacdd3f0a3500813714537c7)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131595
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
diff --git a/include/tools/wldcrd.hxx b/include/tools/wldcrd.hxx
index dfb1e9d..41288f1 100644
--- a/include/tools/wldcrd.hxx
+++ b/include/tools/wldcrd.hxx
@@ -33,7 +33,7 @@ private:
OUString aWildString;
char cSepSymbol;
static bool ImpMatch( const sal_Unicode *pWild, const sal_Unicode *pStr );
static bool ImpMatch( std::u16string_view aWild, std::u16string_view aStr );
public:
WildCard()
diff --git a/tools/source/fsys/wldcrd.cxx b/tools/source/fsys/wldcrd.cxx
index 6e02596..a9867c0 100644
--- a/tools/source/fsys/wldcrd.cxx
+++ b/tools/source/fsys/wldcrd.cxx
@@ -25,22 +25,26 @@
* '?' in pWild mean match exactly one character.
*
*/
bool WildCard::ImpMatch( const sal_Unicode *pWild, const sal_Unicode *pStr )
bool WildCard::ImpMatch( std::u16string_view aWild, std::u16string_view aStr )
{
int pos=0;
int flag=0;
const sal_Unicode* pWild = aWild.data();
const sal_Unicode* pWildEnd = aWild.data() + aWild.size();
const sal_Unicode* pStr = aStr.data();
const sal_Unicode* pStrEnd = aStr.data() + aStr.size();
while ( *pWild || flag )
while ( pWild != pWildEnd || flag )
{
switch (*pWild)
{
case '?':
if ( *pStr == '\0' )
if ( pStr == pStrEnd )
return false;
break;
default:
if ( (*pWild == '\\') && ((*(pWild+1)=='?') || (*(pWild+1) == '*')) )
if ( (*pWild == '\\') && (pWild + 1 != pWildEnd) && ((*(pWild+1)=='?') || (*(pWild+1) == '*')) )
pWild++;
if ( *pWild != *pStr )
if ( !pos )
@@ -53,37 +57,37 @@ bool WildCard::ImpMatch( const sal_Unicode *pWild, const sal_Unicode *pStr )
// circumstances!
[[fallthrough]];
case '*':
while ( *pWild == '*' )
while ( pWild != pWildEnd && *pWild == '*' )
pWild++;
if ( *pWild == '\0' )
if ( pWild == pWildEnd )
return true;
flag = 1;
pos = 0;
if ( *pStr == '\0' )
return ( *pWild == '\0' );
while ( *pStr && *pStr != *pWild )
if ( pStr == pStrEnd )
return false;
while ( pStr != pStrEnd && *pStr != *pWild )
{
if ( *pWild == '?' ) {
pWild++;
while ( *pWild == '*' )
while ( pWild != pWildEnd && *pWild == '*' )
pWild++;
}
pStr++;
if ( *pStr == '\0' )
return ( *pWild == '\0' );
if ( pStr == pStrEnd )
return pWild == pWildEnd;
}
break;
}
if ( *pWild != '\0' )
if ( pWild != pWildEnd )
pWild++;
if ( *pStr != '\0' )
if ( pStr != pStrEnd )
pStr++;
else
flag = 0;
if ( flag )
pos--;
}
return ( *pStr == '\0' ) && ( *pWild == '\0' );
return ( pStr == pStrEnd ) && ( pWild == pWildEnd );
}
bool WildCard::Matches( std::u16string_view rString ) const
@@ -97,13 +101,13 @@ bool WildCard::Matches( std::u16string_view rString ) const
while ( (nSepPos = aTmpWild.indexOf(cSepSymbol)) != -1 )
{
// Check all split wildcards
if ( ImpMatch( aTmpWild.subView( 0, nSepPos ).data(), rString.data() ) )
if ( ImpMatch( aTmpWild.subView( 0, nSepPos ), rString ) )
return true;
aTmpWild = aTmpWild.copy(nSepPos + 1); // remove separator
}
}
return ImpMatch( aTmpWild.getStr(), rString.data() );
return ImpMatch( aTmpWild, rString );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */