int Int_Show(var self, var output, int pos) { IntData* io = cast(self, Int); pos += format_to(output, pos, "%li", io->value); return pos; }
int print_to_va(var out, int pos, const char* fmt, va_list va) { char fmt_buf[strlen(fmt)+1]; while(true) { if (*fmt == '\0') { break; } const char* start = fmt; /* Match String */ while(!strchr("%\0", *fmt)) { fmt++; } if (start != fmt) { strncpy(fmt_buf, start, (fmt - start)); fmt_buf[(fmt - start)] = '\0'; int off = format_to(out, pos, fmt_buf); if (off < 0) { throw(FormatError, "Unable to output format!"); } pos += off; continue; } /* Match %% */ if (*fmt == '%' && *(fmt+1) == '%') { int off = format_to(out, pos, "%%"); if (off < 0) { throw(FormatError, "Unable to output '%%%%'!"); } pos += off; fmt += 2; continue; } /* Match Format Specifier */ while(!strchr("diuoxXfFeEgGaAxcsp$\0", *fmt)) { fmt++; } if (start != fmt) { strncpy(fmt_buf, start, (fmt - start)+1); fmt_buf[(fmt - start)+1] = '\0'; var a = va_arg(va, var); if (*fmt == '$') { pos = show_to(a, out, pos); } if (*fmt == 's') { int off = format_to(out, pos, fmt_buf, as_str(a)); if (off < 0) { throw(FormatError, "Unable to output String!"); } pos += off; } if (strchr("diouxX", *fmt)) { int off = format_to(out, pos, fmt_buf, as_long(a)); if (off < 0) { throw(FormatError, "Unable to output Int!"); } pos += off; } if (strchr("fFeEgGaA", *fmt)) { int off = format_to(out, pos, fmt_buf, as_double(a)); if (off < 0) { throw(FormatError, "Unable to output Real!"); } pos += off; } if (*fmt == 'c') { int off = format_to(out, pos, fmt_buf, as_char(a)); if (off < 0) { throw(FormatError, "Unable to output Char!"); } pos += off; } if (*fmt == 'p') { int off = format_to(out, pos, fmt_buf, a); if (off < 0) { throw(FormatError, "Unable to output Object!"); } pos += off; } fmt++; continue; } throw(FormatError, "Invalid Format String!"); } return pos; }