Eric Pouech : msvcrt: Implemented _(w)dupenv_s.

Alexandre Julliard julliard at winehq.org
Wed Nov 3 11:37:03 CDT 2010


Module: wine
Branch: master
Commit: fc186c3bdab8c1b42e402f3db1dda7be201b9027
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=fc186c3bdab8c1b42e402f3db1dda7be201b9027

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Tue Nov  2 22:03:05 2010 +0100

msvcrt: Implemented _(w)dupenv_s.

---

 dlls/msvcr100/msvcr100.spec |    4 +-
 dlls/msvcr80/msvcr80.spec   |    4 +-
 dlls/msvcr90/msvcr90.spec   |    4 +-
 dlls/msvcrt/environ.c       |   49 +++++++++++++++++++++++++++++++++++++++++++
 dlls/msvcrt/msvcrt.spec     |    2 +
 5 files changed, 57 insertions(+), 6 deletions(-)

diff --git a/dlls/msvcr100/msvcr100.spec b/dlls/msvcr100/msvcr100.spec
index 6035f70..9ceb3e2 100644
--- a/dlls/msvcr100/msvcr100.spec
+++ b/dlls/msvcr100/msvcr100.spec
@@ -581,7 +581,7 @@
 @ extern _dstbias msvcrt._dstbias
 @ cdecl _dup(long) msvcrt._dup
 @ cdecl _dup2(long long) msvcrt._dup2
-@ stub _dupenv_s
+@ cdecl _dupenv_s(ptr ptr str) msvcrt._dupenv_s
 @ cdecl _ecvt(double long ptr ptr) msvcrt._ecvt
 @ stub _ecvt_s
 @ cdecl _encoded_null() msvcr90._encoded_null
@@ -1327,7 +1327,7 @@
 @ stub _wctomb_l
 @ stub _wctomb_s_l
 @ stub _wctype
-@ stub _wdupenv_s
+@ cdecl _wdupenv_s(ptr ptr wstr) msvcrt._wdupenv_s
 @ extern _wenviron msvcrt._wenviron
 @ varargs _wexecl(wstr wstr) msvcrt._wexecl
 @ varargs _wexecle(wstr wstr) msvcrt._wexecle
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index ce58a11..2dec3a4 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -421,7 +421,7 @@
 @ extern _dstbias msvcrt._dstbias
 @ cdecl _dup(long) msvcrt._dup
 @ cdecl _dup2(long long) msvcrt._dup2
-@ stub _dupenv_s
+@ cdecl _dupenv_s(ptr ptr str) msvcrt._dupenv_s
 @ cdecl _ecvt(double long ptr ptr) msvcrt._ecvt
 @ stub _ecvt_s
 @ cdecl _encode_pointer(ptr) msvcr90._encode_pointer
@@ -1180,7 +1180,7 @@
 @ stub _wctomb_l
 @ stub _wctomb_s_l
 @ stub _wctype
-@ stub _wdupenv_s
+@ cdecl _wdupenv_s(ptr ptr wstr) msvcrt._wdupenv_s
 @ extern _wenviron msvcrt._wenviron
 @ varargs _wexecl(wstr wstr) msvcrt._wexecl
 @ varargs _wexecle(wstr wstr) msvcrt._wexecle
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index d9f6fb4..9b87c0a 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -413,7 +413,7 @@
 @ extern _dstbias msvcrt._dstbias
 @ cdecl _dup(long) msvcrt._dup
 @ cdecl _dup2(long long) msvcrt._dup2
-@ stub _dupenv_s
+@ cdecl _dupenv_s(ptr ptr str) msvcrt._dupenv_s
 @ cdecl _ecvt(double long ptr ptr) msvcrt._ecvt
 @ stub _ecvt_s
 @ cdecl _encode_pointer(ptr) MSVCR90_encode_pointer
@@ -1167,7 +1167,7 @@
 @ stub _wctomb_l
 @ stub _wctomb_s_l
 @ stub _wctype
-@ stub _wdupenv_s
+@ cdecl _wdupenv_s(ptr ptr wstr) msvcrt._wdupenv_s
 @ extern _wenviron msvcrt._wenviron
 @ varargs _wexecl(wstr wstr) msvcrt._wexecl
 @ varargs _wexecle(wstr wstr) msvcrt._wexecle
diff --git a/dlls/msvcrt/environ.c b/dlls/msvcrt/environ.c
index 75178bd..99efd4b 100644
--- a/dlls/msvcrt/environ.c
+++ b/dlls/msvcrt/environ.c
@@ -212,3 +212,52 @@ int CDECL _wputenv_s(const MSVCRT_wchar_t *name, const MSVCRT_wchar_t *value)
 
     return ret;
 }
+
+/******************************************************************
+ *		_dupenv_s (MSVCRT.@)
+ */
+int _dupenv_s(char **buffer, MSVCRT_size_t *numberOfElements, const char *varname)
+{
+    char*               e;
+    MSVCRT_size_t       sz;
+
+    if (!MSVCRT_CHECK_PMT(buffer != NULL) || !MSVCRT_CHECK_PMT(varname) ||
+        !(e = MSVCRT_getenv(varname)))
+    {
+        return *MSVCRT__errno() = MSVCRT_EINVAL;
+    }
+    sz = strlen(e) + 1;
+    if (!(*buffer = MSVCRT_malloc(sz)))
+    {
+        if (numberOfElements) *numberOfElements = 0;
+        return *MSVCRT__errno() = MSVCRT_ENOMEM;
+    }
+    strcpy(*buffer, e);
+    if (numberOfElements) *numberOfElements = sz;
+    return 0;
+}
+
+/******************************************************************
+ *		_wdupenv_s (MSVCRT.@)
+ */
+int _wdupenv_s(MSVCRT_wchar_t **buffer, MSVCRT_size_t *numberOfElements,
+               const MSVCRT_wchar_t *varname)
+{
+    MSVCRT_wchar_t*     e;
+    MSVCRT_size_t       sz;
+
+    if (!MSVCRT_CHECK_PMT(buffer != NULL) || !MSVCRT_CHECK_PMT(varname) ||
+        !(e = _wgetenv(varname)))
+    {
+        return *MSVCRT__errno() = MSVCRT_EINVAL;
+    }
+    sz = strlenW(e) + 1;
+    if (!(*buffer = MSVCRT_malloc(sz * sizeof(MSVCRT_wchar_t))))
+    {
+        if (numberOfElements) *numberOfElements = 0;
+        return *MSVCRT__errno() = MSVCRT_ENOMEM;
+    }
+    strcpyW(*buffer, e);
+    if (numberOfElements) *numberOfElements = sz;
+    return 0;
+}
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index af86f2e..ca2607c 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1480,3 +1480,5 @@
 @ cdecl _wcstod_l(wstr ptr) MSVCRT__wcstod_l
 @ cdecl ___mb_cur_max_l_func(ptr)
 @ cdecl _set_purecall_handler(ptr)
+@ cdecl _dupenv_s(ptr ptr str)
+@ cdecl _wdupenv_s(ptr ptr str)




More information about the wine-cvs mailing list