summaryrefslogtreecommitdiffstats
path: root/src/linguist/lupdate/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/linguist/lupdate/main.cpp')
-rw-r--r--src/linguist/lupdate/main.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/linguist/lupdate/main.cpp b/src/linguist/lupdate/main.cpp
index ba1126aa7..c6b026dc7 100644
--- a/src/linguist/lupdate/main.cpp
+++ b/src/linguist/lupdate/main.cpp
@@ -136,6 +136,57 @@ QStringList TrFunctionAliasManager::availableFunctionsWithAliases() const
TrFunctionAliasManager trFunctionAliasManager;
+QString ParserTool::transcode(const QString &str)
+{
+ static const char tab[] = "abfnrtv";
+ static const char backTab[] = "\a\b\f\n\r\t\v";
+ // This function has to convert back to bytes, as C's \0* sequences work at that level.
+ const QByteArray in = str.toUtf8();
+ QByteArray out;
+
+ out.reserve(in.length());
+ for (int i = 0; i < in.length();) {
+ uchar c = in[i++];
+ if (c == '\\') {
+ if (i >= in.length())
+ break;
+ c = in[i++];
+
+ if (c == '\n')
+ continue;
+
+ if (c == 'x' || c == 'u' || c == 'U') {
+ const bool unicode = (c != 'x');
+ QByteArray hex;
+ while (i < in.length() && isxdigit((c = in[i]))) {
+ hex += c;
+ i++;
+ }
+ if (unicode)
+ out += QString(QChar(hex.toUInt(nullptr, 16))).toUtf8();
+ else
+ out += hex.toUInt(nullptr, 16);
+ } else if (c >= '0' && c < '8') {
+ QByteArray oct;
+ int n = 0;
+ oct += c;
+ while (n < 2 && i < in.length() && (c = in[i]) >= '0' && c < '8') {
+ i++;
+ n++;
+ oct += c;
+ }
+ out += oct.toUInt(0, 8);
+ } else {
+ const char *p = strchr(tab, c);
+ out += !p ? c : backTab[p - tab];
+ }
+ } else {
+ out += c;
+ }
+ }
+ return QString::fromUtf8(out.constData(), out.length());
+}
+
static QString m_defaultExtensions;
static void printOut(const QString & out)