From 6597b915b8df43b905f937d0ad87ae9e560ab3b5 Mon Sep 17 00:00:00 2001
From: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Date: Wed, 6 Mar 2013 15:29:08 +0100
Subject: [PATCH] support only utf-8 and utf-16 for source code

utf-16 is optionally used by java and msvc. it doesn't hurt to support
it. all other encodings are not used anyway (other than 8-bit
pass-through, but this is a matter for (the also removed) CodecForTr).

Change-Id: Ie6482e187a9a8276918b53e97faeac88a40eb52c
Reviewed-by: hjk <hjk121@nokiamail.com>
---
 src/linguist/lupdate/cpp.cpp     |  4 +---
 src/linguist/lupdate/java.cpp    |  7 +------
 src/linguist/lupdate/lupdate.h   |  3 ++-
 src/linguist/lupdate/main.cpp    | 35 +++++++++++++++++---------------
 src/linguist/shared/translator.h |  2 +-
 5 files changed, 24 insertions(+), 27 deletions(-)

diff --git a/src/linguist/lupdate/cpp.cpp b/src/linguist/lupdate/cpp.cpp
index 8288cbff5..ec02be157 100644
--- a/src/linguist/lupdate/cpp.cpp
+++ b/src/linguist/lupdate/cpp.cpp
@@ -2217,9 +2217,7 @@ const ParseResults *CppParser::recordResults(bool isHeader)
 
 void loadCPP(Translator &translator, const QStringList &filenames, ConversionData &cd)
 {
-    QByteArray codecName = cd.m_codecForSource.isEmpty()
-                            ? "UTF-8" : cd.m_codecForSource;
-    QTextCodec *codec = QTextCodec::codecForName(codecName);
+    QTextCodec *codec = QTextCodec::codecForName(cd.m_sourceIsUtf16 ? "UTF-16" : "UTF-8");
 
     foreach (const QString &filename, filenames) {
         if (!CppFiles::getResults(filename).isEmpty() || CppFiles::isBlacklisted(filename))
diff --git a/src/linguist/lupdate/java.cpp b/src/linguist/lupdate/java.cpp
index 079847f43..210b85458 100644
--- a/src/linguist/lupdate/java.cpp
+++ b/src/linguist/lupdate/java.cpp
@@ -622,12 +622,7 @@ bool loadJava(Translator &translator, const QString &filename, ConversionData &c
     yyParenLineNo = 1;
 
     QTextStream ts(&file);
-    QByteArray codecName;
-    if (!cd.m_codecForSource.isEmpty())
-        codecName = cd.m_codecForSource;
-    else
-        codecName = "UTF-8";
-    ts.setCodec(QTextCodec::codecForName(codecName));
+    ts.setCodec(QTextCodec::codecForName(cd.m_sourceIsUtf16 ? "UTF-16" : "UTF-8"));
     ts.setAutoDetectUnicode(true);
     yyInStr = ts.readAll();
     yyInPos = 0;
diff --git a/src/linguist/lupdate/lupdate.h b/src/linguist/lupdate/lupdate.h
index 3f3095a89..05a3ce583 100644
--- a/src/linguist/lupdate/lupdate.h
+++ b/src/linguist/lupdate/lupdate.h
@@ -65,7 +65,8 @@ enum UpdateOption {
     AbsoluteLocations = 256,
     RelativeLocations = 512,
     NoLocations = 1024,
-    NoUiLines = 2048
+    NoUiLines = 2048,
+    SourceIsUtf16 = 4096
 };
 
 Q_DECLARE_FLAGS(UpdateOptions, UpdateOption)
diff --git a/src/linguist/lupdate/main.cpp b/src/linguist/lupdate/main.cpp
index ff7538de7..56078a5ae 100644
--- a/src/linguist/lupdate/main.cpp
+++ b/src/linguist/lupdate/main.cpp
@@ -52,7 +52,6 @@
 #include <QtCore/QFileInfo>
 #include <QtCore/QString>
 #include <QtCore/QStringList>
-#include <QtCore/QTextCodec>
 #include <QtCore/QTranslator>
 #include <QtCore/QLibraryInfo>
 
@@ -354,26 +353,29 @@ static void processSources(Translator &fetchedTor,
 
 static void processProjects(bool topLevel, bool nestComplain, const QStringList &proFiles,
         const QHash<QString, QString> &outDirMap, ProFileGlobals *option, QMakeParser *parser,
-        UpdateOptions options, const QByteArray &codecForSource,
+        UpdateOptions options,
         const QString &targetLanguage, const QString &sourceLanguage,
         Translator *parentTor, bool *fail);
 
 static void processProject(
         bool nestComplain, const QString &proFile,
         ProFileGlobals *option, QMakeParser *parser, ProFileEvaluator &visitor,
-        UpdateOptions options, const QByteArray &_codecForSource,
+        UpdateOptions options,
         const QString &targetLanguage, const QString &sourceLanguage,
         Translator *fetchedTor, bool *fail)
 {
-    QByteArray codecForSource = _codecForSource;
     QStringList tmp = visitor.values(QLatin1String("CODECFORSRC"));
     if (!tmp.isEmpty()) {
-        codecForSource = tmp.last().toLatin1();
-        if (!QTextCodec::codecForName(codecForSource)) {
+        QByteArray codecForSource = tmp.last().toLatin1().toUpper();
+        if (codecForSource == "UTF16" || codecForSource == "UTF-16") {
+            options |= SourceIsUtf16;
+        } else if (codecForSource == "UTF8" || codecForSource == "UTF-8") {
+            options &= ~SourceIsUtf16;
+        } else {
             printErr(LU::tr("lupdate warning: Codec for source '%1' is invalid."
-                            " Falling back to codec for tr().\n")
+                            " Falling back to UTF-8.\n")
                      .arg(QString::fromLatin1(codecForSource)));
-            codecForSource.clear();
+            options &= ~SourceIsUtf16;
         }
     }
     QString proPath = QFileInfo(proFile).path();
@@ -395,12 +397,12 @@ static void processProject(
                 subProFiles << subPro;
         }
         processProjects(false, nestComplain, subProFiles, QHash<QString, QString>(),
-                        option, parser, options, codecForSource,
+                        option, parser, options,
                         targetLanguage, sourceLanguage, fetchedTor, fail);
     } else {
         ConversionData cd;
         cd.m_noUiLines = options & NoUiLines;
-        cd.m_codecForSource = codecForSource;
+        cd.m_sourceIsUtf16 = options & SourceIsUtf16;
         cd.m_includePath = visitor.values(QLatin1String("INCLUDEPATH"));
         QStringList sourceFiles = getSources(visitor, proPath);
         QSet<QString> sourceDirs;
@@ -421,7 +423,7 @@ static void processProject(
 
 static void processProjects(bool topLevel, bool nestComplain, const QStringList &proFiles,
         const QHash<QString, QString> &outDirMap, ProFileGlobals *option, QMakeParser *parser,
-        UpdateOptions options, const QByteArray &codecForSource,
+        UpdateOptions options,
         const QString &targetLanguage, const QString &sourceLanguage,
         Translator *parentTor, bool *fail)
 {
@@ -471,7 +473,7 @@ static void processProjects(bool topLevel, bool nestComplain, const QStringList
                 continue;
             }
             Translator tor;
-            processProject(false, proFile, option, parser, visitor, options, codecForSource,
+            processProject(false, proFile, option, parser, visitor, options,
                            targetLanguage, sourceLanguage, &tor, fail);
             updateTsFiles(tor, tsFiles, QStringList(),
                           sourceLanguage, targetLanguage, options, fail);
@@ -484,10 +486,10 @@ static void processProjects(bool topLevel, bool nestComplain, const QStringList
                 printErr(LU::tr("lupdate warning: no TS files specified. Only diagnostics "
                                 "will be produced for '%1'.\n").arg(proFile));
             Translator tor;
-            processProject(nestComplain, proFile, option, parser, visitor, options, codecForSource,
+            processProject(nestComplain, proFile, option, parser, visitor, options,
                            targetLanguage, sourceLanguage, &tor, fail);
         } else {
-            processProject(nestComplain, proFile, option, parser, visitor, options, codecForSource,
+            processProject(nestComplain, proFile, option, parser, visitor, options,
                            targetLanguage, sourceLanguage, parentTor, fail);
         }
         pro->deref();
@@ -802,6 +804,7 @@ int main(int argc, char **argv)
         Translator fetchedTor;
         ConversionData cd;
         cd.m_noUiLines = options & NoUiLines;
+        cd.m_sourceIsUtf16 = options & SourceIsUtf16;
         cd.m_projectRoots = projectRoots;
         cd.m_includePath = includePath;
         cd.m_allCSources = allCSources;
@@ -827,12 +830,12 @@ int main(int argc, char **argv)
 
         if (!tsFileNames.isEmpty()) {
             Translator fetchedTor;
-            processProjects(true, true, proFiles, outDirMap, &option, &parser, options, QByteArray(),
+            processProjects(true, true, proFiles, outDirMap, &option, &parser, options,
                             targetLanguage, sourceLanguage, &fetchedTor, &fail);
             updateTsFiles(fetchedTor, tsFileNames, alienFiles,
                           sourceLanguage, targetLanguage, options, &fail);
         } else {
-            processProjects(true, false, proFiles, outDirMap, &option, &parser, options, QByteArray(),
+            processProjects(true, false, proFiles, outDirMap, &option, &parser, options,
                             targetLanguage, sourceLanguage, 0, &fail);
         }
     }
diff --git a/src/linguist/shared/translator.h b/src/linguist/shared/translator.h
index 712098219..17dc3d53d 100644
--- a/src/linguist/shared/translator.h
+++ b/src/linguist/shared/translator.h
@@ -97,7 +97,7 @@ public:
 
 public:
     QString m_defaultContext;
-    QByteArray m_codecForSource; // CPP, PO & QM specific
+    bool m_sourceIsUtf16; // CPP & JAVA specific
     QString m_unTrPrefix; // QM specific
     QString m_sourceFileName;
     QString m_targetFileName;
-- 
GitLab