/* _wenviron must be initialized in this way if the program is started
through main() instead of wmain(). */
_wgetenv(L"");
- if (_wenviron == NULL)
+ e = _wenviron;
+#else
+ e = environ;
+#endif
+ if (e == NULL)
return d;
- /* This part ignores errors */
- for (e = _wenviron; *e != NULL; e++) {
+ for (; *e != NULL; e++) {
PyObject *k;
PyObject *v;
+#ifdef MS_WINDOWS
const wchar_t *p = wcschr(*e, L'=');
- if (p == NULL)
- continue;
- k = PyUnicode_FromWideChar(*e, (Py_ssize_t)(p-*e));
- if (k == NULL) {
- PyErr_Clear();
- continue;
- }
- v = PyUnicode_FromWideChar(p+1, wcslen(p+1));
- if (v == NULL) {
- PyErr_Clear();
- Py_DECREF(k);
- continue;
- }
- if (PyDict_GetItem(d, k) == NULL) {
- if (PyDict_SetItem(d, k, v) != 0)
- PyErr_Clear();
- }
- Py_DECREF(k);
- Py_DECREF(v);
- }
#else
- if (environ == NULL)
- return d;
- /* This part ignores errors */
- for (e = environ; *e != NULL; e++) {
- PyObject *k;
- PyObject *v;
const char *p = strchr(*e, '=');
+#endif
if (p == NULL)
continue;
+#ifdef MS_WINDOWS
+ k = PyUnicode_FromWideChar(*e, (Py_ssize_t)(p-*e));
+#else
k = PyBytes_FromStringAndSize(*e, (int)(p-*e));
+#endif
if (k == NULL) {
- PyErr_Clear();
- continue;
+ Py_DECREF(d);
+ return NULL;
}
+#ifdef MS_WINDOWS
+ v = PyUnicode_FromWideChar(p+1, wcslen(p+1));
+#else
v = PyBytes_FromStringAndSize(p+1, strlen(p+1));
+#endif
if (v == NULL) {
- PyErr_Clear();
Py_DECREF(k);
- continue;
+ Py_DECREF(d);
+ return NULL;
}
- if (PyDict_GetItem(d, k) == NULL) {
- if (PyDict_SetItem(d, k, v) != 0)
- PyErr_Clear();
+ if (PyDict_GetItemWithError(d, k) == NULL) {
+ if (PyErr_Occurred() || PyDict_SetItem(d, k, v) != 0) {
+ Py_DECREF(v);
+ Py_DECREF(k);
+ Py_DECREF(d);
+ return NULL;
+ }
}
Py_DECREF(k);
Py_DECREF(v);
}
-#endif
return d;
}