* Sync up to trunk head (r64921).
[reactos.git] / lib / sdk / crt / stdlib / errno.c
index 6cbd20a..f1b06e9 100644 (file)
 
 static _invalid_parameter_handler invalid_parameter_handler = NULL;
 
-/*
- * @implemented
+/*********************************************************************
+ *             _errno (MSVCRT.@)
  */
-unsigned long* __doserrno(void)
+int CDECL *_errno(void)
 {
-  return (unsigned long*)(&GetThreadData()->tdoserrno);
+    return &(msvcrt_get_thread_data()->thread_errno);
 }
 
-/*
- * @implemented
+/*********************************************************************
+ *             __doserrno (MSVCRT.@)
  */
-int *_errno(void)
+unsigned long* CDECL __doserrno(void)
 {
-  return(&GetThreadData()->terrno);
+    return &(msvcrt_get_thread_data()->thread_doserrno);
 }
 
-
-int __set_doserrno(int error)
+/*********************************************************************
+ *             _get_errno (MSVCRT.@)
+ */
+errno_t CDECL _get_errno(int *pValue)
 {
-  PTHREADDATA ThreadData;
-
-  ThreadData = GetThreadData();
-  if (ThreadData)
-    ThreadData->tdoserrno = error;
+    if (!pValue)
+        return EINVAL;
 
-  return(error);
+    *pValue = *_errno();
+    return 0;
 }
 
-int __set_errno(int error)
+/*********************************************************************
+ *             _get_doserrno (MSVCRT.@)
+ */
+errno_t CDECL _get_doserrno(unsigned long *pValue)
 {
-  PTHREADDATA ThreadData;
+    if (!pValue)
+        return EINVAL;
+
+    *pValue = *__doserrno();
+    return 0;
+}
 
-  ThreadData = GetThreadData();
-  if (ThreadData)
-    ThreadData->terrno = error;
+/*********************************************************************
+ *             _set_errno (MSVCRT.@)
+ */
+errno_t CDECL _set_errno(int value)
+{
+    *_errno() = value;
+    return 0;
+}
 
-  return(error);
+/*********************************************************************
+ *             _set_doserrno (MSVCRT.@)
+ */
+errno_t CDECL _set_doserrno(unsigned long value)
+{
+    *__doserrno() = value;
+    return 0;
 }
 
 /*
@@ -59,17 +78,17 @@ int __set_errno(int error)
  * exists in MSVCRT but is undocumented, on all the error codes in
  * winerror.h.
  */
-void _dosmaperr(unsigned long oserror)
+void CDECL _dosmaperr(unsigned long oserror)
 {
        int pos, base, lim;
 
-       __set_doserrno(oserror);
+       _set_doserrno(oserror);
 
        /* Use binary chop to find the corresponding errno code */
        for (base=0, lim=sizeof(doserrmap)/sizeof(doserrmap[0]); lim; lim >>= 1) {
                pos = base+(lim >> 1);
                if (doserrmap[pos].winerr == oserror) {
-                       __set_errno(doserrmap[pos].en);
+                       _set_errno(doserrmap[pos].en);
                        return;
                } else if (doserrmap[pos].winerr < oserror) {
                        base = pos + 1;
@@ -77,7 +96,7 @@ void _dosmaperr(unsigned long oserror)
                }
        }
        /* EINVAL appears to be the default */
-       __set_errno(EINVAL);
+       _set_errno(EINVAL);
 }
 
 /******************************************************************************
@@ -92,25 +111,21 @@ void _dosmaperr(unsigned long oserror)
 * RETURNS
 *   The old error mode.
 *
-* TODO
-*  This function does not have a proper implementation; the error mode is
-*  never used.
 */
+int msvcrt_error_mode = MSVCRT__OUT_TO_DEFAULT;
+
 int CDECL _set_error_mode(int mode)
 {
-    static int current_mode = MSVCRT__OUT_TO_DEFAULT;
-
-    const int old = current_mode;
+    const int old = msvcrt_error_mode;
     if ( MSVCRT__REPORT_ERRMODE != mode ) {
-        current_mode = mode;
-
+        msvcrt_error_mode = mode;
     }
     return old;
 }
 
 /******************************************************************************
-             _seterrormode (MSVCRT.@)
-*/
+ *             _seterrormode (MSVCRT.@)
+ */
 void CDECL _seterrormode(int mode)
 {
     SetErrorMode( mode );
@@ -120,13 +135,15 @@ void CDECL _seterrormode(int mode)
  *             _invalid_parameter (MSVCRT.@)
  */
 void __cdecl _invalid_parameter(const wchar_t *expr, const wchar_t *func,
-                                       const wchar_t *file, unsigned int line, uintptr_t arg)
+                                const wchar_t *file, unsigned int line, uintptr_t arg)
 {
     if (invalid_parameter_handler) invalid_parameter_handler( expr, func, file, line, arg );
     else
     {
         ERR( "%s:%u %s: %s %lx\n", debugstr_w(file), line, debugstr_w(func), debugstr_w(expr), arg );
+#if _MSVCR_VER > 0 // FIXME: possible improvement: use a global variable in the DLL
         RaiseException( STATUS_INVALID_CRUNTIME_PARAMETER, EXCEPTION_NONCONTINUABLE, 0, NULL );
+#endif
     }
 }
 
@@ -148,4 +165,3 @@ _invalid_parameter_handler CDECL _set_invalid_parameter_handler(
     invalid_parameter_handler = handler;
     return old;
 }
-/* EOF */