32#define MRBC_PRINTF_MAX_WIDTH 82
65#if defined(MRBC_INT16)
110 const char *fmt = strchr(s,
':') ?
"\"%s\": " :
"%s: ";
133#if defined(MRBC_CONVERT_CRLF)
134 static const char CRLF[2] =
"\r\n";
136 mrbc_hal_write(1, CRLF, 2);
138 mrbc_hal_write(1, &c, 1);
142 mrbc_hal_write(1, &c, 1);
178#if defined(MRBC_CONVERT_CRLF)
179 static const char CRLF[2] =
"\r\n";
180 const char *p1 = str;
181 const char *p2 = str;
183 for(
int i = 0; i < size; i++ ) {
184 if( *p1++ ==
'\n' ) {
185 mrbc_hal_write(1, p2, p1 - p2 - 1);
186 mrbc_hal_write(1, CRLF, 2);
191 mrbc_hal_write(1, p2, p1 - p2);
195 mrbc_hal_write(1, str, size);
281 if( ret == 0 )
break;
282 if( ret < 0 )
continue;
310 va_copy(ap_bak, ap1);
314 if( ret == 0 )
break;
315 if( ret < 0 )
goto INCREASE_BUFFER;
318 if( ret >= 0 )
goto NEXT_LOOP;
321 va_copy(ap1, ap_bak);
361 unsigned char ch = *((
unsigned char *)src);
363 if( ch == 0x7f )
goto hex;
365 char ch1 =
"\0\0\0\0\0\0\0abtnvfr\0\0\0\0\0\0\0\0\0\0\0\0\0e\0\0\0"[ ch ];
366 if( ch1 == 0 )
goto hex;
370 if( ch ==
'"' || ch ==
'\\' ) {
381 buf[2] =
"0123456789ABCDEF"[ch >> 4];
382 buf[3] =
"0123456789ABCDEF"[ch & 0x0f];
412 const char *fmt = strchr(s,
':') ?
"\":%s\"" :
":%s";
422#if MRBC_USE_STRING_UTF8
423 for(
int i = 0; i < size; ) {
424 unsigned char uch = (
unsigned char)s[i];
431 int raw_len = mrbc_string_utf8_size(s + i);
432 int valid = (raw_len >= 2 && i + raw_len <= size);
434 for(
int j = 1; j < raw_len; j++ ) {
435 if( ((
unsigned char)s[i + j] & 0xC0) != 0x80 ) { valid = 0;
break; }
443 buf[0] =
'\\'; buf[1] =
'x';
444 buf[2] =
"0123456789ABCDEF"[uch >> 4];
445 buf[3] =
"0123456789ABCDEF"[uch & 0x0f];
453 for(
int i = 0; i < size; i++ ) {
631 int p_ofs = pf->
p - pf->
buf;
634 pf->
p = pf->
buf + p_ofs;
652 while( pf->
p < pf->
buf_end && (ch = *pf->
fstr) !=
'\0' ) {
655 if( *pf->fstr ==
'%' ) {
663 return -(ch !=
'\0');
669 while( (ch = *pf->fstr) ) {
671 case
'+': pf->fmt.flag_plus = 1; break;
672 case
' ': pf->fmt.flag_space = 1; break;
673 case
'-': pf->fmt.flag_minus = 1; break;
674 case
'0': pf->fmt.flag_zero = 1; break;
675 default : goto PARSE_WIDTH;
681 while( (
void)(ch = *pf->fstr -
'0'), (0 <= ch && ch <= 9)) {
682 pf->fmt.width = pf->fmt.width * 10 + ch;
685 if( *pf->fstr ==
'.' ) {
687 while( (void)(ch = *pf->fstr -
'0'), (0 <= ch && ch <= 9)) {
688 pf->fmt.precision = pf->fmt.precision * 10 + ch;
692 if( *pf->fstr ) pf->fmt.type = *pf->fstr++;
710 if( pf->
p == pf->
buf_end )
return -1;
715 while( --width > 0 ) {
716 if( pf->
p == pf->
buf_end )
return -1;
721 if( pf->
p == pf->
buf_end )
return -1;
763 int n_pad = tw - len;
766 while( n_pad-- > 0 ) {
773 while( n_pad-- > 0 ) {
796 char *pf_p_ini_val = pf->
p;
814 char *p = buf +
sizeof(buf);
817 unsigned int ch = v % base;
818 *--p = ch + ((ch < 10)?
'0' :
'a' - 10);
822 int dig_width = buf +
sizeof(buf) - p;
827 int pad_width = pf->
fmt.
width - !!sign;
830 for( ; pad_width > 0; pad_width-- ) {
832 if( pf->
p >= pf->
buf_end )
return -1;
839 if( pf->
p >= pf->
buf_end )
return -1;
844 for( ; pre_width > 0; pre_width-- ) {
846 if( pf->
p >= pf->
buf_end )
return -1;
850 for( ; dig_width > 0; dig_width-- ) {
852 if( pf->
p >= pf->
buf_end )
return -1;
857 int pad_width = pf->
fmt.
width - (pf->
p - pf_p_ini_val);
858 for( ; pad_width > 0; pad_width-- ) {
860 if( pf->
p >= pf->
buf_end )
return -1;
891 int offset_a = (pf->
fmt.
type ==
'X') ?
'A' - 10 :
'a' - 10;
892 int mask = (1 << bit) - 1;
893 int mchar = mask + ((mask < 10)?
'0' : offset_a);
897 assert(
sizeof(buf) > (
sizeof(
mrbc_int_t) * 8 + 4) );
898 char *p = buf +
sizeof(buf) - 1;
904 *--p = n + ((n < 10)?
'0' : offset_a);
906 }
while( v != 0 && v != -1 );
910 if( value < 0 && !pf->fmt.flag_zero ) {
911 if( n != mask ) *--p = mchar;
920 pad = (value < 0) ? mchar :
'0';
942 const char *p1 = pf->
fstr;
943 char *p2 = fstr +
sizeof(fstr) - 1;
946 while( (*--p2 = *--p1) !=
'%' )
949 snprintf( pf->
p, (pf->
buf_end - pf->
p + 1), p2, value );
951 while( *pf->
p !=
'\0' )
976 int n =
sizeof(ptr) * 2;
980 if( (pf->
buf_end - pf->
p) < n+1 )
return -1;
988 *p-- = (v & 0xf) < 10 ? (v & 0xf) +
'0' : (v & 0xf) - 10 +
'a';
void * mrbc_raw_realloc(void *ptr, unsigned int size)
struct RObject mrbc_value
Value object. Default version.
mrbc_value mrbc_array_get(const mrbc_value *ary, int idx)
static int mrbc_array_size(const mrbc_value *ary)
static mrbc_value * mrbc_hash_i_next(mrbc_hash_iterator *ite)
static int mrbc_hash_i_has_next(mrbc_hash_iterator *ite)
struct RHashIterator mrbc_hash_iterator
Define Hash iterator.
static mrbc_hash_iterator mrbc_hash_iterator_new(const mrbc_value *v)
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)
static char * mrbc_string_cstr(const mrbc_value *v)
static int mrbc_string_size(const mrbc_value *str)
static mrbc_class * find_class_by_object(const mrbc_value *obj)
void mrbc_p(const mrbc_value *v)
int mrbc_printf_float(mrbc_printf_t *pf, double value)
int mrbc_print_sub(const mrbc_value *v)
void mrbc_printf(const char *fstr,...)
int mrbc_printf_int(mrbc_printf_t *pf, mrbc_int_t value, unsigned int base)
int mrbc_printf_char(mrbc_printf_t *pf, int ch)
void mrbc_vprintf(const char *fstr, va_list ap)
void mrbc_nprint(const char *str, int size)
int mrbc_printf_bstr(mrbc_printf_t *pf, const char *str, int len, int pad)
int mrbc_puts_sub(const mrbc_value *v)
void mrbc_asprintf(char **buf, int bufsiz, const char *fstr,...)
int mrbc_p_sub(const mrbc_value *v)
int mrbc_printf_pointer(mrbc_printf_t *pf, void *ptr)
static int mrbc_p_sub_hashkey(const mrbc_value *v)
void mrbc_vasprintf(char **buf, int bufsiz, const char *fstr, va_list ap)
void mrbc_snprintf(char *buf, int bufsiz, const char *fstr,...)
void mrbc_printf_replace_buffer(mrbc_printf_t *pf, char *buf, int size)
void mrbc_putchar(char c)
void mrbc_char_to_s(char *buf, const void *src)
#define MRBC_PRINTF_MAX_WIDTH
int mrbc_printf_bit(mrbc_printf_t *pf, mrbc_int_t value, int bit)
void mrbc_print_symbol(mrbc_sym sym_id)
int mrbc_printf_main(mrbc_printf_t *pf)
static int mrbc_printf_sub_output_arg(mrbc_printf_t *pf, va_list *ap)
static void mrbc_printf_clear(mrbc_printf_t *pf)
static void mrbc_print(const char *str)
static void mrbc_printf_end(mrbc_printf_t *pf)
static int mrbc_printf_len(mrbc_printf_t *pf)
struct RPrintf mrbc_printf_t
printf tiny (mruby/c) version data container.
static int mrbc_printf_str(mrbc_printf_t *pf, const char *str, int pad)
static void mrbc_printf_init(mrbc_printf_t *pf, char *buf, int size, const char *fstr)
static mrbc_kv * mrbc_kv_i_next(mrbc_kv_iterator *ite)
static int mrbc_kv_i_has_next(const mrbc_kv_iterator *ite)
struct RKeyValue mrbc_kv
Key-Value data.
static int mrbc_kv_i_is_first(const mrbc_kv_iterator *ite)
struct RKeyValueIterator mrbc_kv_iterator
Key-Value iterator.
static mrbc_kv_iterator mrbc_kv_iterator_new(const mrbc_kv_handle *h)
Include at once the necessary header files.
mrbc_sym sym_id
class name's symbol ID
struct RClass * cls
exception class.
const uint8_t * message
to heap or ROM.
struct RKeyValueHandle ivar
instance variable.
mrbc_sym sym_id
symbol ID as key.
mrbc_value value
stored value.
struct RException * exception
struct RInstance * instance
char * p
output buffer write point.
const char * buf_end
output buffer end point.
const char * fstr
format string. (e.g. "%d %03x")
void mrbc_separate_nested_symid(mrbc_sym sym_id, mrbc_sym *id1, mrbc_sym *id2)
const char * mrbc_symid_to_str(mrbc_sym sym_id)
static const char * mrbc_symbol_cstr(const mrbc_value *v)
static int mrbc_is_nested_symid(mrbc_sym sym_id)
void mrbc_format_float(char *buf, int bufsiz, mrbc_float_t flo)
#define MRBC_PTR_TO_UINT32(p)
#define MRBC_TT_INC_DEC_THRESHOLD
int16_t mrbc_sym
mruby/c symbol ID
@ MRBC_TT_FALSE
FalseClass.
@ MRBC_TT_INTEGER
Integer.
@ MRBC_TT_EXCEPTION
Exception.
@ MRBC_TT_OBJECT
General instance.
Global configuration of mruby/c VM's.