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)
|
QTCREATOR_UTILS_EXPORT QString normalizeNewlines(const QString &text)
|
||||||
{
|
{
|
||||||
QString res = text;
|
QString res = text;
|
||||||
const auto newEnd = std::unique(res.begin(), res.end(), [](const QChar c1, const QChar c2) {
|
const auto newEnd = std::unique(res.rbegin(), res.rend(), [](const QChar c1, const QChar c2) {
|
||||||
return c1 == '\r' && c2 == '\r'; // QTCREATORBUG-24556
|
return c1 == '\n' && c2 == '\r'; // QTCREATORBUG-24556
|
||||||
});
|
});
|
||||||
res.chop(std::distance(newEnd, res.end()));
|
res.remove(0, std::distance(newEnd, res.rend()));
|
||||||
res.replace("\r\n", "\n");
|
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;
|
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 QStringView chopIfEndsWith(QStringView str, QChar c);
|
||||||
|
|
||||||
QTCREATOR_UTILS_EXPORT QString normalizeNewlines(const QString &text);
|
QTCREATOR_UTILS_EXPORT QString normalizeNewlines(const QString &text);
|
||||||
|
QTCREATOR_UTILS_EXPORT QByteArray normalizeNewlines(const QByteArray &text);
|
||||||
|
|
||||||
// Skips empty parts - see QTBUG-110900
|
// Skips empty parts - see QTBUG-110900
|
||||||
QTCREATOR_UTILS_EXPORT QString joinStrings(const QStringList &strings, QChar separator);
|
QTCREATOR_UTILS_EXPORT QString joinStrings(const QStringList &strings, QChar separator);
|
||||||
|
@@ -30,6 +30,8 @@ private slots:
|
|||||||
void testSplitAtFirst();
|
void testSplitAtFirst();
|
||||||
void testAsciify_data();
|
void testAsciify_data();
|
||||||
void testAsciify();
|
void testAsciify();
|
||||||
|
void testNormalizeNewlinesInString();
|
||||||
|
void testNormalizeNewlinesInByteArray();
|
||||||
};
|
};
|
||||||
|
|
||||||
void tst_StringUtils::testWithTildeHomePath()
|
void tst_StringUtils::testWithTildeHomePath()
|
||||||
@@ -355,6 +357,27 @@ void tst_StringUtils::testAsciify()
|
|||||||
QCOMPARE(asciified, expected);
|
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)
|
QTEST_GUILESS_MAIN(tst_StringUtils)
|
||||||
|
|
||||||
#include "tst_stringutils.moc"
|
#include "tst_stringutils.moc"
|
||||||
|
Reference in New Issue
Block a user