Commit bfc2f5f2 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

msvcrt: Use callback based printf in sprintf functions family.

parent b9e456aa
...@@ -35,6 +35,30 @@ typedef struct FUNC_NAME(pf_flags_t) ...@@ -35,6 +35,30 @@ typedef struct FUNC_NAME(pf_flags_t)
APICHAR Format; APICHAR Format;
} FUNC_NAME(pf_flags); } FUNC_NAME(pf_flags);
struct FUNC_NAME(_str_ctx) {
MSVCRT_size_t len;
APICHAR *buf;
};
static int FUNC_NAME(puts_clbk_str)(void *ctx, int len, const APICHAR *str)
{
struct FUNC_NAME(_str_ctx) *out = ctx;
if(!out->buf)
return len;
if(out->len < len) {
memcpy(out->buf, str, out->len);
out->buf += out->len;
out->len = 0;
return -1;
}
memcpy(out->buf, str, len*sizeof(APICHAR));
out->buf += len;
return len;
}
static inline const APICHAR* FUNC_NAME(pf_parse_int)(const APICHAR *fmt, int *val) static inline const APICHAR* FUNC_NAME(pf_parse_int)(const APICHAR *fmt, int *val)
{ {
*val = 0; *val = 0;
......
...@@ -1114,40 +1114,19 @@ printf_arg arg_clbk_valist(void *ctx, int arg_pos, int type, __ms_va_list *valis ...@@ -1114,40 +1114,19 @@ printf_arg arg_clbk_valist(void *ctx, int arg_pos, int type, __ms_va_list *valis
} }
/********************************************************************* /*********************************************************************
* vsnprintf_internal (INTERNAL)
*/
static inline int vsnprintf_internal( char *str, MSVCRT_size_t len, const char *format,
MSVCRT__locale_t locale, BOOL valid, __ms_va_list valist )
{
DWORD sz;
LPWSTR formatW = NULL;
pf_output out;
int r;
out.unicode = FALSE;
out.buf.A = str;
out.grow.A = NULL;
out.used = 0;
out.len = len;
sz = MultiByteToWideChar( CP_ACP, 0, format, -1, NULL, 0 );
formatW = HeapAlloc( GetProcessHeap(), 0, sz*sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, 0, format, -1, formatW, sz );
r = pf_vsnprintf( &out, formatW, locale, valid, valist );
HeapFree( GetProcessHeap(), 0, formatW );
return r;
}
/*********************************************************************
* _vsnprintf (MSVCRT.@) * _vsnprintf (MSVCRT.@)
*/ */
int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len, int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len,
const char *format, __ms_va_list valist ) const char *format, __ms_va_list valist )
{ {
return vsnprintf_internal(str, len, format, NULL, FALSE, valist); static const char nullbyte = '\0';
struct _str_ctx_a ctx = {len, str};
int ret;
ret = pf_printf_a(puts_clbk_str_a, &ctx, format, NULL, FALSE, FALSE,
arg_clbk_valist, NULL, valist);
puts_clbk_str_a(&ctx, 1, &nullbyte);
return ret;
} }
/********************************************************************* /*********************************************************************
...@@ -1156,7 +1135,14 @@ int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len, ...@@ -1156,7 +1135,14 @@ int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len,
int CDECL MSVCRT_vsnprintf_l( char *str, MSVCRT_size_t len, const char *format, int CDECL MSVCRT_vsnprintf_l( char *str, MSVCRT_size_t len, const char *format,
MSVCRT__locale_t locale, __ms_va_list valist ) MSVCRT__locale_t locale, __ms_va_list valist )
{ {
return vsnprintf_internal(str, len, format, locale, FALSE, valist); static const char nullbyte = '\0';
struct _str_ctx_a ctx = {len, str};
int ret;
ret = pf_printf_a(puts_clbk_str_a, &ctx, format, locale, FALSE, FALSE,
arg_clbk_valist, NULL, valist);
puts_clbk_str_a(&ctx, 1, &nullbyte);
return ret;
} }
/********************************************************************* /*********************************************************************
...@@ -1166,6 +1152,8 @@ int CDECL MSVCRT_vsnprintf_s_l( char *str, MSVCRT_size_t sizeOfBuffer, ...@@ -1166,6 +1152,8 @@ int CDECL MSVCRT_vsnprintf_s_l( char *str, MSVCRT_size_t sizeOfBuffer,
MSVCRT_size_t count, const char *format, MSVCRT_size_t count, const char *format,
MSVCRT__locale_t locale, __ms_va_list valist ) MSVCRT__locale_t locale, __ms_va_list valist )
{ {
static const char nullbyte = '\0';
struct _str_ctx_a ctx;
int len, ret; int len, ret;
if(sizeOfBuffer<count+1 || count==-1) if(sizeOfBuffer<count+1 || count==-1)
...@@ -1173,7 +1161,11 @@ int CDECL MSVCRT_vsnprintf_s_l( char *str, MSVCRT_size_t sizeOfBuffer, ...@@ -1173,7 +1161,11 @@ int CDECL MSVCRT_vsnprintf_s_l( char *str, MSVCRT_size_t sizeOfBuffer,
else else
len = count+1; len = count+1;
ret = vsnprintf_internal(str, len, format, locale, TRUE, valist); ctx.len = len;
ctx.buf = str;
ret = pf_printf_a(puts_clbk_str_a, &ctx, format, locale, FALSE, TRUE,
arg_clbk_valist, NULL, valist);
puts_clbk_str_a(&ctx, 1, &nullbyte);
if(ret<0 || ret==len) { if(ret<0 || ret==len) {
if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) { if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) {
...@@ -1263,30 +1255,19 @@ int CDECL MSVCRT__scprintf(const char *format, ...) ...@@ -1263,30 +1255,19 @@ int CDECL MSVCRT__scprintf(const char *format, ...)
} }
/********************************************************************* /*********************************************************************
* vsnwprintf_internal (INTERNAL)
*/
static inline int vsnwprintf_internal(MSVCRT_wchar_t *str, MSVCRT_size_t len,
const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, BOOL valid,
__ms_va_list valist)
{
pf_output out;
out.unicode = TRUE;
out.buf.W = str;
out.grow.W = NULL;
out.used = 0;
out.len = len;
return pf_vsnprintf( &out, format, locale, valid, valist );
}
/*********************************************************************
* _vsnwprintf (MSVCRT.@) * _vsnwprintf (MSVCRT.@)
*/ */
int CDECL MSVCRT_vsnwprintf(MSVCRT_wchar_t *str, MSVCRT_size_t len, int CDECL MSVCRT_vsnwprintf(MSVCRT_wchar_t *str, MSVCRT_size_t len,
const MSVCRT_wchar_t *format, __ms_va_list valist) const MSVCRT_wchar_t *format, __ms_va_list valist)
{ {
return vsnwprintf_internal(str, len, format, NULL, FALSE, valist); static const MSVCRT_wchar_t nullbyte = '\0';
struct _str_ctx_w ctx = {len, str};
int ret;
ret = pf_printf_w(puts_clbk_str_w, &ctx, format, NULL, FALSE, FALSE,
arg_clbk_valist, NULL, valist);
puts_clbk_str_w(&ctx, 1, &nullbyte);
return ret;
} }
/********************************************************************* /*********************************************************************
...@@ -1296,7 +1277,14 @@ int CDECL MSVCRT_vsnwprintf_l(MSVCRT_wchar_t *str, MSVCRT_size_t len, ...@@ -1296,7 +1277,14 @@ int CDECL MSVCRT_vsnwprintf_l(MSVCRT_wchar_t *str, MSVCRT_size_t len,
const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, const MSVCRT_wchar_t *format, MSVCRT__locale_t locale,
__ms_va_list valist) __ms_va_list valist)
{ {
return vsnwprintf_internal(str, len, format, locale, FALSE, valist); static const MSVCRT_wchar_t nullbyte = '\0';
struct _str_ctx_w ctx = {len, str};
int ret;
ret = pf_printf_w(puts_clbk_str_w, &ctx, format, locale, FALSE, FALSE,
arg_clbk_valist, NULL, valist);
puts_clbk_str_w(&ctx, 1, &nullbyte);
return ret;
} }
/********************************************************************* /*********************************************************************
...@@ -1306,13 +1294,19 @@ int CDECL MSVCRT_vsnwprintf_s_l( MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfBuffer ...@@ -1306,13 +1294,19 @@ int CDECL MSVCRT_vsnwprintf_s_l( MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfBuffer
MSVCRT_size_t count, const MSVCRT_wchar_t *format, MSVCRT_size_t count, const MSVCRT_wchar_t *format,
MSVCRT__locale_t locale, __ms_va_list valist) MSVCRT__locale_t locale, __ms_va_list valist)
{ {
static const MSVCRT_wchar_t nullbyte = '\0';
struct _str_ctx_w ctx;
int len, ret; int len, ret;
len = sizeOfBuffer; len = sizeOfBuffer;
if(count!=-1 && len>count+1) if(count!=-1 && len>count+1)
len = count+1; len = count+1;
ret = vsnwprintf_internal(str, len, format, locale, TRUE, valist); ctx.len = len;
ctx.buf = str;
ret = pf_printf_w(puts_clbk_str_w, &ctx, format, locale, FALSE, TRUE,
arg_clbk_valist, NULL, valist);
puts_clbk_str_w(&ctx, 1, &nullbyte);
if(ret<0 || ret==len) { if(ret<0 || ret==len) {
if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) { if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment