diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-15 06:35:20 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-02-15 06:35:20 +0000 |
commit | 12b1578cabdf06cc76f6debaf8a953a922b47154 (patch) | |
tree | df3795dd9689dc2977be451d459aa916121ad4bf | |
parent | b0333388ab089e70be9109434ba5a6961b08fa60 (diff) | |
download | ruby-12b1578cabdf06cc76f6debaf8a953a922b47154.tar.gz |
* string.c (rb_str_getbyte): new method.
(rb_str_setbyte): new method.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15484 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | string.c | 45 |
2 files changed, 50 insertions, 0 deletions
@@ -1,3 +1,8 @@ +Fri Feb 15 15:34:47 2008 Tanaka Akira <akr@fsij.org> + + * string.c (rb_str_getbyte): new method. + (rb_str_setbyte): new method. + Fri Feb 15 15:29:03 2008 Tanaka Akira <akr@fsij.org> * lib/require_relative.rb: new file. @@ -3127,6 +3127,49 @@ rb_str_chr(VALUE str) /* * call-seq: + * str.getbyte(index) => 0 .. 255 + * + * returns the <i>index</i>th byte as an integer. + */ +static VALUE +rb_str_getbyte(VALUE str, VALUE index) +{ + long pos = NUM2LONG(index); + + if (pos < 0) + pos += RSTRING_LEN(str); + if (pos < 0 || RSTRING_LEN(str) <= pos) + return Qnil; + + return INT2FIX((unsigned char)RSTRING_PTR(str)[pos]); +} + +/* + * call-seq: + * str.setbyte(index, int) => int + * + * modifies the <i>index</i>th byte as <i>int</i>. + */ +static VALUE +rb_str_setbyte(VALUE str, VALUE index, VALUE value) +{ + long pos = NUM2LONG(index); + int byte = NUM2INT(value); + + rb_str_modify(str); + + if (pos < -RSTRING_LEN(str) || RSTRING_LEN(str) <= pos) + rb_raise(rb_eIndexError, "index %ld out of string", pos); + if (pos < 0) + pos += RSTRING_LEN(str); + + RSTRING_PTR(str)[pos] = byte; + + return value; +} + +/* + * call-seq: * str.reverse => new_str * * Returns a new string with the characters from <i>str</i> in reverse order. @@ -6107,6 +6150,8 @@ Init_String(void) rb_define_method(rb_cString, "replace", rb_str_replace, 1); rb_define_method(rb_cString, "clear", rb_str_clear, 0); rb_define_method(rb_cString, "chr", rb_str_chr, 0); + rb_define_method(rb_cString, "getbyte", rb_str_getbyte, 1); + rb_define_method(rb_cString, "setbyte", rb_str_setbyte, 2); rb_define_method(rb_cString, "to_i", rb_str_to_i, -1); rb_define_method(rb_cString, "to_f", rb_str_to_f, 0); |