From ce5a3dbcbaae84d87c4f09d4e28523a59886c7ad Mon Sep 17 00:00:00 2001 From: cremno Date: Wed, 26 Nov 2014 00:52:54 +0100 Subject: add mrb_debug_strdup() and mrb_debug_strndup() They behave similar to their POSIX equivalents, except mrb_malloc_simple() is used for memory allocation and errno might not be set since ISO C99 doesn't have ENOMEM. --- mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c | 34 +++++++++++++++++++++++ mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h | 14 ++++++++++ 2 files changed, 48 insertions(+) create mode 100644 mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c create mode 100644 mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h (limited to 'mrbgems/mruby-bin-debugger') diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c b/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c new file mode 100644 index 000000000..4cf528feb --- /dev/null +++ b/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.c @@ -0,0 +1,34 @@ +/* +** apistring.c +** +*/ + +#include +#include "apistring.h" + +static size_t +mrb_debug_strnlen(const char *s, size_t maxlen) +{ + const char *p = memchr(s, '\0', maxlen); + return p != NULL ? (size_t)(p - s) : maxlen; +} + +char* +mrb_debug_strndup(mrb_state *mrb, const char *s, size_t size) +{ + size_t l = mrb_debug_strnlen(s, size); + char *d = mrb_malloc_simple(mrb, l + 1); + if (d != NULL) { + memcpy(d, s, l); + d[l] = '\0'; + } + return d; +} + +char* +mrb_debug_strdup(mrb_state *mrb, const char *s) +{ + size_t z = strlen(s) + 1; + char *d = mrb_malloc_simple(mrb, z); + return d != NULL ? memcpy(d, s, z) : NULL; +} diff --git a/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h b/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h new file mode 100644 index 000000000..e48478d2e --- /dev/null +++ b/mrbgems/mruby-bin-debugger/tools/mrdb/apistring.h @@ -0,0 +1,14 @@ +/* + * apistring.h + */ + +#ifndef APISTRING_H_ +#define APISTRING_H_ + +#include "mruby.h" + +/* both functions return a null pointer on failure */ +char *mrb_debug_strndup(mrb_state *mrb, const char *s, size_t size); +char *mrb_debug_strdup(mrb_state *mrb, const char *s); + +#endif /* APISTRING_H_ */ -- cgit v1.2.3