diff options
Diffstat (limited to 'src/linguist/lupdate/main.cpp')
-rw-r--r-- | src/linguist/lupdate/main.cpp | 51 |
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) |