msvcrt: Properly implemented strerror and perror (based on a patch by
Uwe Bonnes).
This commit is contained in:
parent
401ead5c8f
commit
2dacd3c54e
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -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");
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user