Class: StringScanner::UTF8
- Inherits:
-
StringScanner
- Object
- StringScanner
- StringScanner::UTF8
- Defined in:
- lib/utf8/string_scanner.rb,
ext/utf8/string_scanner_utf8.c
Instance Method Summary collapse
-
#as_raw ⇒ Object
Returns a non-UTF8-aware version of StringScanner wrapping your original string.
-
#getch ⇒ Object
Works like StringScanner#getch but is UTF8-aware.
Methods inherited from StringScanner
Instance Method Details
#as_raw ⇒ Object
Returns a non-UTF8-aware version of StringScanner wrapping your original string
NOTE: this will lose all state associated with the current StringScanner::UTF8 instance (like the current scan position)
17 18 19 |
# File 'lib/utf8/string_scanner.rb', line 17 def as_raw StringScanner.new(self.string) end |
#getch ⇒ Object
Works like StringScanner#getch but is UTF8-aware
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'ext/utf8/string_scanner_utf8.c', line 41
static VALUE rb_cStringScanner_UTF8_getch(VALUE self) {
unsigned char *str;
long len = 0, pos = 0;
VALUE utf8Str, curStr;
int8_t lastCharLen=0;
#ifndef RUBINIUS
struct strscanner *scanner;
GET_SCANNER(self, scanner);
curStr = scanner->str;
pos = scanner->curr;
#else
curStr = rb_iv_get(self, "@string");
pos = FIX2LONG(rb_iv_get(self, "@pos"));
#endif
str = (unsigned char *)RSTRING_PTR(curStr);
len = RSTRING_LEN(curStr);
if (len > 0 && len > pos) {
lastCharLen = utf8CharLen(str, len);
if (lastCharLen < 0) {
rb_raise(rb_eArgError, "invalid utf-8 byte sequence");
}
utf8Str = rb_str_new((char *)str+pos, lastCharLen);
pos += lastCharLen;
#ifndef RUBINIUS
scanner->curr = pos;
#else
rb_iv_set(self, "@pos", LONG2FIX(pos));
#endif
AS_UTF8(utf8Str);
return utf8Str;
} else {
return Qnil;
}
}
|