Commit b6e27218 authored by cremno's avatar cremno

MSVC: add simple (v)snprintf implementation

_snprintf is not C99's snprintf!

This simple implementation, unlike _snprintf,
always null-terminates and returns the expected
return value (in most cases).
Other C99 behaviors (like format specifiers) require
adding a complete snprintf implementation.
Do we want or need that?

The same applies to vsnprintf (aka _vsnprintf).
parent 206f89e2
...@@ -47,7 +47,11 @@ struct mrb_state; ...@@ -47,7 +47,11 @@ struct mrb_state;
# define inline __inline # define inline __inline
# endif # endif
# if _MSC_VER < 1900 # if _MSC_VER < 1900
# define snprintf _snprintf # include <stdarg.h>
MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
# define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
# define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
# endif # endif
# if _MSC_VER < 1800 # if _MSC_VER < 1800
# include <float.h> # include <float.h>
......
...@@ -183,3 +183,40 @@ mrb_regexp_p(mrb_state *mrb, mrb_value v) ...@@ -183,3 +183,40 @@ mrb_regexp_p(mrb_state *mrb, mrb_value v)
{ {
return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS)); return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS));
} }
#if defined _MSC_VER && _MSC_VER < 1900
#ifndef va_copy
static void
mrb_msvc_va_copy(va_list *dest, va_list src)
{
*dest = src;
}
#define va_copy(dest, src) msvc_va_copy(&(dest), src)
#endif
MRB_API int
mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg)
{
int cnt;
va_list argcp;
va_copy(argcp, arg);
if (n == 0 || (cnt = _vsnprintf_s(s, n, _TRUNCATE, format, argcp)) < 0) {
cnt = _vscprintf(format, arg);
}
va_end(argcp);
return cnt;
}
MRB_API int
mrb_msvc_snprintf(char *s, size_t n, const char *format, ...)
{
va_list arg;
int ret;
va_start(arg, format);
ret = mrb_msvc_vsnprintf(s, n, format, arg);
va_end(arg);
return ret;
}
#endif /* defined _MSC_VER && _MSC_VER < 1900 */
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