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 );
127#if defined(MRBC_ALLOC_VMID)
133 mrbc_set_vm_id( str->
string, 0 );
192 memcpy(str + len1, s2->
string->
data, len2 + 1);
219 memcpy(str + len1, s2, len2);
220 str[len1 + len2] = 0;
222 memset(str + len1, 0, len2 + 1);
246 while( try_cnt >= 0 ) {
273 if( *p1 ==
'\0' )
break;
286 int new_size = p2 - p1 + 1;
290 if( p1 != buf ) memmove( buf, p1, new_size );
291 buf[new_size] =
'\0';
319 int new_size = p2 - p1 + 1;
323 buf[new_size] =
'\0';
330#if !MRBC_USE_STRING_UTF8 || !MRBC_USE_UNICODE_CASE
344 if (
'a' <= data[len] && data[len] <=
'z') {
345 data[len] = data[len] - (
'a' -
'A');
366 if (
'A' <= data[len] && data[len] <=
'Z') {
367 data[len] = data[len] + (
'a' -
'A');
376#if MRBC_USE_STRING_UTF8
383int mrbc_string_utf8_size(
const char *str)
385 unsigned char c = (
unsigned char)*str;
387 if( (c & 0x80) == 0x00 )
return 1;
388 if( (c & 0xE0) == 0xC0 )
return 2;
389 if( (c & 0xF0) == 0xE0 )
return 3;
390 if( (c & 0xF8) == 0xF0 )
return 4;
407static int utf8_validated_char_len(
const char *str,
const char *end)
409 int char_len = mrbc_string_utf8_size(str);
411 if( char_len == 0 )
return 1;
412 if( str + char_len > end )
return 1;
414 for(
int j = 1; j < char_len; j++ ) {
415 if( ((
unsigned char)str[j] & 0xC0) != 0x80 )
return 1;
432int mrbc_string_char_size(
const char *str,
int len)
435 const char *end = str + len;
438 int char_len = utf8_validated_char_len(str, end);
454int mrbc_string_chars2bytes(
mrbc_value *src,
int off,
int idx)
460 for(
int i = 0; i < idx && str < end; i++ ) {
461 int char_len = utf8_validated_char_len(str, end);
476int mrbc_string_bytes2chars(
const mrbc_value *src,
int byte_index)
479 const char *target = str + byte_index;
482 while( str < target ) {
483 int char_len = mrbc_string_utf8_size(str);
484 if( char_len == 0 ) char_len = 1;
488 return (str == target) ? count : -1;
492#if MRBC_USE_UNICODE_CASE
500static int32_t unicode_decode_utf8(
const uint8_t *str,
int *len_out)
506 if( (c & 0x80) == 0 ) {
509 }
else if( (c & 0xE0) == 0xC0 ) {
510 cp = (c & 0x1F) << 6 | (str[1] & 0x3F);
512 }
else if( (c & 0xF0) == 0xE0 ) {
513 cp = (c & 0x0F) << 12 | (str[1] & 0x3F) << 6 | (str[2] & 0x3F);
515 }
else if( (c & 0xF8) == 0xF0 ) {
516 cp = (c & 0x07) << 18 | (str[1] & 0x3F) << 12 | (str[2] & 0x3F) << 6 | (str[3] & 0x3F);
534static int unicode_encode_utf8(int32_t cp, uint8_t *buf)
539 }
else if( cp < 0x800 ) {
540 buf[0] = 0xC0 | (cp >> 6);
541 buf[1] = 0x80 | (cp & 0x3F);
543 }
else if( cp < 0x10000 ) {
544 buf[0] = 0xE0 | (cp >> 12);
545 buf[1] = 0x80 | ((cp >> 6) & 0x3F);
546 buf[2] = 0x80 | (cp & 0x3F);
549 buf[0] = 0xF0 | (cp >> 18);
550 buf[1] = 0x80 | ((cp >> 12) & 0x3F);
551 buf[2] = 0x80 | ((cp >> 6) & 0x3F);
552 buf[3] = 0x80 | (cp & 0x3F);
566static int32_t unicode_case_lookup_range(int32_t cp,
const case_range_t *ranges,
int count)
568 for(
int i = 0; i < count; i++ ) {
569 if( ranges[i].start <= cp && cp <= ranges[i].end ) {
571 int32_t converted = cp ^ ranges[i].xor_val;
590static int32_t unicode_case_lookup_exception(int32_t cp,
const case_exception_t *exceptions,
int count)
592 int low = 0, high = count - 1;
594 while( low <= high ) {
595 int mid = (low + high) / 2;
596 if( exceptions[mid].from == cp ) {
597 return exceptions[mid].to;
598 }
else if( exceptions[mid].from < cp ) {
614static int32_t unicode_upcase_codepoint(int32_t cp)
616 if( cp < 0 || cp > 0xFFFF )
return cp;
619 int32_t result = unicode_case_lookup_range(cp, upcase_ranges, UPCASE_RANGES_COUNT);
620 if( result != cp )
return result;
623 return unicode_case_lookup_exception(cp, upcase_exceptions, UPCASE_EXCEPTIONS_COUNT);
633static int32_t unicode_downcase_codepoint(int32_t cp)
635 if( cp < 0 || cp > 0xFFFF )
return cp;
638 int32_t result = unicode_case_lookup_range(cp, downcase_ranges, DOWNCASE_RANGES_COUNT);
639 if( result != cp )
return result;
642 return unicode_case_lookup_exception(cp, downcase_exceptions, DOWNCASE_EXCEPTIONS_COUNT);
660 int needs_realloc = 0;
661 for(
int i = 0; i < len; ) {
663 int32_t cp = unicode_decode_utf8(data + i, &char_len);
664 int32_t upper_cp = unicode_upcase_codepoint(cp);
667 int new_char_len = unicode_encode_utf8(upper_cp, buf);
668 new_len += new_char_len;
669 if( new_char_len != char_len ) needs_realloc = 1;
673 if( needs_realloc ) {
676 if( !new_data )
return 0;
679 for(
int i = 0; i < len; ) {
681 int32_t cp = unicode_decode_utf8(data + i, &char_len);
682 int32_t upper_cp = unicode_upcase_codepoint(cp);
684 int new_char_len = unicode_encode_utf8(upper_cp, new_data + j);
685 if( upper_cp != cp ) count++;
689 new_data[new_len] =
'\0';
696 for(
int i = 0; i < len; ) {
698 int32_t cp = unicode_decode_utf8(data + i, &char_len);
699 int32_t upper_cp = unicode_upcase_codepoint(cp);
701 if( upper_cp != cp ) {
702 unicode_encode_utf8(upper_cp, data + i);
727 int needs_realloc = 0;
728 for(
int i = 0; i < len; ) {
730 int32_t cp = unicode_decode_utf8(data + i, &char_len);
731 int32_t lower_cp = unicode_downcase_codepoint(cp);
734 int new_char_len = unicode_encode_utf8(lower_cp, buf);
735 new_len += new_char_len;
736 if( new_char_len != char_len ) needs_realloc = 1;
740 if( needs_realloc ) {
743 if( !new_data )
return 0;
746 for(
int i = 0; i < len; ) {
748 int32_t cp = unicode_decode_utf8(data + i, &char_len);
749 int32_t lower_cp = unicode_downcase_codepoint(cp);
751 int new_char_len = unicode_encode_utf8(lower_cp, new_data + j);
752 if( lower_cp != cp ) count++;
756 new_data[new_len] =
'\0';
763 for(
int i = 0; i < len; ) {
765 int32_t cp = unicode_decode_utf8(data + i, &char_len);
766 int32_t lower_cp = unicode_downcase_codepoint(cp);
768 if( lower_cp != cp ) {
769 unicode_encode_utf8(lower_cp, data + i);
845 for(
int i = 0; i < v[1].
i; i++ ) {
861#if MRBC_USE_STRING_UTF8
888 if( base < 2 || base > 36 ) {
906#if MRBC_USE_FLOAT == 1
934#if MRBC_USE_STRING_UTF8
941 if( codepoint < 0 || codepoint > 0x10FFFF ) {
945 if( codepoint >= 0xD800 && codepoint <= 0xDFFF ) {
950 len = mrbc_utf8_encode(codepoint, buf);
965 int target_len,
int *pos,
int *len)
969 if (*pos < 0) *pos += target_len;
970 if (*pos >= target_len)
return 1;
976 if( *pos < 0 ) *pos += target_len;
984 if( *pos < 0 ) *pos += target_len;
999 if( pos2 < 0 ) pos2 += target_len;
1017 if( *pos < 0 || *pos > target_len )
return 1;
1018 if( *len > target_len - *pos ) *len = target_len - *pos;
1036#if MRBC_USE_STRING_UTF8
1048#if MRBC_USE_STRING_UTF8
1049 int byte_pos = mrbc_string_chars2bytes(&v[0], 0, pos);
1050 int byte_len = mrbc_string_chars2bytes(&v[0], byte_pos, len);
1084#if MRBC_USE_STRING_UTF8
1116 if( pos < 0 ) pos += target_len;
1117 if( pos < 0 || pos > target_len ) {
1134 if( pos2 < 0 ) pos2 += target_len;
1145 if( len < 0 ) len = 0;
1155 int len1 = target_len;
1157 if( pos < 0 ) pos = len1 + pos;
1158 if( len > len1 - pos ) len = len1 - pos;
1159 if( pos < 0 || pos > len1 || len < 0) {
1164#if MRBC_USE_STRING_UTF8
1166 int byte_pos = mrbc_string_chars2bytes(&v[0], 0, pos);
1167 int byte_len = mrbc_string_chars2bytes(&v[0], byte_pos, len);
1170 int byte_len3 = byte_len1 + len2 - byte_len;
1172 if( byte_len1 < byte_len3 ) {
1173 str = mrbc_realloc(vm, str, byte_len3+1);
1176 memmove( str + byte_pos + len2, str + byte_pos + byte_len, byte_len1 - byte_pos - byte_len + 1 );
1179 if( byte_len1 > byte_len3 ) {
1180 str = mrbc_realloc(vm, str, byte_len3+1);
1186 int len3 = len1 + len2 - len;
1189 str = mrbc_realloc(vm, str, len3+1);
1192 memmove( str + pos + len2, str + pos + len, len1 - pos - len + 1 );
1196 str = mrbc_realloc(vm, str, len3+1);
1278 if( idx >= len ) idx = -1;
1307 if( idx < 0 || idx >= len ) {
1331#if MRBC_USE_STRING_UTF8
1333 if( offset < 0 ) offset += char_len;
1334 if( offset < 0 )
goto NIL_RETURN;
1336 offset = mrbc_string_chars2bytes(&v[0], 0, offset);
1339 if( offset < 0 )
goto NIL_RETURN;
1348 if( index < 0 )
goto NIL_RETURN;
1350#if MRBC_USE_STRING_UTF8
1352 index = mrbc_string_bytes2chars(&v[0], index);
1353 if( index < 0 )
goto NIL_RETURN;
1378#if MRBC_USE_STRING_UTF8
1379 for(
int i = 0; i < size; ) {
1380 unsigned char uch = (
unsigned char)s[i];
1388 int char_len = utf8_validated_char_len(s + i, s + size);
1389 int raw_len = mrbc_string_utf8_size(s + i);
1390 if( raw_len >= 2 && char_len == raw_len ) {
1399 buf[2] =
"0123456789ABCDEF"[uch >> 4];
1400 buf[3] =
"0123456789ABCDEF"[uch & 0x0f];
1408 for(
int i = 0; i < size; i++ ) {
1431#if MRBC_USE_STRING_UTF8
1434 int char_len = utf8_validated_char_len((
const char *)s, end);
1437 if( char_len == 1 ) {
1439 }
else if( char_len == 2 ) {
1440 codepoint = ((s[0] & 0x1F) << 6) | (s[1] & 0x3F);
1441 }
else if( char_len == 3 ) {
1442 codepoint = ((s[0] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F);
1443 }
else if( char_len == 4 ) {
1444 codepoint = ((s[0] & 0x07) << 18) | ((s[1] & 0x3F) << 12) |
1445 ((s[2] & 0x3F) << 6) | (s[3] & 0x3F);
1464#if MRBC_USE_STRING_UTF8
1487 if( pos < 0 ) pos += target_len;
1488 if( pos < 0 )
goto RETURN_NIL;
1489 if( len > (target_len - pos) ) len = target_len - pos;
1490 if( len < 0 )
goto RETURN_NIL;
1491 if( argc == 1 && len <= 0 )
goto RETURN_NIL;
1493#if MRBC_USE_STRING_UTF8
1495 int byte_pos = mrbc_string_chars2bytes(&v[0], 0, pos);
1496 int byte_len = mrbc_string_chars2bytes(&v[0], byte_pos, len);
1501 if( byte_len > 0 ) {
1503 byte_size - byte_pos - byte_len + 1 );
1570 if( sep_len == 0 ) sep_len++;
1600#if MRBC_USE_STRING_UTF8
1603 if( char_len == 0 ) char_len = 1;
1625 if( pos < 0 )
break;
1626 offset = pos + sep_len;
1633 if( idx < 0 )
break;
1746#if MRBC_USE_STRING_UTF8
1754static int32_t tr_utf8_decode(
const char **str)
1756 const unsigned char *s = (
const unsigned char *)*str;
1763 }
else if( (s[0] & 0xE0) == 0xC0 ) {
1764 codepoint = ((s[0] & 0x1F) << 6) | (s[1] & 0x3F);
1766 }
else if( (s[0] & 0xF0) == 0xE0 ) {
1767 codepoint = ((s[0] & 0x0F) << 12) | ((s[1] & 0x3F) << 6) | (s[2] & 0x3F);
1769 }
else if( (s[0] & 0xF8) == 0xF0 ) {
1770 codepoint = ((s[0] & 0x07) << 18) | ((s[1] & 0x3F) << 12) | ((s[2] & 0x3F) << 6) | (s[3] & 0x3F);
1783struct tr_pattern_utf8 {
1785 uint8_t flag_reverse;
1787 struct tr_pattern_utf8 *next;
1788 int32_t codepoints[];
1791static void tr_free_pattern_utf8(
struct tr_pattern_utf8 *pat)
1794 struct tr_pattern_utf8 *p = pat->next;
1800static struct tr_pattern_utf8 *tr_parse_pattern_utf8(
mrbc_vm *vm,
const mrbc_value *v_pattern,
int flag_reverse_enable)
1804 int flag_reverse = 0;
1805 struct tr_pattern_utf8 *ret = NULL;
1806 struct tr_pattern_utf8 *last = NULL;
1809 if( flag_reverse_enable && pattern < pattern_end && *pattern ==
'^' && (pattern + 1) < pattern_end ) {
1814 while( pattern < pattern_end ) {
1815 const char *start = pattern;
1816 int32_t first_cp = tr_utf8_decode(&pattern);
1819 if( pattern < pattern_end && *pattern ==
'-' && (pattern + 1) < pattern_end ) {
1821 int32_t second_cp = tr_utf8_decode(&pattern);
1824 struct tr_pattern_utf8 *pat1 = mrbc_alloc(vm,
sizeof(
struct tr_pattern_utf8) + 2 *
sizeof(int32_t));
1827 pat1->flag_reverse = flag_reverse;
1828 pat1->n = second_cp - first_cp + 1;
1830 pat1->codepoints[0] = first_cp;
1831 pat1->codepoints[1] = second_cp;
1843 const char *scan = pattern;
1846 while( scan < pattern_end ) {
1847 const char *next = scan;
1848 tr_utf8_decode(&next);
1850 if( next < pattern_end && *next ==
'-' && (next + 1) < pattern_end ) {
1853 tr_utf8_decode(&scan);
1858 struct tr_pattern_utf8 *pat1 = mrbc_alloc(vm,
sizeof(
struct tr_pattern_utf8) + count *
sizeof(int32_t));
1861 pat1->flag_reverse = flag_reverse;
1866 const char *p = start;
1867 for(
int i = 0; i < count; i++ ) {
1868 pat1->codepoints[i] = tr_utf8_decode(&p);
1885static int tr_find_codepoint(
const struct tr_pattern_utf8 *pat, int32_t cp)
1889 int flag_reverse = pat ? pat->flag_reverse : 0;
1891 while( pat != NULL ) {
1892 if( pat->type == 1 ) {
1893 for(
int i = 0; i < pat->n; i++ ) {
1894 if( pat->codepoints[i] == cp ) ret = n_sum + i;
1897 if( pat->codepoints[0] <= cp && cp <= pat->codepoints[1] ) {
1898 ret = n_sum + (cp - pat->codepoints[0]);
1905 if( flag_reverse ) {
1906 return (ret < 0) ? INT_MAX : -1;
1911static int32_t tr_get_codepoint(
const struct tr_pattern_utf8 *pat,
int n_th)
1914 while( pat != NULL ) {
1915 if( n_th < (n_sum + pat->n) ) {
1916 int i = n_th - n_sum;
1917 return (pat->type == 1) ? pat->codepoints[i] : pat->codepoints[0] + i;
1919 if( pat->next == NULL ) {
1921 return (pat->type == 1) ? pat->codepoints[pat->n - 1] : pat->codepoints[1];
1937 struct tr_pattern_utf8 *pat = tr_parse_pattern_utf8(vm, &v[1], 1);
1938 if( pat == NULL )
return 0;
1940 struct tr_pattern_utf8 *rep = tr_parse_pattern_utf8(vm, &v[2], 0);
1944 if( result.
string == NULL ) {
1945 tr_free_pattern_utf8(pat);
1946 tr_free_pattern_utf8(rep);
1950 int flag_changed = 0;
1955 const char *char_start = s;
1956 int32_t cp = tr_utf8_decode(&s);
1957 int char_len = s - char_start;
1959 int n = tr_find_codepoint(pat, cp);
1969 int32_t new_cp = tr_get_codepoint(rep, n);
1971 int new_len = mrbc_utf8_encode(new_cp, buf);
1977 tr_free_pattern_utf8(pat);
1978 tr_free_pattern_utf8(rep);
1987 orig->
data = mrbc_realloc(vm, orig->
data, res->
size + 1);
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.