summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qfunctions_fake_env_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/kernel/qfunctions_fake_env_p.h')
-rw-r--r--src/corelib/kernel/qfunctions_fake_env_p.h51
1 files changed, 36 insertions, 15 deletions
diff --git a/src/corelib/kernel/qfunctions_fake_env_p.h b/src/corelib/kernel/qfunctions_fake_env_p.h
index 8b1ab44696..b4c5ffb079 100644
--- a/src/corelib/kernel/qfunctions_fake_env_p.h
+++ b/src/corelib/kernel/qfunctions_fake_env_p.h
@@ -46,51 +46,72 @@
//
#include "qbytearray.h"
-#include "qhash.h"
+#include "qvector.h"
QT_BEGIN_NAMESPACE
// Environment ------------------------------------------------------
-Q_CORE_EXPORT QHash<QByteArray, QByteArray> &qt_app_environment()
-{
- static QHash<QByteArray, QByteArray> internalEnvironment;
- return internalEnvironment;
-}
+struct Variable {
+ Variable() { }
+
+ Variable(const QByteArray &name, const QByteArray &value)
+ : name(name), value(value) { }
+
+ QByteArray name;
+ QByteArray value;
+};
+
+Q_DECLARE_TYPEINFO(Variable, Q_MOVABLE_TYPE);
+
+struct NameEquals {
+ typedef bool result_type;
+ const char *name;
+ explicit NameEquals(const char *name) Q_DECL_NOTHROW : name(name) {}
+ result_type operator()(const Variable &other) const Q_DECL_NOTHROW
+ { return qstrcmp(other.name, name) == 0; }
+};
+
+Q_GLOBAL_STATIC(QVector<Variable>, qt_app_environment)
errno_t qt_fake_getenv_s(size_t *sizeNeeded, char *buffer, size_t bufferSize, const char *varName)
{
if (!sizeNeeded)
return EINVAL;
- QHash<QByteArray, QByteArray>::const_iterator iterator = qt_app_environment().constFind(varName);
- if (iterator == qt_app_environment().constEnd()) {
+ QVector<Variable>::const_iterator end = qt_app_environment->constEnd();
+ QVector<Variable>::const_iterator iterator = std::find_if(qt_app_environment->constBegin(),
+ end,
+ NameEquals(varName));
+ if (iterator == end) {
if (buffer)
buffer[0] = '\0';
return ENOENT;
}
- const int size = iterator->size() + 1;
+ const int size = iterator->value.size() + 1;
if (bufferSize < size_t(size)) {
*sizeNeeded = size;
return ERANGE;
}
- qstrcpy(buffer, iterator->constData());
+ qstrcpy(buffer, iterator->value.constData());
return 0;
}
errno_t qt_fake__putenv_s(const char *varName, const char *value)
{
- QHash<QByteArray, QByteArray>::iterator iterator = qt_app_environment().find(varName);
- QHash<QByteArray, QByteArray>::iterator end = qt_app_environment().end();
+ QVector<Variable>::iterator end = qt_app_environment->end();
+ QVector<Variable>::iterator iterator = std::find_if(qt_app_environment->begin(),
+ end,
+ NameEquals(varName));
if (!value || !*value) {
if (iterator != end)
- qt_app_environment().erase(iterator);
+ qt_app_environment->erase(iterator);
} else {
if (iterator == end)
- qt_app_environment()[varName] = QByteArray(value);
+ qt_app_environment->append(Variable(varName, value));
else
- (*iterator) = value;
+ iterator->value = value;
}
return 0;