APIdock / Ruby
/
method

setbyte

ruby latest stable - Class: String
setbyte(p1, p2)
public

modifies the indexth byte as integer.

static VALUE
rb_str_setbyte(VALUE str, VALUE index, VALUE value)
{
 long pos = NUM2LONG(index);
 int byte = NUM2INT(value);
 long len = RSTRING_LEN(str);
 char *head, *ptr, *left = 0;
 rb_encoding *enc;
 int cr = ENC_CODERANGE_UNKNOWN, width, nlen;
 if (pos < -len || len <= pos)
 rb_raise(rb_eIndexError, "index %ld out of string", pos);
 if (pos < 0)
 pos += len;
 if (!str_independent(str))
 str_make_independent(str);
 enc = STR_ENC_GET(str);
 head = RSTRING_PTR(str);
 ptr = &head[pos];
 if (!STR_EMBED_P(str)) {
 cr = ENC_CODERANGE(str);
 switch (cr) {
 case ENC_CODERANGE_7BIT:
 left = ptr;
 *ptr = byte;
 if (ISASCII(byte)) goto end;
 nlen = rb_enc_precise_mbclen(left, head+len, enc);
 if (!MBCLEN_CHARFOUND_P(nlen))
 ENC_CODERANGE_SET(str, ENC_CODERANGE_BROKEN);
 else
 ENC_CODERANGE_SET(str, ENC_CODERANGE_VALID);
 goto end;
 case ENC_CODERANGE_VALID:
 left = rb_enc_left_char_head(head, ptr, head+len, enc);
 width = rb_enc_precise_mbclen(left, head+len, enc);
 *ptr = byte;
 nlen = rb_enc_precise_mbclen(left, head+len, enc);
 if (!MBCLEN_CHARFOUND_P(nlen))
 ENC_CODERANGE_SET(str, ENC_CODERANGE_BROKEN);
 else if (MBCLEN_CHARFOUND_LEN(nlen) != width || ISASCII(byte))
 ENC_CODERANGE_CLEAR(str);
 goto end;
 }
 }
 ENC_CODERANGE_CLEAR(str);
 *ptr = byte;
 end:
 return value;
}

AltStyle によって変換されたページ (->オリジナル) /