From 1dc99e8ff38c31fab948c5c57f47a492961841f2 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Tue, 8 Jun 2010 17:49:09 +0200 Subject: [PATCH] try to sort out the filename encoding mess use local8bit instead of latin1 resp. 8bit-passthrough, after all. the situation was as follows: - if the pro files and file names were all ascii, everything just worked - if either contained non-ascii: - on unix, the evaluator would work as long as the file content encoding matched the file name encoding, and the ui would work as long as the file name encoding was latin1 (i.e., on no modern system) - on windows, both would work only if the ansi code page was latin1/cp1252 (i.e., on western systems) i.e., even in the low-level evaluator, only native latin1 systems with actual latin1 files worked consistently. given this situation, it makes little sense to make an encoding adapter between the evaluator and the ui as originally planned. instead, take the easy way out and use local8bit - this continues to work for native latin1 systems+files in the backend, and makes the ui work for everything the backend groks and some more. Reviewed-by: dt Task-number: QTCREATORBUG-930 --- src/shared/proparser/ioutils.cpp | 2 +- src/shared/proparser/profileevaluator.cpp | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/shared/proparser/ioutils.cpp b/src/shared/proparser/ioutils.cpp index 8a2c9112d2..f43c29aa9a 100644 --- a/src/shared/proparser/ioutils.cpp +++ b/src/shared/proparser/ioutils.cpp @@ -52,7 +52,7 @@ IoUtils::FileType IoUtils::fileType(const QString &fileName) return (attr & FILE_ATTRIBUTE_DIRECTORY) ? FileIsDir : FileIsRegular; #else struct ::stat st; - if (::stat(fileName.toLatin1().constData(), &st)) // latin1 symmetric to the file reader + if (::stat(fileName.toLocal8Bit().constData(), &st)) return FileNotFound; return S_ISDIR(st.st_mode) ? FileIsDir : FileIsRegular; #endif diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index c9ce082b41..f54fd06ea6 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -148,7 +148,7 @@ ProFileOption::ProFileOption() dirlist_sep = QLatin1Char(':'); dir_sep = QLatin1Char('/'); #endif - qmakespec = QString::fromLatin1(qgetenv("QMAKESPEC").data()); + qmakespec = QString::fromLocal8Bit(qgetenv("QMAKESPEC").data()); #if defined(Q_OS_WIN32) target_mode = TARG_WIN_MODE; @@ -557,7 +557,7 @@ bool ProFileEvaluator::Private::read(ProFile *pro) return false; } - QString content(QString::fromLatin1(file.readAll())); // yes, really latin1 + QString content(QString::fromLocal8Bit(file.readAll())); file.close(); m_lineNo = 1; m_profileStack.push(pro); @@ -1377,10 +1377,10 @@ ProItem::ProItemReturn ProFileEvaluator::Private::visitProFile(ProFile *pro) if (m_option->qmakespec_name == QLatin1String("default")) { #ifdef Q_OS_UNIX char buffer[1024]; - int l = ::readlink(m_option->qmakespec.toLatin1().constData(), buffer, 1024); + int l = ::readlink(m_option->qmakespec.toLocal8Bit().constData(), buffer, 1024); if (l != -1) m_option->qmakespec_name = - IoUtils::fileName(QString::fromLatin1(buffer, l)).toString(); + IoUtils::fileName(QString::fromLocal8Bit(buffer, l)).toString(); #else // We can't resolve symlinks as they do on Unix, so configure.exe puts // the source of the qmake.conf at the end of the default/qmake.conf in @@ -1815,7 +1815,7 @@ QStringList ProFileEvaluator::Private::expandVariableReferences( QStringList replacement; if (var_type == ENVIRON) { - replacement = split_value_list(QString::fromLocal8Bit(qgetenv(var.toLatin1().constData()))); + replacement = split_value_list(QString::fromLocal8Bit(qgetenv(var.toLocal8Bit().constData()))); } else if (var_type == PROPERTY) { replacement << propertyValue(var); } else if (var_type == FUNCTION) { @@ -2199,9 +2199,9 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun logMessage(format("system(execute) requires one or two arguments.")); } else { char buff[256]; - FILE *proc = QT_POPEN((QLatin1String("cd ") + FILE *proc = QT_POPEN(QString(QLatin1String("cd ") + IoUtils::shellQuote(currentDirectory()) - + QLatin1String(" && ") + args[0]).toLatin1(), "r"); + + QLatin1String(" && ") + args[0]).toLocal8Bit(), "r"); bool singleLine = true; if (args.count() > 1) singleLine = (!args[1].compare(QLatin1String("true"), Qt::CaseInsensitive)); @@ -2215,7 +2215,7 @@ QStringList ProFileEvaluator::Private::evaluateExpandFunction(const QString &fun buff[i] = ' '; } buff[read_in] = '\0'; - output += QLatin1String(buff); + output += QString::fromLocal8Bit(buff); } ret += split_value_list(output); if (proc) @@ -2843,7 +2843,7 @@ ProItem::ProItemReturn ProFileEvaluator::Private::evaluateConditionalFunction( } return returnBool(system((QLatin1String("cd ") + IoUtils::shellQuote(currentDirectory()) - + QLatin1String(" && ") + args.first()).toLatin1().constData()) == 0); + + QLatin1String(" && ") + args.first()).toLocal8Bit().constData()) == 0); } #endif case T_ISEMPTY: { @@ -3040,7 +3040,7 @@ QStringList ProFileEvaluator::Private::values(const QString &variableName) const case V_QMAKE_HOST_version_string: what = name.version; break; case V_QMAKE_HOST_arch: what = name.machine; break; } - ret = QString::fromLatin1(what); + ret = QString::fromLocal8Bit(what); } } #endif -- GitLab