void get_print_string(oop_t x, char* s, int size) { // toto unimplemented incomplete -- dmu 1/06 switch (tag(x)) { default: fatal("???"); case float_tag: sprintf(s, "a float 0x%x", x); return; case smi_tag: sprintf(s, "a smi %d", value_of_smiOop(x)); return; case mark_tag: sprintf(s, "a markOop 0x%x", x); return; case mem_tag: break; } if (size < length_of_C_string(s)) fatal("string overflow"); size -= length_of_C_string(s); if (is_byteVector(x)) { ByteVectorObj::from(x)->copy_to_C_string(s, size); } else if (is_method(x)) { printf_and_flush("object vector printing not implemented\n"); // }else if (is_blockMethod(x)) { // printf_and_flush("block method printing not implemented\n"); } else if (is_block(x)) { printf_and_flush("block printing not implemented\n"); } else if (is_objVector(x)) { smi id = Object_Table::index_for_oop(x); ObjVectorObj* x_ov = ObjVectorObj::from(x); printf_and_flush("object vector [ID: %d, size: %d], contents:\n", id , x_ov->indexableSize()); //x_ov->print(); printf_and_flush("done contents [ID: %d].\n", id); } else { printf_and_flush("printing not implemented for ??? object type\n"); } if (size < length_of_C_string(s)) fatal("string overflow"); }
//aaa todo check if can factor this and is_equal_to_C_string bool ByteVectorObj::ends_with_C_string(const char* cString, int size) { // passing in a size is just an optimization // size should not include null character if (size == -1) size = length_of_C_string(cString); else assert( size == length_of_C_string(cString)); if (size > indexableSize()) return false; //optimization for (const char *sp = bytes() + indexableSize(), *cp = cString + size; cString <= cp; ) { if ( *cp-- != *sp-- ) return false; } return true; }
oop_t ByteVectorObj::clone_for_C_string(char* cString, ByteVectorObj** addrp, fint length) { fint n = (length == -1) ? length_of_C_string(cString) : length; ByteVectorObj* addr; oop_t new_bv = clone_and_resize(n, 0, &addr, false); if (addrp) *addrp = addr; char *srcp = cString, *dstp = addr->bytes(), *endp = cString + n; while (srcp != endp) *dstp++ = *srcp++; return new_bv; }