summaryrefslogtreecommitdiffhomepage
path: root/src/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c34
1 files changed, 13 insertions, 21 deletions
diff --git a/src/string.c b/src/string.c
index d34256e63..d474f6f96 100644
--- a/src/string.c
+++ b/src/string.c
@@ -167,7 +167,7 @@ mrb_str_buf_new(mrb_state *mrb, int capa)
}
static void
-str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, mrb_int len)
+str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, size_t len)
{
mrb_int capa;
mrb_int total;
@@ -202,7 +202,7 @@ str_buf_cat(mrb_state *mrb, struct RString *s, const char *ptr, mrb_int len)
}
mrb_value
-mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, mrb_int len)
+mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len)
{
if (len == 0) return str;
str_buf_cat(mrb, mrb_str_ptr(str), ptr, len);
@@ -210,14 +210,10 @@ mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, mrb_int len)
}
mrb_value
-mrb_str_new(mrb_state *mrb, const char *p, mrb_int len)
+mrb_str_new(mrb_state *mrb, const char *p, size_t len)
{
struct RString *s;
- if (len < 0) {
- len = 0;
- }
-
s = str_new(mrb, p, len);
return mrb_obj_value(s);
}
@@ -237,8 +233,8 @@ mrb_str_new_cstr(mrb_state *mrb, const char *p)
if (p) {
len = strlen(p);
- if (len > MRB_INT_MAX) {
- len = MRB_INT_MAX;
+ if ((mrb_int)len < 0) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "argument too big");
}
}
else {
@@ -563,8 +559,7 @@ str_eql(mrb_state *mrb, const mrb_value str1, const mrb_value str2)
{
const size_t len = RSTRING_LEN(str1);
- /* PARANOID: assert(SIZE_MAX >= MRB_INT_MAX) */
-
+ /* assert(SIZE_MAX >= MRB_INT_MAX) */
if (len != RSTRING_LEN(str2)) return FALSE;
if (memcmp(RSTRING_PTR(str1), RSTRING_PTR(str2), len) == 0)
return TRUE;
@@ -2055,6 +2050,7 @@ mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck)
char *end;
char sign = 1;
int c;
+ unsigned int n;
mrb_int val;
#undef ISDIGIT
@@ -2159,8 +2155,11 @@ mrb_cstr_to_inum(mrb_state *mrb, const char *str, int base, int badcheck)
return mrb_fixnum_value(0);
}
- val = strtoul((char*)str, &end, base);
-
+ n = strtoul((char*)str, &end, base);
+ if (n > MRB_INT_MAX) {
+ mrb_raisef(mrb, E_ARGUMENT_ERROR, "string (%s) too big for integer", str);
+ }
+ val = n;
if (badcheck) {
if (end == str) goto bad; /* no number */
while (*end && ISSPACE(*end)) end++;
@@ -2551,14 +2550,7 @@ mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, mrb_int len)
mrb_value
mrb_str_cat2(mrb_state *mrb, mrb_value str, const char *ptr)
{
- size_t len;
-
- len = strlen(ptr);
- if (len > MRB_INT_MAX) {
- len = MRB_INT_MAX;
- }
-
- return mrb_str_cat(mrb, str, ptr, len);
+ return mrb_str_cat(mrb, str, ptr, strlen(ptr));
}
mrb_value