27#include "_autogen_unicode_case.h"
46 static const char ws[] =
" \t\r\n\f\v";
48 for(
int i = 0; i <
sizeof(ws); i++ ) {
49 if( ch == ws[i] )
return 1;
66 uint8_t *buf = mrbc_alloc(vm, len+1);
72 memcpy( buf, src, len );
126#if defined(MRBC_ALLOC_VMID)
132 mrbc_set_vm_id( str->
string, 0 );
191 memcpy(str + len1, s2->
string->
data, len2 + 1);
218 memcpy(str + len1, s2, len2);
219 str[len1 + len2] = 0;
221 memset(str + len1, 0, len2 + 1);
245 while( try_cnt >= 0 ) {
272 if( *p1 ==
'\0' )
break;
285 int new_size = p2 - p1 + 1;
289 if( p1 != buf ) memmove( buf, p1, new_size );
290 buf[new_size] =
'\0';
316 int new_size = p2 - p1 + 1;
320 buf[new_size] =
'\0';
327#if !MRBC_USE_STRING_UTF8 || !MRBC_USE_UNICODE_CASE
341 if (
'a' <= data[len] && data[len] <=
'z') {
342 data[len] = data[len] - (
'a' -
'A');
363 if (
'A' <= data[len] && data[len] <=
'Z') {
364 data[len] = data[len] + (
'a' -
'A');
373#if MRBC_USE_STRING_UTF8
380int mrbc_string_utf8_size(
const char *str)
382 unsigned char c = (
unsigned char)*str;
384 if( (c & 0x80) == 0x00 )
return 1;
385 if( (c & 0xE0) == 0xC0 )
return 2;
386 if( (c & 0xF0) == 0xE0 )
return 3;
387 if( (c & 0xF8) == 0xF0 )
return 4;
404static int utf8_validated_char_len(
const char *str,
const char *end)
406 int char_len = mrbc_string_utf8_size(str);
408 if( char_len == 0 )
return 1;
409 if( str + char_len > end )
return 1;
411 for(
int j = 1; j < char_len; j++ ) {
412 if( ((
unsigned char)str[j] & 0xC0) != 0x80 )
return 1;
429int mrbc_string_char_size(
const char *str,
int len)
432 const char *end = str + len;
435 int char_len = utf8_validated_char_len(str, end);
451int mrbc_string_chars2bytes(
mrbc_value *src,
int off,
int idx)
457 for(
int i = 0; i < idx && str < end; i++ ) {
458 int char_len = utf8_validated_char_len(str, end);
473int mrbc_string_bytes2chars(
const mrbc_value *src,
int byte_index)
476 const char *target = str + byte_index;
479 while( str < target ) {
480 int char_len = mrbc_string_utf8_size(str);
481 if( char_len == 0 ) char_len = 1;
485 return (str == target) ? count : -1;
489#if MRBC_USE_UNICODE_CASE
497static int32_t unicode_decode_utf8(
const uint8_t *str,
int *len_out)
503 if( (c & 0x80) == 0 ) {
506 }
else if( (c & 0xE0) == 0xC0 ) {
507 cp = (c & 0x1F) << 6 | (str[1] & 0x3F);
509 }
else if( (c & 0xF0) == 0xE0 ) {
510 cp = (c & 0x0F) << 12 | (str[1] & 0x3F) << 6 | (str[2] & 0x3F);
512 }
else if( (c & 0xF8) == 0xF0 ) {
513 cp = (c & 0x07) << 18 | (str[1] & 0x3F) << 12 | (str[2] & 0x3F) << 6 | (str[3] & 0x3F);
531static int unicode_encode_utf8(int32_t cp, uint8_t *buf)
536 }
else if( cp < 0x800 ) {
537 buf[0] = 0xC0 | (cp >> 6);
538 buf[1] = 0x80 | (cp & 0x3F);
540 }
else if( cp < 0x10000 ) {
541 buf[0] = 0xE0 | (cp >> 12);
542 buf[1] = 0x80 | ((cp >> 6) & 0x3F);
543 buf[2] = 0x80 | (cp & 0x3F);
546 buf[0] = 0xF0 | (cp >> 18);
547 buf[1] = 0x80 | ((cp >> 12) & 0x3F);
548 buf[2] = 0x80 | ((cp >> 6) & 0x3F);
549 buf[3] = 0x80 | (cp & 0x3F);
563static int32_t unicode_case_lookup_range(int32_t cp,
const case_range_t *ranges,
int count)
565 for(
int i = 0; i < count; i++ ) {
566 if( ranges[i].start <= cp && cp <= ranges[i].end ) {
568 int32_t converted = cp ^ ranges[i].xor_val;
587static int32_t unicode_case_lookup_exception(int32_t cp,
const case_exception_t *exceptions,
int count)
589 int low = 0, high = count - 1;
591 while( low <= high ) {
592 int mid = (low + high) / 2;
593 if( exceptions[mid].from == cp ) {
594 return exceptions[mid].to;
595 }
else if( exceptions[mid].from < cp ) {
611static int32_t unicode_upcase_codepoint(int32_t cp)
613 if( cp < 0 || cp > 0xFFFF )
return cp;
616 int32_t result = unicode_case_lookup_range(cp, upcase_ranges, UPCASE_RANGES_COUNT);
617 if( result != cp )
return result;
620 return unicode_case_lookup_exception(cp, upcase_exceptions, UPCASE_EXCEPTIONS_COUNT);
630static int32_t unicode_downcase_codepoint(int32_t cp)
632 if( cp < 0 || cp > 0xFFFF )
return cp;
635 int32_t result = unicode_case_lookup_range(cp, downcase_ranges, DOWNCASE_RANGES_COUNT);
636 if( result != cp )
return result;
639 return unicode_case_lookup_exception(cp, downcase_exceptions, DOWNCASE_EXCEPTIONS_COUNT);
657 int needs_realloc = 0;
658 for(
int i = 0; i < len; ) {
660 int32_t cp = unicode_decode_utf8(data + i, &char_len);
661 int32_t upper_cp = unicode_upcase_codepoint(cp);
664 int new_char_len = unicode_encode_utf8(upper_cp, buf);
665 new_len += new_char_len;
666 if( new_char_len != char_len ) needs_realloc = 1;
670 if( needs_realloc ) {
673 if( !new_data )
return 0;
676 for(
int i = 0; i < len; ) {
678 int32_t cp = unicode_decode_utf8(data + i, &char_len);
679 int32_t upper_cp = unicode_upcase_codepoint(cp);
681 int new_char_len = unicode_encode_utf8(upper_cp, new_data + j);
682 if( upper_cp != cp ) count++;
686 new_data[new_len] =
'\0';
693 for(
int i = 0; i < len; ) {
695 int32_t cp = unicode_decode_utf8(data + i, &char_len);
696 int32_t upper_cp = unicode_upcase_codepoint(cp);
698 if( upper_cp != cp ) {
699 unicode_encode_utf8(upper_cp, data + i);
724 int needs_realloc = 0;
725 for(
int i = 0; i < len; ) {
727 int32_t cp = unicode_decode_utf8(data + i, &char_len);
728 int32_t lower_cp = unicode_downcase_codepoint(cp);
731 int new_char_len = unicode_encode_utf8(lower_cp, buf);
732 new_len += new_char_len;
733 if( new_char_len != char_len ) needs_realloc = 1;
737 if( needs_realloc ) {
740 if( !new_data )
return 0;
743 for(
int i = 0; i < len; ) {
745 int32_t cp = unicode_decode_utf8(data + i, &char_len);
746 int32_t lower_cp = unicode_downcase_codepoint(cp);
748 int new_char_len = unicode_encode_utf8(lower_cp, new_data + j);
749 if( lower_cp != cp ) count++;
753 new_data[new_len] =
'\0';
760 for(
int i = 0; i < len; ) {
762 int32_t cp = unicode_decode_utf8(data + i, &char_len);
763 int32_t lower_cp = unicode_downcase_codepoint(cp);
765 if( lower_cp != cp ) {
766 unicode_encode_utf8(lower_cp, data + i);
842 for(
int i = 0; i < v[1].
i; i++ ) {
858#if MRBC_USE_STRING_UTF8
885 if( base < 2 || base > 36 ) {
903#if MRBC_USE_FLOAT == 1
931#if MRBC_USE_STRING_UTF8
938 if( codepoint < 0 || codepoint > 0x10FFFF ) {
942 if( codepoint >= 0xD800 && codepoint <= 0xDFFF ) {
947 len = mrbc_utf8_encode(codepoint, buf);
962 int target_len,
int *pos,
int *len)
966 if (*pos < 0) *pos += target_len;
967 if (*pos >= target_len)
return 1;
973 if( *pos < 0 ) *pos += target_len;
981 if( *pos < 0 ) *pos += target_len;
996 if( pos2 < 0 ) pos2 += target_len;
1014 if( *pos < 0 || *pos > target_len )
return 1;
1015 if( *len > target_len - *pos ) *len = target_len - *pos;
1033#if MRBC_USE_STRING_UTF8
1045#if MRBC_USE_STRING_UTF8
1046 int byte_pos = mrbc_string_chars2bytes(&v[0], 0, pos);
1047 int byte_len = mrbc_string_chars2bytes(&v[0], byte_pos, len);
1081#if MRBC_USE_STRING_UTF8
1113 if( pos < 0 ) pos += target_len;
1114 if( pos < 0 || pos > target_len ) {
1131 if( pos2 < 0 ) pos2 += target_len;
1142 if( len < 0 ) len = 0;
1152 int len1 = target_len;
1154 if( pos < 0 ) pos = len1 + pos;
1155 if( len > len1 - pos ) len = len1 - pos;
1156 if( pos < 0 || pos > len1 || len < 0) {
1161#if MRBC_USE_STRING_UTF8
1163 int byte_pos = mrbc_string_chars2bytes(&v[0], 0, pos);
1164 int byte_len = mrbc_string_chars2bytes(&v[0], byte_pos, len);
1167 int byte_len3 = byte_len1 + len2 - byte_len;
1169 if( byte_len1 < byte_len3 ) {
1170 str = mrbc_realloc(vm, str, byte_len3+1);
1173 memmove( str + byte_pos + len2, str + byte_pos + byte_len, byte_len1 - byte_pos - byte_len + 1 );
1176 if( byte_len1 > byte_len3 ) {
1177 str = mrbc_realloc(vm, str, byte_len3+1);
1183 int len3 = len1 + len2 - len;
1186 str = mrbc_realloc(vm, str, len3+1);
1189 memmove( str + pos + len2, str + pos + len, len1 - pos - len + 1 );
1193 str = mrbc_realloc(vm, str, len3+1);
1275 if( idx >= len ) idx = -1;
1304 if( idx < 0 || idx >= len ) {
1328#if MRBC_USE_STRING_UTF8
1330 if( offset < 0 ) offset += char_len;
1331 if( offset < 0 )
goto NIL_RETURN;
1333 offset = mrbc_string_chars2bytes(&v[0], 0, offset);
1336 if( offset < 0 )
goto NIL_RETURN;
1345 if( index < 0 )
goto NIL_RETURN;
1347#if MRBC_USE_STRING_UTF8
1349 index = mrbc_string_bytes2chars(&v[0], index);
1350 if( index < 0 )
goto NIL_RETURN;
1375#if MRBC_USE_STRING_UTF8
1376 for(
int i = 0; i < size; ) {
1377 unsigned char uch = (
unsigned char)s[i];
1385 int char_len = utf8_validated_char_len(s + i, s + size);
1386 int raw_len = mrbc_string_utf8_size(s + i);
1387 if( raw_len >= 2 && char_len == raw_len ) {
1396 buf[2] =
"0123456789ABCDEF"[uch >> 4];
1397 buf[3] =
"0123456789ABCDEF"[uch & 0x0f];
1405 for(
int i = 0; i < size; i++ ) {
1428#if MRBC_USE_STRING_UTF8
1431 int char_len = utf8_validated_char_len((
const char *)s, end);
1434 if( char_len == 1 ) {
1436 }
else if( char_len == 2 ) {
1437 codepoint = ((s[0] & 0x1F) << 6) | (s[1] & 0x3F);
1438 }
else if( char_len == 3 ) {
1439 codepoint = ((s[0] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F);
1440 }
else if( char_len == 4 ) {
1441 codepoint = ((s[0] & 0x07) << 18) | ((s[1] & 0x3F) << 12) |
1442 ((s[2] & 0x3F) << 6) | (s[3] & 0x3F);
1461#if MRBC_USE_STRING_UTF8
1484 if( pos < 0 ) pos += target_len;
1485 if( pos < 0 )
goto RETURN_NIL;
1486 if( len > (target_len - pos) ) len = target_len - pos;
1487 if( len < 0 )
goto RETURN_NIL;
1488 if( argc == 1 && len <= 0 )
goto RETURN_NIL;
1490#if MRBC_USE_STRING_UTF8
1492 int byte_pos = mrbc_string_chars2bytes(&v[0], 0, pos);
1493 int byte_len = mrbc_string_chars2bytes(&v[0], byte_pos, len);
1498 if( byte_len > 0 ) {
1500 byte_size - byte_pos - byte_len + 1 );
1565 if( sep_len == 0 ) sep_len++;
1595#if MRBC_USE_STRING_UTF8
1598 if( char_len == 0 ) char_len = 1;
1620 if( pos < 0 )
break;
1621 offset = pos + sep_len;
1628 if( idx < 0 )
break;
1741#if MRBC_USE_STRING_UTF8
1749static int32_t tr_utf8_decode(
const char **str)
1751 const unsigned char *s = (
const unsigned char *)*str;
1758 }
else if( (s[0] & 0xE0) == 0xC0 ) {
1759 codepoint = ((s[0] & 0x1F) << 6) | (s[1] & 0x3F);
1761 }
else if( (s[0] & 0xF0) == 0xE0 ) {
1762 codepoint = ((s[0] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F);
1764 }
else if( (s[0] & 0xF8) == 0xF0 ) {
1765 codepoint = ((s[0] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F);
1778struct tr_pattern_utf8 {
1780 uint8_t flag_reverse;
1782 struct tr_pattern_utf8 *next;
1783 int32_t codepoints[];
1786static void tr_free_pattern_utf8(
struct tr_pattern_utf8 *pat)
1789 struct tr_pattern_utf8 *p = pat->next;
1795static struct tr_pattern_utf8 *tr_parse_pattern_utf8(
mrbc_vm *vm,
const mrbc_value *v_pattern,
int flag_reverse_enable)
1799 int flag_reverse = 0;
1800 struct tr_pattern_utf8 *ret = NULL;
1801 struct tr_pattern_utf8 *last = NULL;
1804 if( flag_reverse_enable && pattern < pattern_end && *pattern ==
'^' && (pattern + 1) < pattern_end ) {
1809 while( pattern < pattern_end ) {
1810 const char *start = pattern;
1811 int32_t first_cp = tr_utf8_decode(&pattern);
1814 if( pattern < pattern_end && *pattern ==
'-' && (pattern + 1) < pattern_end ) {
1816 int32_t second_cp = tr_utf8_decode(&pattern);
1819 struct tr_pattern_utf8 *pat1 = mrbc_alloc(vm,
sizeof(
struct tr_pattern_utf8) + 2 *
sizeof(int32_t));
1822 pat1->flag_reverse = flag_reverse;
1823 pat1->n = second_cp - first_cp + 1;
1825 pat1->codepoints[0] = first_cp;
1826 pat1->codepoints[1] = second_cp;
1838 const char *scan = pattern;
1841 while( scan < pattern_end ) {
1842 const char *next = scan;
1843 tr_utf8_decode(&next);
1845 if( next < pattern_end && *next ==
'-' && (next + 1) < pattern_end ) {
1848 tr_utf8_decode(&scan);
1853 struct tr_pattern_utf8 *pat1 = mrbc_alloc(vm,
sizeof(
struct tr_pattern_utf8) + count *
sizeof(int32_t));
1856 pat1->flag_reverse = flag_reverse;
1861 const char *p = start;
1862 for(
int i = 0; i < count; i++ ) {
1863 pat1->codepoints[i] = tr_utf8_decode(&p);
1880static int tr_find_codepoint(
const struct tr_pattern_utf8 *pat, int32_t cp)
1884 int flag_reverse = pat ? pat->flag_reverse : 0;
1886 while( pat != NULL ) {
1887 if( pat->type == 1 ) {
1888 for(
int i = 0; i < pat->n; i++ ) {
1889 if( pat->codepoints[i] == cp ) ret = n_sum + i;
1892 if( pat->codepoints[0] <= cp && cp <= pat->codepoints[1] ) {
1893 ret = n_sum + (cp - pat->codepoints[0]);
1900 if( flag_reverse ) {
1901 return (ret < 0) ? INT_MAX : -1;
1906static int32_t tr_get_codepoint(
const struct tr_pattern_utf8 *pat,
int n_th)
1909 while( pat != NULL ) {
1910 if( n_th < (n_sum + pat->n) ) {
1911 int i = n_th - n_sum;
1912 return (pat->type == 1) ? pat->codepoints[i] : pat->codepoints[0] + i;
1914 if( pat->next == NULL ) {
1916 return (pat->type == 1) ? pat->codepoints[pat->n - 1] : pat->codepoints[1];
1932 struct tr_pattern_utf8 *pat = tr_parse_pattern_utf8(vm, &v[1], 1);
1933 if( pat == NULL )
return 0;
1935 struct tr_pattern_utf8 *rep = tr_parse_pattern_utf8(vm, &v[2], 0);
1939 if( result.
string == NULL ) {
1940 tr_free_pattern_utf8(pat);
1941 tr_free_pattern_utf8(rep);
1945 int flag_changed = 0;
1950 const char *char_start = s;
1951 int32_t cp = tr_utf8_decode(&s);
1952 int char_len = s - char_start;
1954 int n = tr_find_codepoint(pat, cp);
1964 int32_t new_cp = tr_get_codepoint(rep, n);
1966 int new_len = mrbc_utf8_encode(new_cp, buf);
1972 tr_free_pattern_utf8(pat);
1973 tr_free_pattern_utf8(rep);
1982 uint8_t *new_data = mrbc_realloc(vm, orig->
data, res->
size + 1);
1983 if( new_data == NULL ) {
1987 orig->
data = new_data;
1993 return flag_changed;
1997#if !MRBC_USE_STRING_UTF8
2026 if( flag_reverse_enable && pattern_length >= 2 && pattern[i] ==
'^' ) {
2032 while( i < pattern_length ) {
2034 if( (i+2) < pattern_length && pattern[i+1] ==
'-' ) {
2035 pat1 = mrbc_alloc( vm,
sizeof(
struct tr_pattern) + 2 );
2038 pat1->
n = pattern[i+2] - pattern[i] + 1;
2040 pat1->
ch[0] = pattern[i];
2041 pat1->
ch[1] = pattern[i+2];
2046 int start_pos = i++;
2047 while( i < pattern_length ) {
2048 if( (i+2) < pattern_length && pattern[i+1] ==
'-' )
break;
2052 int len = i - start_pos;
2053 pat1 = mrbc_alloc( vm,
sizeof(
struct tr_pattern) + len );
2058 memcpy( pat1->
ch, &pattern[start_pos], len );
2066 while( p->
next != NULL ) { p = p->
next; }
2080 while( pat != NULL ) {
2081 if( pat->
type == 1 ) {
2082 for(
int i = 0; i < pat->
n; i++ ) {
2083 if( pat->
ch[i] ==
ch ) ret = n_sum + i;
2093 return (ret < 0) ? INT_MAX : -1;
2101 while( pat != NULL ) {
2102 if( n_th < (n_sum + pat->
n) ) {
2103 int i = (n_th - n_sum);
2104 return (pat->
type == 1) ? pat->
ch[i] :pat->
ch[0] + i;
2106 if( pat->
next == NULL ) {
2107 return (pat->
type == 1) ? pat->
ch[pat->
n - 1] : pat->
ch[1];
2125 if( pat == NULL )
return 0;
2129 int flag_changed = 0;
2133 for(
int i = 0; i < len; i++ ) {
2135 if(
n < 0 )
continue;
2139 memmove( s + i, s + i + 1, len - i );
2153 return flag_changed;
2161#if MRBC_USE_STRING_UTF8
2162 tr_main_utf8(vm, v, argc);
2174#if MRBC_USE_STRING_UTF8
2175 int flag_changed = tr_main_utf8(vm, v, argc);
2177 int flag_changed =
tr_main(vm, v, argc);
2180 if( !flag_changed ) {
2258 for(
int i = 0; i < len; i++ ) {
2308#if MRBC_USE_STRING_UTF8
2329 int char_len = mrbc_string_utf8_size((
const char *)&s[i]);
2330 if( char_len == 0 ) {
2335 if( i + char_len > len ) {
2341 for(
int j = 1; j < char_len; j++ ) {
2342 if( (s[i + j] & 0xC0) != 0x80 ) {
2362 for(
int i = 0; i < len; i++ ) {
2380 int char_count = mrbc_string_char_size((
const char *)s, len);
2386 int char_len = mrbc_string_utf8_size((
const char *)&s[i]);
2387 if( char_len == 0 ) char_len = 1;
2388 if( i + char_len > len ) char_len = len - i;
2409 if( ret.
string == NULL )
return;
2413 int char_count = mrbc_string_char_size((
const char *)s, len);
2415 if( offsets == NULL ) {
2424 int char_len = mrbc_string_utf8_size((
const char *)&s[i]);
2425 if( char_len == 0 ) char_len = 1;
2432 for( i = char_count - 1; i >= 0; i-- ) {
2433 int char_start = offsets[i];
2434 int char_len = offsets[i + 1] - char_start;
2435 memcpy(dst + dst_pos, s + char_start, char_len);
2436 dst_pos += char_len;
2454 int char_count = mrbc_string_char_size((
const char *)s, len);
2456 if( offsets == NULL )
return;
2462 int char_len = mrbc_string_utf8_size((
const char *)&s[i]);
2463 if( char_len == 0 ) char_len = 1;
2476 for( i = char_count - 1; i >= 0; i-- ) {
2477 int char_start = offsets[i];
2478 int char_len = offsets[i + 1] - char_start;
2479 memcpy(tmp + dst_pos, s + char_start, char_len);
2480 dst_pos += char_len;
2484 memcpy(v[0].string->data, tmp, len);
2555#include "_autogen_class_string.h"
void * mrbc_raw_alloc(unsigned int size)
void * mrbc_raw_realloc(void *ptr, unsigned int size)
void mrbc_raw_free(void *ptr)
#define mrbc_immediate_value(...)
static void mrbc_set_tt(mrbc_value *p, mrbc_vtype type)
struct RObject mrbc_value
Value object. Default version.
#define mrbc_integer_value(n)
int mrbc_array_push(mrbc_value *ary, mrbc_value *set_val)
int mrbc_array_set(mrbc_value *ary, int idx, mrbc_value *set_val)
mrbc_value mrbc_array_get(const mrbc_value *ary, int idx)
mrbc_value mrbc_array_new(mrbc_vm *vm, int size)
mrbc_value mrbc_array_remove(mrbc_value *ary, int idx)
static int mrbc_array_size(const mrbc_value *ary)
void mrbc_object_inspect(mrbc_vm *vm, mrbc_value v[], int argc)
static mrbc_value * mrbc_range_last_p(const mrbc_value *v)
static int mrbc_range_exclude_end(const mrbc_value *v)
static mrbc_value * mrbc_range_first_p(const mrbc_value *v)
int mrbc_string_index(const mrbc_value *src, const mrbc_value *pattern, int offset)
static int string_slice_parse(mrbc_vm *vm, mrbc_value v[], int argc, int target_len, int *pos, int *len)
void mrbc_string_delete(mrbc_value *str)
static void tr_free_pattern(struct tr_pattern *pat)
static int tr_get_character(const struct tr_pattern *pat, int n_th)
static int tr_main(mrbc_vm *vm, mrbc_value v[], int argc)
static struct tr_pattern * tr_parse_pattern(mrbc_vm *vm, const mrbc_value *v_pattern, int flag_reverse_enable)
static int tr_find_character(const struct tr_pattern *pat, int ch)
mrbc_value mrbc_string_new(mrbc_vm *vm, const void *src, int len)
mrbc_value mrbc_string_new_alloc(mrbc_vm *vm, void *buf, int len)
static int is_space(int ch)
void mrbc_string_clear(mrbc_value *str)
mrbc_value mrbc_string_dup(mrbc_vm *vm, mrbc_value *s1)
mrbc_value mrbc_string_add(mrbc_vm *vm, const mrbc_value *s1, const mrbc_value *s2)
int mrbc_string_chomp(mrbc_value *src)
int mrbc_string_append_cbuf(mrbc_value *s1, const void *s2, int len2)
int mrbc_string_upcase(mrbc_value *str)
int mrbc_string_downcase(mrbc_value *str)
int mrbc_string_append(mrbc_value *s1, const mrbc_value *s2)
int mrbc_string_strip(mrbc_value *src, int mode)
struct RString mrbc_string
String object.
static char * mrbc_string_cstr(const mrbc_value *v)
static int mrbc_string_append_cstr(mrbc_value *s1, const char *s2)
static mrbc_value mrbc_string_new_cstr(mrbc_vm *vm, const char *src)
static int mrbc_string_size(const mrbc_value *str)
void mrbc_char_to_s(char *buf, const void *src)
void mrbc_raise(struct VM *vm, struct RClass *exc_cls, const char *msg)
void mrbc_raisef(struct VM *vm, struct RClass *exc_cls, const char *fstr,...)
Include at once the necessary header files.
uint8_t * data
pointer to allocated buffer.
MRBC_STRING_SIZE_T size
string length.
mrbc_value mrbc_symbol_new(struct VM *vm, const char *str)
mrbc_int_t mrbc_atoi(const char *s, int base)
static void mrbc_decref(mrbc_value *v)
#define MRBC_INIT_OBJECT_HEADER_DI(t)
#define SET_BOOL_RETURN(n)
#define SET_INT_RETURN(n)
static void mrbc_incref(mrbc_value *v)
@ MRBC_TT_INTEGER
Integer.
#define SET_FLOAT_RETURN(n)
struct VM mrbc_vm
Virtual Machine.
Global configuration of mruby/c VM's.