b24a4d255d
found by tweaking the loplugin:stringview and making it whitelist getLength Change-Id: Ic15d3703d1fb07658e99e1db1c89e2fa5bc70c19 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132771 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
156 lines
4.2 KiB
C++
156 lines
4.2 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* This file is part of the LibreOffice project.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
#include <sal/config.h>
|
|
|
|
#include <libxml/parser.h>
|
|
|
|
#include <o3tl/safeint.hxx>
|
|
#include <o3tl/string_view.hxx>
|
|
#include <rtl/strbuf.hxx>
|
|
|
|
#include <helper.hxx>
|
|
|
|
namespace helper {
|
|
|
|
OString escapeAll(
|
|
std::string_view rText, std::string_view rUnEscaped, std::string_view rEscaped )
|
|
{
|
|
assert( rEscaped.size() == 2*rUnEscaped.size() );
|
|
OStringBuffer sReturn;
|
|
for ( size_t nIndex = 0; nIndex < rText.size(); ++nIndex )
|
|
{
|
|
size_t nUnEscapedOne = rUnEscaped.find(rText[nIndex]);
|
|
if( nUnEscapedOne != std::string_view::npos )
|
|
{
|
|
sReturn.append(rEscaped.substr(nUnEscapedOne*2,2));
|
|
}
|
|
else
|
|
sReturn.append(rText[nIndex]);
|
|
}
|
|
return sReturn.makeStringAndClear();
|
|
}
|
|
|
|
|
|
OString unEscapeAll(
|
|
std::string_view rText, std::string_view rEscaped, std::string_view rUnEscaped)
|
|
{
|
|
assert( rEscaped.size() == 2*rUnEscaped.length() );
|
|
OStringBuffer sReturn;
|
|
const size_t nLength = rText.size();
|
|
for ( size_t nIndex = 0; nIndex < nLength; ++nIndex )
|
|
{
|
|
if( rText[nIndex] == '\\' && nIndex+1 < nLength )
|
|
{
|
|
size_t nEscapedOne = rEscaped.find(rText.substr(nIndex,2));
|
|
if( nEscapedOne != std::string_view::npos )
|
|
{
|
|
sReturn.append(rUnEscaped[nEscapedOne/2]);
|
|
++nIndex;
|
|
}
|
|
else
|
|
{
|
|
sReturn.append(rText[nIndex]);
|
|
}
|
|
}
|
|
else
|
|
sReturn.append(rText[nIndex]);
|
|
}
|
|
return sReturn.makeStringAndClear();
|
|
}
|
|
|
|
|
|
OString QuotHTML(std::string_view rString)
|
|
{
|
|
OStringBuffer sReturn;
|
|
for (size_t i = 0; i < rString.size(); ++i)
|
|
{
|
|
switch (rString[i])
|
|
{
|
|
case '<':
|
|
sReturn.append("<");
|
|
break;
|
|
case '>':
|
|
sReturn.append(">");
|
|
break;
|
|
case '"':
|
|
sReturn.append(""");
|
|
break;
|
|
case '\'':
|
|
sReturn.append("'");
|
|
break;
|
|
case '&':
|
|
if (o3tl::starts_with(rString.substr(i), "&"))
|
|
sReturn.append('&');
|
|
else
|
|
sReturn.append("&");
|
|
break;
|
|
default:
|
|
sReturn.append(rString[i]);
|
|
break;
|
|
}
|
|
}
|
|
return sReturn.makeStringAndClear();
|
|
}
|
|
|
|
OString UnQuotHTML( std::string_view rString )
|
|
{
|
|
OStringBuffer sReturn;
|
|
for (size_t i = 0; i != rString.size();) {
|
|
auto tmp = rString.substr(i);
|
|
if (o3tl::starts_with(tmp, "&")) {
|
|
sReturn.append('&');
|
|
i += RTL_CONSTASCII_LENGTH("&");
|
|
} else if (o3tl::starts_with(tmp, "<")) {
|
|
sReturn.append('<');
|
|
i += RTL_CONSTASCII_LENGTH("<");
|
|
} else if (o3tl::starts_with(tmp, ">")) {
|
|
sReturn.append('>');
|
|
i += RTL_CONSTASCII_LENGTH(">");
|
|
} else if (o3tl::starts_with(tmp, """)) {
|
|
sReturn.append('"');
|
|
i += RTL_CONSTASCII_LENGTH(""");
|
|
} else if (o3tl::starts_with(tmp, "'")) {
|
|
sReturn.append('\'');
|
|
i += RTL_CONSTASCII_LENGTH("'");
|
|
} else {
|
|
sReturn.append(rString[i]);
|
|
++i;
|
|
}
|
|
}
|
|
return sReturn.makeStringAndClear();
|
|
}
|
|
|
|
bool isWellFormedXML( std::string_view text )
|
|
{
|
|
xmlDocPtr doc;
|
|
bool result = true;
|
|
|
|
OString content = OString::Concat("<root>") + text + "</root>";
|
|
doc = xmlParseMemory(content.getStr(),static_cast<int>(content.getLength()));
|
|
if (doc == nullptr) {
|
|
result = false;
|
|
}
|
|
xmlFreeDoc(doc);
|
|
xmlCleanupParser();
|
|
return result;
|
|
}
|
|
|
|
//Convert xmlChar* to OString
|
|
OString xmlStrToOString( const xmlChar* pString )
|
|
{
|
|
xmlChar* pTemp = xmlStrdup( pString );
|
|
OString sResult = reinterpret_cast<char*>( pTemp );
|
|
xmlFree( pTemp );
|
|
return sResult;
|
|
}
|
|
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|