static void name_variable(Symbol *symbol, LString * file_name) { static LString k_orig_name = "orig_name"; if (symbol->get_name() != emptyLString) return; String base_name; String orig_name = get_orig_sym_name(symbol); if (orig_name != emptyString) { base_name = orig_name; } else { base_name = "_"; String source_file_name = condition_file_name(file_name); // add up to 10 characters at the end of the source file name // name Are you KIDDING! base_name += source_file_name.Right(10); base_name += "Tmp"; } // guaranteed to complete because of the IInteger. // Of course it would be faster if we randomized. for (IInteger ii = 0; ; ii++) { String next_name = base_name + ii.to_String(); if (!LString::exists(next_name)) { SymbolTable *st = symbol->get_symbol_table(); suif_assert_message(st != NULL, ("attempt to name unattached symbol")); st->change_name(symbol,next_name); return; } } suif_assert_message(0, ("Could not form a unique name")); }
static String handle_static_int_constant(CPrintStyleModule *state, const SuifObject *obj) { IntConstant *expr = to<IntConstant>(obj); IInteger v = expr->get_value(); return(v.to_String()); }
static String handle_static_mark_statement(CPrintStyleModule *state, const SuifObject *obj) { MarkStatement *stmt = to<MarkStatement>(obj); String return_str; BrickAnnote *br = to<BrickAnnote>(stmt->peek_annote("line")); return_str = "Mark"; if (br != 0) { String file = to<StringBrick>(br->get_brick(1))->get_value(); IInteger line = to<IntegerBrick>(br->get_brick(0))->get_value(); return_str += " "; return_str += file + ":" + line.to_String(); } return(return_str); }
bool SuifPrinterModule::parse_and_print(ostream& output, const ObjectWrapper &obj, const LString &name, const String &str, int _indent, int deref = 0) { const Address what = obj.get_address(); const MetaClass *type = obj.get_meta_class(); // ObjectWrapper obj(what, type); //output << "str:deref = " << deref << endl; int l_sep = list_separator; if (str.length() == 0) { return false; } if (deref) _indent -= istep; int str_length = str.length(); bool need_indent = false; bool first_field = true; for (int i = 0; i < str_length; ++i) { if (str[i] != '%') { // If there are less than 2 extra stars don't print anything but the // fields. if (deref < 2) { // Need to check for \n and take care of indentation here switch(str[i]) { case '\n': output << str[i]; if (str[i+1]) { need_indent = true; indent(output, _indent); } break; case '\t': indent(output, istep); break; case '\b': _indent -= istep; break; default: output << str[i]; } } } else { ++i; if (str[i] == '%') { // Double % means print out a '%' output << '%'; } else { // This has to be cleaned up a bit ... //int field_deref = deref?deref-1:0; int field_deref = 0; char buff[256]; int j = 0; char c = str[i++]; if (c == '*') { ++field_deref; while ((c = str[i++]) == '*') ++ field_deref; } while (isalnum(c) || c == '_') { buff[j++] = c; c = str[i++]; } i -= 2; buff[j] = 0; // Now retrieve the particular field and print it. if (!strcmp(buff, "Cl")) { output << type->get_instance_name() << '(' << type->get_meta_class_id() << ") "; } else if (!strcmp(buff, "ii")) { // Deal with printing IInteger IInteger *ii = (IInteger *)what; output << ii->to_String().c_str(); } else if (!strcmp(buff, "i")) { // Deal with printing int output << *(int*)what; } else if (!strcmp(buff, "f")) { // float output << *(float*)what; } else if (!strcmp(buff, "d")) { // double output << *(double*)what; } else if (!strcmp(buff, "c")) { // char output << *(char*)what; } else if (!strcmp(buff, "b")) { // byte output << (int)*(char*)what; } else if (!strcmp(buff, "B")) { // bool output << *(bool*)what; } else if (!strcmp(buff, "ls")) { // Deal with printing LStrings LString str = *(LString*) what; output << str; } else if (!strcmp(buff, "s")) { // Deal with printing Strings String str = *(String*) what; output << str; } else if (!strcmp(buff, "n")) { // Deal with name of field if (!deref) output << name; } else if (!strcmp(buff, "P")) { if (obj.is_null()) output << "NULL"; else { PointerWrapper ptr_obj(obj); ObjectWrapper base_obj = ptr_obj.dereference(); if (ptr_obj.get_meta_class()->is_owning_pointer()) { size_t ref = retrieve_tag(obj.get_object()); output << "t" << ref<< ": "; print2(output, base_obj, emptyLString, _indent+istep, field_deref); } else { print_pointer(output, ptr_obj, emptyLString, _indent, deref); } } } else if (!strcmp(buff, "R")) { // print the ref # if (!what) output << "NULL"; else { // PointerMetaClass *p = (PointerMetaClass*) type; // const Address baseAddr = *(Address*) type; //ObjectWrapper obj(what, type); size_t ref = retrieve_tag(obj); output << "t" << ref<< ": "; } } else if (!strcmp(buff, "LS")) { list_separator = ' '; } else if (!strcmp(buff, "LN")) { list_separator = '\n'; } else if (!strcmp(buff, "LC")) { list_separator = ','; } else if (!strcmp(buff, "ANNOTES")) { // Special CASE for handling ANNOTATIONS AggregateWrapper agg(obj); LString field_name("_annotes"); FieldDescription *f = agg.get_field_description(field_name); if (!f) cerr << type->get_meta_class(what)->get_class_name() << ":No field '" << field_name << "' found to print!!!\n"; else { // Now we need to get the field offset and increment 'what' if (field_deref != 0) cerr << "Extra '*' for %ANNOTES\n"; FieldWrapper field = agg.get_field(field_name); if (need_indent) { indent(output, istep); need_indent = false; } char old_sep = list_separator; list_separator = '\n'; print2(output, field.get_object(), field_name, _indent+istep, 1); list_separator = old_sep; } } else if (j) { // Retrieve the field mentioned // The following cast works as we should reach here only if it // is not an elementary or pointer type. AggregateWrapper agg(obj); char *bf = buff; LString field_name(bf); FieldDescription *f = agg.get_field_description(field_name); if (!f) cerr << type->get_meta_class(what)->get_class_name() << ":No field '" << field_name << "' found to print!!!\n"; else { // Now we need to get the field offset and increment 'what' if (deref) if (!first_field) output << ' '; else first_field = false; FieldWrapper field = agg.get_field(field_name); //char *f_add = (char*)what + f->get_offset(); //indent(output, _indent+istep); if (need_indent) { indent(output, istep); need_indent = false; } if (deref && !field_deref) field_deref = deref - 1; //output << "\tstr:field_deref = " << field_deref << endl; print2(output, field.get_object(), field_name, _indent+istep, field_deref); } } } } } list_separator = l_sep; return true; }