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;
}
/*
* 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;
}
}
/* EINVAL appears to be the default */
- __set_errno(EINVAL);
+ _set_errno(EINVAL);
}
/******************************************************************************
* 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 );
* _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
}
}
invalid_parameter_handler = handler;
return old;
}
-/* EOF */