From df21609a204765e88ead1ffeb1923c214d399d52 Mon Sep 17 00:00:00 2001 From: cremno Date: Sat, 2 Aug 2014 02:06:42 +0200 Subject: remove unnecessary CHAR_BIT != 8 check mruby uses uint8_t which implies CHAR_BIT == 8. --- src/load.c | 4 ---- 1 file changed, 4 deletions(-) (limited to 'src') diff --git a/src/load.c b/src/load.c index 8dea4a391..6f4b89d4e 100644 --- a/src/load.c +++ b/src/load.c @@ -22,10 +22,6 @@ # define SIZE_ERROR(x) (0) #endif -#if CHAR_BIT != 8 -# error This code assumes CHAR_BIT == 8 -#endif - #if UINT32_MAX > SIZE_MAX # error This code cannot be built on your environment. #endif -- cgit v1.2.3 From a70413c4ea4c82a4f15fb1ff8ddace15198f45ed Mon Sep 17 00:00:00 2001 From: cremno Date: Sun, 3 Aug 2014 19:54:31 +0200 Subject: fix conversion warnings Those warnings are not enabled by default, but getting rid of them doesn't hurt. --- src/gc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index 6616d6188..8ff1ecc10 100644 --- a/src/gc.c +++ b/src/gc.c @@ -949,7 +949,7 @@ static void incremental_gc_until(mrb_state *mrb, enum gc_state to_state) { do { - incremental_gc(mrb, ~0); + incremental_gc(mrb, SIZE_MAX); } while (mrb->gc_state != to_state); } @@ -1162,7 +1162,7 @@ gc_start(mrb_state *mrb, mrb_value obj) static mrb_value gc_enable(mrb_state *mrb, mrb_value obj) { - int old = mrb->gc_disabled; + mrb_bool old = mrb->gc_disabled; mrb->gc_disabled = FALSE; @@ -1184,7 +1184,7 @@ gc_enable(mrb_state *mrb, mrb_value obj) static mrb_value gc_disable(mrb_state *mrb, mrb_value obj) { - int old = mrb->gc_disabled; + mrb_bool old = mrb->gc_disabled; mrb->gc_disabled = TRUE; @@ -1258,7 +1258,7 @@ gc_step_ratio_set(mrb_state *mrb, mrb_value obj) } static void -change_gen_gc_mode(mrb_state *mrb, mrb_int enable) +change_gen_gc_mode(mrb_state *mrb, mrb_bool enable) { if (is_generational(mrb) && !enable) { clear_all_old(mrb); -- cgit v1.2.3 From b6e27218ad1ffdba6d2103b85d5d9231b6380008 Mon Sep 17 00:00:00 2001 From: cremno Date: Sun, 3 Aug 2014 21:15:48 +0200 Subject: 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). --- include/mruby/value.h | 8 ++++++-- src/etc.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/include/mruby/value.h b/include/mruby/value.h index e2c9223e9..30c39c5f2 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -31,7 +31,7 @@ struct mrb_state; # define MRB_INT_MIN (INT32_MIN>>MRB_FIXNUM_SHIFT) # define MRB_INT_MAX (INT32_MAX>>MRB_FIXNUM_SHIFT) #endif - + #ifdef MRB_USE_FLOAT typedef float mrb_float; # define mrb_float_to_str(buf, i) sprintf(buf, "%.7e", i) @@ -47,7 +47,11 @@ struct mrb_state; # define inline __inline # endif # if _MSC_VER < 1900 -# define snprintf _snprintf +# include +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 # if _MSC_VER < 1800 # include diff --git a/src/etc.c b/src/etc.c index 4aee04ec0..9125aa16a 100644 --- a/src/etc.c +++ b/src/etc.c @@ -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)); } + +#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 */ -- cgit v1.2.3 From 7dabb33cf01e325b48a7b1963e961be945675c1d Mon Sep 17 00:00:00 2001 From: cremno Date: Mon, 4 Aug 2014 01:14:23 +0200 Subject: change linkage of mrb_str_size to internal Use RSTRING_LEN to get the length. --- src/string.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/string.c b/src/string.c index 26dcfea99..8ac5a436a 100644 --- a/src/string.c +++ b/src/string.c @@ -445,7 +445,7 @@ mrb_str_bytesize(mrb_state *mrb, mrb_value self) * * Returns a new string object containing a copy of str. */ -MRB_API mrb_value +static mrb_value mrb_str_size(mrb_state *mrb, mrb_value self) { struct RString *s = mrb_str_ptr(self); -- cgit v1.2.3