summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby/string.h1
-rw-r--r--src/class.c15
-rw-r--r--src/string.c29
3 files changed, 23 insertions, 22 deletions
diff --git a/include/mruby/string.h b/include/mruby/string.h
index 8a26192e6..31e101246 100644
--- a/include/mruby/string.h
+++ b/include/mruby/string.h
@@ -47,6 +47,7 @@ struct RString {
RSTRING_EMBED_LEN_MAX :\
RSTRING(s)->as.heap.aux.capa)
#define RSTRING_END(s) (RSTRING_PTR(s) + RSTRING_LEN(s))
+mrb_int mrb_str_strlen(mrb_state*, struct RString*);
#define MRB_STR_SHARED 1
#define MRB_STR_NOFREE 2
diff --git a/src/class.c b/src/class.c
index d880e3627..72e96ece8 100644
--- a/src/class.c
+++ b/src/class.c
@@ -534,25 +534,12 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
case 'z':
{
mrb_value ss;
- struct RString *s;
char **ps;
- mrb_int len;
ps = va_arg(ap, char**);
if (i < argc) {
- size_t size_t_len;
ss = to_str(mrb, *sp++);
- s = mrb_str_ptr(ss);
- size_t_len = strlen(RSTRING_PTR(ss));
- mrb_assert(size_t_len <= MRB_INT_MAX);
- len = (mrb_int)size_t_len;
- if (len < RSTRING_LEN(ss)) {
- mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
- }
- else if (len > RSTRING_LEN(ss)) {
- mrb_str_modify(mrb, s);
- }
- *ps = RSTRING_PTR(ss);
+ *ps = mrb_string_value_cstr(mrb, &ss);
i++;
}
}
diff --git a/src/string.c b/src/string.c
index 123a1dcb5..5f1f5b50b 100644
--- a/src/string.c
+++ b/src/string.c
@@ -54,6 +54,21 @@ typedef struct mrb_shared_string {
static mrb_value str_replace(mrb_state *mrb, struct RString *s1, struct RString *s2);
static mrb_value mrb_str_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len);
+mrb_int
+mrb_str_strlen(mrb_state *mrb, struct RString *s)
+{
+ mrb_int i, max = STR_LEN(s);
+ char *p = STR_PTR(s);
+
+ if (!p) return 0;
+ for (i=0; i<max; i++) {
+ if (p[i] == '\0') {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
+ }
+ }
+ return max;
+}
+
#define RESIZE_CAPA(s,capacity) do {\
if (STR_EMBED_P(s)) {\
if (RSTRING_EMBED_LEN_MAX < (capacity)) {\
@@ -2066,16 +2081,14 @@ char *
mrb_string_value_cstr(mrb_state *mrb, mrb_value *ptr)
{
struct RString *ps = mrb_str_ptr(*ptr);
- char *s = STR_PTR(ps);
- mrb_int len;
+ mrb_int len = mrb_str_strlen(mrb, ps);
+ char *p = STR_PTR(ps);
- len = STR_LEN(ps);
- mrb_assert(len >= 0);
- mrb_assert((size_t)len <= SIZE_MAX);
- if (!s || (size_t)len != strlen(s)) {
- mrb_raise(mrb, E_ARGUMENT_ERROR, "string contains null byte");
+ if (!p || p[len] != '\0') {
+ mrb_str_modify(mrb, ps);
+ return STR_PTR(ps);
}
- return s;
+ return p;
}
mrb_value