32#define MRBC_PRINTF_MAX_WIDTH 82
106 const char *fmt = strchr(s,
':') ?
"\"%s\": " :
"%s: ";
129#if defined(MRBC_CONVERT_CRLF)
130 static const char CRLF[2] =
"\r\n";
132 mrbc_hal_write(1, CRLF, 2);
134 mrbc_hal_write(1, &c, 1);
138 mrbc_hal_write(1, &c, 1);
174#if defined(MRBC_CONVERT_CRLF)
175 static const char CRLF[2] =
"\r\n";
176 const char *p1 = str;
177 const char *p2 = str;
179 for(
int i = 0; i < size; i++ ) {
180 if( *p1++ ==
'\n' ) {
181 mrbc_hal_write(1, p2, p1 - p2 - 1);
182 mrbc_hal_write(1, CRLF, 2);
187 mrbc_hal_write(1, p2, p1 - p2);
191 mrbc_hal_write(1, str, size);
277 if( ret == 0 )
break;
278 if( ret < 0 )
continue;
306 va_copy(ap_bak, ap1);
310 if( ret == 0 )
break;
311 if( ret < 0 )
goto INCREASE_BUFFER;
314 if( ret >= 0 )
goto NEXT_LOOP;
317 va_copy(ap1, ap_bak);
357 unsigned char ch = *((
unsigned char *)src);
359 if( ch == 0x7f )
goto hex;
361 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 ];
362 if( ch1 == 0 )
goto hex;
366 if( ch ==
'"' || ch ==
'\\' ) {
377 buf[2] =
"0123456789ABCDEF"[ch >> 4];
378 buf[3] =
"0123456789ABCDEF"[ch & 0x0f];
408 const char *fmt = strchr(s,
':') ?
"\":%s\"" :
":%s";
418#if MRBC_USE_STRING_UTF8
419 for(
int i = 0; i < size; ) {
420 unsigned char uch = (
unsigned char)s[i];
427 int raw_len = mrbc_string_utf8_size(s + i);
428 int valid = (raw_len >= 2 && i + raw_len <= size);
430 for(
int j = 1; j < raw_len; j++ ) {
431 if( ((
unsigned char)s[i + j] & 0xC0) != 0x80 ) { valid = 0;
break; }
439 buf[0] =
'\\'; buf[1] =
'x';
440 buf[2] =
"0123456789ABCDEF"[uch >> 4];
441 buf[3] =
"0123456789ABCDEF"[uch & 0x0f];
449 for(
int i = 0; i < size; i++ ) {
627 int p_ofs = pf->
p - pf->
buf;
630 pf->
p = pf->
buf + p_ofs;
648 while( pf->
p < pf->
buf_end && (ch = *pf->
fstr) !=
'\0' ) {
651 if( *pf->fstr ==
'%' ) {
659 return -(ch !=
'\0');
665 while( (ch = *pf->fstr) ) {
667 case
'+': pf->fmt.flag_plus = 1; break;
668 case
' ': pf->fmt.flag_space = 1; break;
669 case
'-': pf->fmt.flag_minus = 1; break;
670 case
'0': pf->fmt.flag_zero = 1; break;
671 default : goto PARSE_WIDTH;
677 while( (
void)(ch = *pf->fstr -
'0'), (0 <= ch && ch <= 9)) {
678 pf->fmt.width = pf->fmt.width * 10 + ch;
681 if( *pf->fstr ==
'.' ) {
683 while( (void)(ch = *pf->fstr -
'0'), (0 <= ch && ch <= 9)) {
684 pf->fmt.precision = pf->fmt.precision * 10 + ch;
688 if( *pf->fstr ) pf->fmt.type = *pf->fstr++;
706 if( pf->
p == pf->
buf_end )
return -1;
711 while( --width > 0 ) {
712 if( pf->
p == pf->
buf_end )
return -1;
717 if( pf->
p == pf->
buf_end )
return -1;
759 int n_pad = tw - len;
762 while( n_pad-- > 0 ) {
769 while( n_pad-- > 0 ) {
792 char *pf_p_ini_val = pf->
p;
810 char *p = buf +
sizeof(buf);
813 unsigned int ch = v % base;
814 *--p = ch + ((ch < 10)?
'0' :
'a' - 10);
818 int dig_width = buf +
sizeof(buf) - p;
823 int pad_width = pf->
fmt.
width - !!sign;
826 for( ; pad_width > 0; pad_width-- ) {
828 if( pf->
p >= pf->
buf_end )
return -1;
835 if( pf->
p >= pf->
buf_end )
return -1;
840 for( ; pre_width > 0; pre_width-- ) {
842 if( pf->
p >= pf->
buf_end )
return -1;
846 for( ; dig_width > 0; dig_width-- ) {
848 if( pf->
p >= pf->
buf_end )
return -1;
853 int pad_width = pf->
fmt.
width - (pf->
p - pf_p_ini_val);
854 for( ; pad_width > 0; pad_width-- ) {
856 if( pf->
p >= pf->
buf_end )
return -1;
887 int offset_a = (pf->
fmt.
type ==
'X') ?
'A' - 10 :
'a' - 10;
888 int mask = (1 << bit) - 1;
889 int mchar = mask + ((mask < 10)?
'0' : offset_a);
893 assert(
sizeof(buf) > (
sizeof(
mrbc_int_t) * 8 + 4) );
894 char *p = buf +
sizeof(buf) - 1;
900 *--p = n + ((n < 10)?
'0' : offset_a);
902 }
while( v != 0 && v != -1 );
906 if( value < 0 && !pf->fmt.flag_zero ) {
907 if( n != mask ) *--p = mchar;
916 pad = (value < 0) ? mchar :
'0';
938 const char *p1 = pf->
fstr;
939 char *p2 = fstr +
sizeof(fstr) - 1;
942 while( (*--p2 = *--p1) !=
'%' )
945 snprintf( pf->
p, (pf->
buf_end - pf->
p + 1), p2, value );
947 while( *pf->
p !=
'\0' )
972 int n =
sizeof(ptr) * 2;
976 if( (pf->
buf_end - pf->
p) < n+1 )
return -1;
984 *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.