inline std::string matrix_as_string(std::string const& tab, std::string const& nl) const { std::string ret; ret.reserve(9 + tab.length() * 3 + nl.length() * 3); ret += tab; ret += as_char(ii); ret += as_char(ib); ret += as_char(ie); ret += nl; ret += tab; ret += as_char(bi); ret += as_char(bb); ret += as_char(be); ret += nl; ret += tab; ret += as_char(ei); ret += as_char(eb); ret += as_char(ee); return ret; }
void print(Value x) { if (is_nil(x)) prints("nil"); else if (is_eof(x)) printf("#eof"); else if (is_fixnum(x)) printf("%d", as_fixnum(x)); else if (is_bool(x)) printf("%s", as_bool(x) ? "true" : "false"); else if (is_char(x)) printf("'%c'", as_char(x)); else if (is_pair(x)) print_list(x); else if (is_symbol(x)) prints(as_symbol(x)->value); else if (is_string(x)) print_string(as_string(x)); else if (is_procedure(x)) printf("#<procedure %s>", as_procedure(x)->name->value); else if (is_module(x)) printf("#<module>"); else if (is_type(x)) printf("#<type %s>", as_type(x)->name->value); else if (is_ptr(x)) printf("#<object %p>", as_ptr(x)); else if (is_undefined(x)) printf("#undefined"); else printf("#ufo"); }
void String_Discard(var self, var obj) { StringData* s = cast(self, String); if (type_implements(type_of(obj), AsStr)) { const char* ostr = as_str(obj); const char* pos = strstr(s->value, ostr); int bytecount = strlen(s->value) - strlen(pos) - strlen(ostr) + 1; memmove((char*)pos, pos + strlen(ostr), bytecount); } if (type_implements(type_of(obj), AsChar)) { char ochar = as_char(obj); const char* pos = strchr(s->value, ochar); while(pos != NULL) { pos = pos+1; } } }
var String_Contains(var self, var obj) { StringData* s = cast(self, String); if (type_implements(type_of(obj), AsStr)) { const char* ostr = as_str(obj); if ( strstr(s->value, ostr) ) { return True; } else { return False; } } if (type_implements(type_of(obj), AsChar)) { char ochar = as_char(obj); if (strchr(s->value, ochar)) { return True; } else { return False; } } return False; }
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; }