31#define MRBC_PRINTF_MAX_WIDTH 82
108#if defined(MRBC_CONVERT_CRLF)
109 static const char CRLF[2] =
"\r\n";
111 hal_write(1, CRLF, 2);
153#if defined(MRBC_CONVERT_CRLF)
154 static const char CRLF[2] =
"\r\n";
155 const char *p1 = str;
156 const char *p2 = str;
158 for(
int i = 0; i < size; i++ ) {
159 if( *p1++ ==
'\n' ) {
160 hal_write(1, p2, p1 - p2 - 1);
161 hal_write(1, CRLF, 2);
166 hal_write(1, p2, p1 - p2);
170 hal_write(1, str, size);
256 if( ret == 0 )
break;
257 if( ret < 0 )
continue;
285 va_copy(ap_bak, ap1);
289 if( ret == 0 )
break;
290 if( ret < 0 )
goto INCREASE_BUFFER;
293 if( ret >= 0 )
goto NEXT_LOOP;
296 va_copy(ap1, ap_bak);
347 const char *fmt = strchr(s,
':') ?
"\":%s\"" :
":%s";
357 if( s[i] <
' ' || 0x7f <= s[i] ) {
526 int p_ofs = pf->
p - pf->
buf;
529 pf->
p = pf->
buf + p_ofs;
547 while( pf->
p < pf->
buf_end && (ch = *pf->
fstr) !=
'\0' ) {
550 if( *pf->fstr ==
'%' ) {
558 return -(ch !=
'\0');
564 while( (ch = *pf->fstr) ) {
566 case
'+': pf->fmt.flag_plus = 1; break;
567 case
' ': pf->fmt.flag_space = 1; break;
568 case
'-': pf->fmt.flag_minus = 1; break;
569 case
'0': pf->fmt.flag_zero = 1; break;
570 default : goto PARSE_WIDTH;
576 while( (
void)(ch = *pf->fstr -
'0'), (0 <= ch && ch <= 9)) {
577 pf->fmt.width = pf->fmt.width * 10 + ch;
580 if( *pf->fstr ==
'.' ) {
582 while( (void)(ch = *pf->fstr -
'0'), (0 <= ch && ch <= 9)) {
583 pf->fmt.precision = pf->fmt.precision * 10 + ch;
587 if( *pf->fstr ) pf->fmt.type = *pf->fstr++;
605 if( pf->
p == pf->
buf_end )
return -1;
610 while( --width > 0 ) {
611 if( pf->
p == pf->
buf_end )
return -1;
616 if( pf->
p == pf->
buf_end )
return -1;
658 int n_pad = tw - len;
661 while( n_pad-- > 0 ) {
668 while( n_pad-- > 0 ) {
691 char *pf_p_ini_val = pf->
p;
709 char *p = buf +
sizeof(buf);
712 unsigned int ch = v % base;
713 *--p = ch + ((ch < 10)?
'0' :
'a' - 10);
717 int dig_width = buf +
sizeof(buf) - p;
722 int pad_width = pf->
fmt.
width - !!sign;
725 for( ; pad_width > 0; pad_width-- ) {
727 if( pf->
p >= pf->
buf_end )
return -1;
734 if( pf->
p >= pf->
buf_end )
return -1;
739 for( ; pre_width > 0; pre_width-- ) {
741 if( pf->
p >= pf->
buf_end )
return -1;
745 for( ; dig_width > 0; dig_width-- ) {
747 if( pf->
p >= pf->
buf_end )
return -1;
752 int pad_width = pf->
fmt.
width - (pf->
p - pf_p_ini_val);
753 for( ; pad_width > 0; pad_width-- ) {
755 if( pf->
p >= pf->
buf_end )
return -1;
786 int offset_a = (pf->
fmt.
type ==
'X') ?
'A' - 10 :
'a' - 10;
787 int mask = (1 << bit) - 1;
788 int mchar = mask + ((mask < 10)?
'0' : offset_a);
792 assert(
sizeof(buf) > (
sizeof(
mrbc_int_t) * 8 + 4) );
793 char *p = buf +
sizeof(buf) - 1;
799 *--p = n + ((n < 10)?
'0' : offset_a);
801 }
while( v != 0 && v != -1 );
805 if( value < 0 && !pf->fmt.flag_zero ) {
806 if( n != mask ) *--p = mchar;
815 pad = (value < 0) ? mchar :
'0';
837 const char *p1 = pf->
fstr;
838 char *p2 = fstr +
sizeof(fstr) - 1;
841 while( (*--p2 = *--p1) !=
'%' )
844 snprintf( pf->
p, (pf->
buf_end - pf->
p + 1), p2, value );
846 while( *pf->
p !=
'\0' )
871 int n =
sizeof(ptr) * 2;
875 if( (pf->
buf_end - pf->
p) < n+1 )
return -1;
883 *p-- = (v & 0xf) < 10 ? (v & 0xf) +
'0' : (v & 0xf) - 10 +
'a';
void * mrbc_raw_realloc(void *ptr, unsigned int size)
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(const mrbc_value *v)
static int mrbc_range_exclude_end(const mrbc_value *v)
static mrbc_value mrbc_range_first(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)
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)
#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)
#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.
struct RObject mrbc_value
Global configuration of mruby/c VM's.