msvcrt: Properly implemented strerror and perror (based on a patch by

Uwe Bonnes).
This commit is contained in:
Alexandre Julliard 2006-01-23 19:58:10 +01:00
parent 401ead5c8f
commit 2dacd3c54e
3 changed files with 36 additions and 6 deletions

View File

@ -199,17 +199,36 @@ unsigned long* MSVCRT___doserrno(void)
*/ */
char* MSVCRT_strerror(int err) char* MSVCRT_strerror(int err)
{ {
return strerror(err); /* FIXME */ thread_data_t *data = msvcrt_get_thread_data();
if (!data->strerror_buffer)
if (!(data->strerror_buffer = MSVCRT_malloc(256))) return NULL;
if (err < 0 || err > MSVCRT__sys_nerr) err = MSVCRT__sys_nerr;
strcpy( data->strerror_buffer, MSVCRT__sys_errlist[err] );
return data->strerror_buffer;
} }
/********************************************************************** /**********************************************************************
* _strerror (MSVCRT.@) * _strerror (MSVCRT.@)
*/ */
char* _strerror(const char* err) char* _strerror(const char* str)
{ {
static char strerrbuff[256]; /* FIXME: Per thread, nprintf */ thread_data_t *data = msvcrt_get_thread_data();
sprintf(strerrbuff,"%s: %s\n",err,MSVCRT_strerror(msvcrt_get_thread_data()->thread_errno)); int err;
return strerrbuff;
if (!data->strerror_buffer)
if (!(data->strerror_buffer = MSVCRT_malloc(256))) return NULL;
err = data->thread_errno;
if (err < 0 || err > MSVCRT__sys_nerr) err = MSVCRT__sys_nerr;
if (str && *str)
sprintf( data->strerror_buffer, "%s: %s\n", str, MSVCRT__sys_errlist[err] );
else
sprintf( data->strerror_buffer, "%s\n", MSVCRT__sys_errlist[err] );
return data->strerror_buffer;
} }
/********************************************************************* /*********************************************************************
@ -217,7 +236,16 @@ char* _strerror(const char* err)
*/ */
void MSVCRT_perror(const char* str) void MSVCRT_perror(const char* str)
{ {
_cprintf("%s: %s\n",str,MSVCRT_strerror(msvcrt_get_thread_data()->thread_errno)); int err = *MSVCRT__errno();
if (err < 0 || err > MSVCRT__sys_nerr) err = MSVCRT__sys_nerr;
if (str && *str)
{
_write( 2, str, strlen(str) );
_write( 2, ": ", 2 );
}
_write( 2, MSVCRT__sys_errlist[err], strlen(MSVCRT__sys_errlist[err]) );
_write( 2, "\n", 1 );
} }
/****************************************************************************** /******************************************************************************

View File

@ -75,6 +75,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
HeapFree(GetProcessHeap(),0,tls->efcvt_buffer); HeapFree(GetProcessHeap(),0,tls->efcvt_buffer);
HeapFree(GetProcessHeap(),0,tls->asctime_buffer); HeapFree(GetProcessHeap(),0,tls->asctime_buffer);
HeapFree(GetProcessHeap(),0,tls->wasctime_buffer); HeapFree(GetProcessHeap(),0,tls->wasctime_buffer);
HeapFree(GetProcessHeap(),0,tls->strerror_buffer);
} }
HeapFree(GetProcessHeap(), 0, tls); HeapFree(GetProcessHeap(), 0, tls);
TRACE("finished thread free\n"); TRACE("finished thread free\n");

View File

@ -101,6 +101,7 @@ struct __thread_data {
char *asctime_buffer; /* buffer for asctime */ char *asctime_buffer; /* buffer for asctime */
MSVCRT_wchar_t *wasctime_buffer; /* buffer for wasctime */ MSVCRT_wchar_t *wasctime_buffer; /* buffer for wasctime */
struct MSVCRT_tm time_buffer; /* buffer for localtime/gmtime */ struct MSVCRT_tm time_buffer; /* buffer for localtime/gmtime */
char *strerror_buffer; /* buffer for strerror */
int fpecode; int fpecode;
MSVCRT_terminate_function terminate_handler; MSVCRT_terminate_function terminate_handler;
MSVCRT_unexpected_function unexpected_handler; MSVCRT_unexpected_function unexpected_handler;