diff options
Diffstat (limited to 'src/string.c')
| -rw-r--r-- | src/string.c | 94 |
1 files changed, 15 insertions, 79 deletions
diff --git a/src/string.c b/src/string.c index 6b8861ace..e92d76b18 100644 --- a/src/string.c +++ b/src/string.c @@ -1,3 +1,9 @@ +/* +** string.c - String class +** +** See Copyright Notice in mruby.h +*/ + #include "mruby.h" #include <stdarg.h> @@ -8,10 +14,9 @@ #include <ctype.h> #include "mruby/array.h" #include "mruby/class.h" -#include "variable.h" +#include "mruby/variable.h" #include "mruby/hash.h" #include <stdio.h> -#include "variable.h" #include "re.h" #ifdef INCLUDE_REGEXP #include "regex.h" @@ -75,14 +80,6 @@ mrb_str_set_len(mrb_state *mrb, mrb_value str, long len) static mrb_value mrb_enc_cr_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, long len, int ptr_encindex, int ptr_cr, int *ptr_cr_ret); #endif //INCLUDE_ENCODING -mrb_value -mrb_tainted_str_new(mrb_state *mrb, const char *ptr, long len) -{ - mrb_value str = mrb_str_new(mrb, ptr, len); - - //OBJ_TAINT(str); - return str; -} #ifdef INCLUDE_ENCODING mrb_value @@ -98,7 +95,7 @@ mrb_external_str_new_with_enc(mrb_state *mrb, const char *ptr, long len, mrb_enc { mrb_value str; - str = mrb_tainted_str_new(mrb, ptr, len); + str = mrb_str_new(mrb, ptr, len); if (eenc == mrb_usascii_encoding(mrb) && mrb_enc_str_coderange(mrb, str) != ENC_CODERANGE_7BIT) { mrb_enc_associate(mrb, str, mrb_ascii8bit_encoding(mrb)); @@ -151,10 +148,6 @@ mrb_str_resize(mrb_state *mrb, mrb_value str, size_t len) { size_t slen; - if (len < 0) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "negative string size (or size too big)"); - } - mrb_str_modify(mrb, str); slen = RSTRING_LEN(str); if (len != slen) { @@ -495,13 +488,13 @@ str_new4(mrb_state *mrb, enum mrb_vtype ttype, mrb_value str) RSTRING(str2)->buf = RSTRING_PTR(str); if (MRB_STR_SHARED_P(str)) { - mrb_value shared = RSTRING_SHARED(str); + struct RString *shared = RSTRING_SHARED(str); FL_SET(str2, MRB_STR_SHARED); RSTRING_SHARED(str2) = shared; } else { FL_SET(str, MRB_STR_SHARED); - RSTRING_SHARED(str) = str2; + RSTRING_SHARED(str) = mrb_str_ptr(str2); } mrb_enc_cr_str_exact_copy(mrb, str2, str); return str2; @@ -512,10 +505,6 @@ str_new(mrb_state *mrb, enum mrb_vtype ttype, const char *p, size_t len) { mrb_value str; - if (len < 0) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "negative string size (or size too big)"); - } - //str = str_alloc(mrb); str = mrb_str_buf_new(mrb, len); #ifdef INCLUDE_ENCODING @@ -603,9 +592,6 @@ mrb_value mrb_str_buf_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len) { if (len == 0) return str; - if (len < 0) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "negative string size (or size too big)"); - } return str_buf_cat(mrb, str, ptr, len); } @@ -791,8 +777,6 @@ mrb_str_plus_m(mrb_state *mrb, mrb_value self) RSTRING_PTR(str2), RSTRING_LEN(str2)); RSTRING_PTR(str3)[RSTRING_LEN(str3)] = '\0'; #ifdef INCLUDE_ENCODING - //if (OBJ_TAINTED(str1) || OBJ_TAINTED(str2)) - // OBJ_TAINT(str3); ENCODING_CODERANGE_SET(mrb, str3, mrb_enc_to_index(enc), ENC_CODERANGE_AND(ENC_CODERANGE(self), ENC_CODERANGE(str2))); #endif //INCLUDE_ENCODING @@ -883,7 +867,6 @@ mrb_str_times(mrb_state *mrb, mrb_value self) } ptr2[RSTRING_LEN(str2)] = '\0'; - //OBJ_INFECT(str2, str); mrb_enc_cr_str_copy_for_substr(mrb, str2, self); return str2; @@ -1498,7 +1481,6 @@ num_index: return mrb_nil_value(); default: tmp = mrb_str_substr(mrb, str, beg, len); - /*OBJ_INFECT(tmp, indx);*/ return tmp; } } @@ -2100,7 +2082,6 @@ mrb_str_each_line(mrb_state *mrb, mrb_value str) (rslen <= 1 || memcmp(prs->buf, p-rslen, rslen) == 0)) { line = mrb_str_new5(mrb, str, s, p - s); - /*OBJ_INFECT(line, str);*/ mrb_yield(mrb, b, line); str_mod_check(mrb, str, ptr, len); s = p; @@ -2110,7 +2091,6 @@ mrb_str_each_line(mrb_state *mrb, mrb_value str) if (s != pend) { if (p > pend) p = pend; line = mrb_str_new5(mrb, str, s, p - s); - /*OBJ_INFECT(line, str);*/ mrb_yield(mrb, b, line); } @@ -2194,7 +2174,7 @@ str_replace_shared(mrb_state *mrb, mrb_value str2, mrb_value str) str = mrb_str_new_frozen(mrb, str); RSTRING(str2)->len = RSTRING_LEN(str); RSTRING(str2)->buf = RSTRING_PTR(str); - RSTRING_SHARED(str2) = str; + RSTRING_SHARED(str2) = mrb_str_ptr(str); FL_SET(str2, MRB_STR_SHARED); mrb_enc_cr_str_exact_copy(mrb, str2, str); @@ -2218,7 +2198,6 @@ mrb_str_new_shared(mrb_state *mrb, mrb_value str) { mrb_value str2 = str_new3(mrb, mrb_obj_class(mrb, str), str); - //OBJ_INFECT(str2, str); return str2; } @@ -2230,9 +2209,9 @@ mrb_str_new_frozen(mrb_state *mrb, mrb_value orig) klass = mrb_obj_class(mrb, orig); - if (MRB_STR_SHARED_P(orig) && !mrb_nil_p(RSTRING_SHARED(orig))) { + if (MRB_STR_SHARED_P(orig) && RSTRING_SHARED(orig)) { long ofs; - ofs = RSTRING_LEN(str) - RSTRING_LEN(orig); + ofs = RSTRING_LEN(str) - RSTRING_SHARED(orig)->len; #ifdef INCLUDE_ENCODING if ((ofs > 0) || (klass != RBASIC(str)->c) || ENCODING_GET(mrb, str) != ENCODING_GET(mrb, orig)) { @@ -2405,7 +2384,6 @@ mrb_str_buf_append(mrb_state *mrb, mrb_value str, mrb_value str2) mrb_enc_cr_str_buf_cat(mrb, str, RSTRING_PTR(str2), RSTRING_LEN(str2), ENCODING_GET(mrb, str2), str2_cr, &str2_cr); - //OBJ_INFECT(str, str2); ENC_CODERANGE_SET(str2, str2_cr); return str; @@ -2468,7 +2446,6 @@ str_gsub(mrb_state *mrb, mrb_value str, mrb_int bang) mrb_int offset, blen, slen, len, last; int iter = 0; char *sp, *cp; - //int tainted = 0; mrb_encoding *str_enc; mrb_get_args(mrb, "*", &argv, &argc); @@ -2480,7 +2457,6 @@ str_gsub(mrb_state *mrb, mrb_value str, mrb_int bang) case 2: repl = argv[1]; mrb_string_value(mrb, &repl); - /*if (OBJ_TAINTED(repl)) tainted = 1;*/ break; default: mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments (%d for 2)", argc); @@ -2572,9 +2548,6 @@ str_gsub(mrb_state *mrb, mrb_value str, mrb_int bang) * <code>$&</code>, and <code>$'</code> will be set appropriately. The value * returned by the block will be substituted for the match on each call. * - * The result inherits any tainting in the original string or any supplied - * replacement string. - * * When neither a block nor a second argument is supplied, an * <code>Enumerator</code> is returned. * @@ -2792,9 +2765,9 @@ str_replace(mrb_state *mrb, mrb_value str, mrb_value str2) len = RSTRING_LEN(str2); if (MRB_STR_SHARED_P(str2)) { - mrb_value shared = RSTRING_SHARED(str2); + struct RString *shared = RSTRING_SHARED(str2); RSTRING_LEN(str) = len; - RSTRING_PTR(str) = RSTRING_PTR(str2); + RSTRING_PTR(str) = shared->buf; FL_SET(str, MRB_STR_SHARED); RSTRING_SHARED(str) = shared; } @@ -2812,9 +2785,6 @@ str_replace(mrb_state *mrb, mrb_value str, mrb_value str2) * call-seq: * str.replace(other_str) => str * - * Replaces the contents and taintedness of <i>str</i> with the corresponding - * values in <i>other_str</i>. - * * s = "hello" #=> "hello" * s.replace "world" #=> "world" */ @@ -3769,8 +3739,6 @@ mrb_str_sub_bang(mrb_state *mrb, mrb_value str) } mrb_str_modify(mrb, str); mrb_enc_associate(mrb, str, enc); - //if (OBJ_TAINTED(repl)) tainted = 1; - //if (OBJ_UNTRUSTED(repl)) untrusted = 1; if (ENC_CODERANGE_UNKNOWN < cr && cr < ENC_CODERANGE_BROKEN) { int cr2 = ENC_CODERANGE(repl); if (cr2 == ENC_CODERANGE_BROKEN || @@ -3832,9 +3800,6 @@ mrb_str_sub_bang(mrb_state *mrb, mrb_value str) * <code>$&</code>, and <code>$'</code> will be set appropriately. The value * returned by the block will be substituted for the match on each call. * - * The result inherits any tainting in the original string or any supplied - * replacement string. - * * "hello".sub(/[aeiou]/, '*') #=> "h*llo" * "hello".sub(/([aeiou])/, '<\1>') #=> "h<e>llo" * "hello".sub(/./) {|s| s.ord.to_s + ' ' } #=> "104 ello" @@ -4697,7 +4662,6 @@ mrb_str_dump(mrb_state *mrb, mrb_value str) snprintf(q, qend-q, ".force_encoding(\"%s\")", enc->name); enc = mrb_ascii8bit_encoding(mrb); } - //OBJ_INFECT(result, str); /* result from dump is ASCII */ mrb_enc_associate(mrb, result, enc); ENC_CODERANGE_SET(result, ENC_CODERANGE_7BIT); @@ -4765,35 +4729,8 @@ mrb_lastline_set(mrb_value val) mrb_value mrb_str_append(mrb_state *mrb, mrb_value str, mrb_value str2) { -#ifdef INCLUDE_ENCODING - mrb_encoding *enc; - int cr, cr2; -#endif //INCLUDE_ENCODING - - //StringValue(str2); mrb_string_value(mrb, &str2); - if (RSTRING_LEN(str2) > 0 /*&& STR_ASSOC_P(str)*/) { - long len = RSTRING_LEN(str)+RSTRING_LEN(str2); -#ifdef INCLUDE_ENCODING - enc = mrb_enc_check(mrb, str, str2); - cr = ENC_CODERANGE(str); - if ((cr2 = ENC_CODERANGE(str2)) > cr) cr = cr2; -#endif //INCLUDE_ENCODING - mrb_str_modify(mrb, str); - REALLOC_N(mrb, RSTRING(str)->buf, char, len+1); - memcpy(RSTRING(str)->buf + RSTRING(str)->len, - RSTRING_PTR(str2), RSTRING_LEN(str2)+1); - RSTRING(str)->len = len; - mrb_enc_associate(mrb, str, enc); - ENC_CODERANGE_SET(str, cr); - //OBJ_INFECT(str, str2); - return str; - } -#ifdef INCLUDE_ENCODING return mrb_str_buf_append(mrb, str, str2); -#else - return str; -#endif //INCLUDE_ENCODING } void @@ -4983,7 +4920,6 @@ mrb_str_inspect(mrb_state *mrb, mrb_value str) if (p > prev) mrb_str_buf_cat(mrb, result, prev, p - prev); mrb_str_buf_cat(mrb, result, "\"", strlen("\"")); //str_buf_cat2(result, "\""); - //OBJ_INFECT(result, str); return result; } |
