int xvfprintf(xFILE *stream, const char *fmt, va_list ap) { const char *p; char *sval; int ival; double dval; void *vp; int cnt = 0; for (p = fmt; *p; p++) { if (*p != '%') { xputc(*p, stream); cnt++; continue; } switch (*++p) { case 'd': case 'i': ival = va_arg(ap, int); cnt += print_int(stream, ival, 10); break; case 'f': dval = va_arg(ap, double); cnt += print_int(stream, dval, 10); xputc('.', stream); cnt++; if ((ival = fabs((dval - floor(dval)) * 1e4) + 0.5) == 0) { cnt += xfputs("0000", stream); } else { int i; for (i = 0; i < 3 - (int)log10(ival); ++i) { xputc('0', stream); cnt++; } cnt += print_int(stream, ival, 10); } break; case 's': sval = va_arg(ap, char*); cnt += xfputs(sval, stream); break; case 'p': vp = va_arg(ap, void*); cnt += xfputs("0x", stream); cnt += print_int(stream, (long)vp, 16); break; case '%': xputc(*(p-1), stream); cnt++; break; default: xputc('%', stream); xputc(*(p-1), stream); cnt += 2; break; } } return cnt; }
void pic_print_backtrace(pic_state *pic, xFILE *file) { assert(! pic_invalid_p(pic->err)); if (! pic_error_p(pic->err)) { xfprintf(file, "raise: "); pic_fwrite(pic, pic->err, file); } else { struct pic_error *e; e = pic_error_ptr(pic->err); if (e->type != pic_intern_cstr(pic, "")) { pic_fwrite(pic, pic_obj_value(e->type), file); xfprintf(file, " "); } xfprintf(file, "error: "); pic_fwrite(pic, pic_obj_value(e->msg), file); xfprintf(file, "\n"); /* TODO: print error irritants */ xfputs(pic_str_cstr(pic, e->stack), file); } }
static pic_value pic_port_newline(pic_state *pic) { struct pic_port *port = pic_stdout(pic); pic_get_args(pic, "|p", &port); assert_port_profile(port, PIC_PORT_OUT | PIC_PORT_TEXT, PIC_PORT_OPEN, "newline"); xfputs("\n", port->file); return pic_none_value(); }
struct pic_port * pic_open_input_string(pic_state *pic, const char *str) { struct pic_port *port; port = (struct pic_port *)pic_obj_alloc(pic, sizeof(struct pic_port *), PIC_TT_PORT); port->file = xmopen(); port->flags = PIC_PORT_IN | PIC_PORT_TEXT; port->status = PIC_PORT_OPEN; xfputs(str, port->file); xfflush(port->file); xrewind(port->file); return port; }
/*------------------------------------------------------------------------ * tcout - print the indicated terminal capability on the given stream *------------------------------------------------------------------------ */ int tcout(char *cap, FILE *tfp) { static init; static char *term; static char tbuf[TBUFSIZE], buf[TBUFSIZE], *bp = buf; char *sv; if (!init) { init = 1; term = getenv("TERM"); } if (term == 0 || tgetent(&tbuf[0], term) != 1) return 0; if (sv = tgetstr(cap, &bp)) { xfputs(sv, tfp); return 1; } return 0; }
void ICACHE_FLASH_ATTR shell_puts(const char *s) { xfputs(_z_out_cb, 0, s); }