forked from qt-creator/qt-creator
Utils: Add function to normalize lineendings in a QByteArray
Replaces "\r\n" by "\n". Also read back-to-front to save some cycles Done-with: David Schulz Change-Id: Ifa5e1ccde2da40e9b18b5ea9d60d580f8429ad19 Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -387,11 +387,20 @@ QTCREATOR_UTILS_EXPORT QStringView chopIfEndsWith(QStringView str, QChar c)
|
||||
QTCREATOR_UTILS_EXPORT QString normalizeNewlines(const QString &text)
|
||||
{
|
||||
QString res = text;
|
||||
const auto newEnd = std::unique(res.begin(), res.end(), [](const QChar c1, const QChar c2) {
|
||||
return c1 == '\r' && c2 == '\r'; // QTCREATORBUG-24556
|
||||
const auto newEnd = std::unique(res.rbegin(), res.rend(), [](const QChar c1, const QChar c2) {
|
||||
return c1 == '\n' && c2 == '\r'; // QTCREATORBUG-24556
|
||||
});
|
||||
res.chop(std::distance(newEnd, res.end()));
|
||||
res.replace("\r\n", "\n");
|
||||
res.remove(0, std::distance(newEnd, res.rend()));
|
||||
return res;
|
||||
}
|
||||
|
||||
QTCREATOR_UTILS_EXPORT QByteArray normalizeNewlines(const QByteArray &text)
|
||||
{
|
||||
QByteArray res = text;
|
||||
const auto newEnd = std::unique(res.rbegin(), res.rend(), [](const char c1, const char c2) {
|
||||
return c1 == '\n' && c2 == '\r'; // QTCREATORBUG-24556
|
||||
});
|
||||
res.remove(0, std::distance(newEnd, res.rend()));
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@@ -90,6 +90,7 @@ QTCREATOR_UTILS_EXPORT QString chopIfEndsWith(QString str, QChar c);
|
||||
QTCREATOR_UTILS_EXPORT QStringView chopIfEndsWith(QStringView str, QChar c);
|
||||
|
||||
QTCREATOR_UTILS_EXPORT QString normalizeNewlines(const QString &text);
|
||||
QTCREATOR_UTILS_EXPORT QByteArray normalizeNewlines(const QByteArray &text);
|
||||
|
||||
// Skips empty parts - see QTBUG-110900
|
||||
QTCREATOR_UTILS_EXPORT QString joinStrings(const QStringList &strings, QChar separator);
|
||||
|
@@ -30,6 +30,8 @@ private slots:
|
||||
void testSplitAtFirst();
|
||||
void testAsciify_data();
|
||||
void testAsciify();
|
||||
void testNormalizeNewlinesInString();
|
||||
void testNormalizeNewlinesInByteArray();
|
||||
};
|
||||
|
||||
void tst_StringUtils::testWithTildeHomePath()
|
||||
@@ -355,6 +357,27 @@ void tst_StringUtils::testAsciify()
|
||||
QCOMPARE(asciified, expected);
|
||||
}
|
||||
|
||||
void tst_StringUtils::testNormalizeNewlinesInString()
|
||||
{
|
||||
const QString input = "asd\r\r\nfoo\r\nbar\nfoo\r";
|
||||
const QString expected = "asd\nfoo\nbar\nfoo\r";
|
||||
|
||||
const QString normalized = Utils::normalizeNewlines(input);
|
||||
|
||||
QCOMPARE(normalized, expected);
|
||||
}
|
||||
|
||||
void tst_StringUtils::testNormalizeNewlinesInByteArray()
|
||||
{
|
||||
const QByteArray input = "asd\r\r\nfoo\r\nbar\nfoo\r";
|
||||
const QByteArray expected = "asd\nfoo\nbar\nfoo\r";
|
||||
|
||||
const QByteArray normalized = Utils::normalizeNewlines(input);
|
||||
|
||||
QCOMPARE(normalized, expected);
|
||||
}
|
||||
|
||||
|
||||
QTEST_GUILESS_MAIN(tst_StringUtils)
|
||||
|
||||
#include "tst_stringutils.moc"
|
||||
|
Reference in New Issue
Block a user