bool Architecture::FormatFunction( Document const& rDoc, Address const& rAddr, Function const& rFunc, PrintData & rPrintData) const { auto FuncLabel = rDoc.GetLabelFromAddress(rAddr); if (rFunc.GetSize() != 0 && rFunc.GetInstructionCounter() != 0) { std::ostringstream oss; oss << std::hex << std::showbase << std::left << "; size=" << rFunc.GetSize() << ", insn_cnt=" << rFunc.GetInstructionCounter(); rPrintData.AppendComment(oss.str()); } else rPrintData.AppendComment("; imported"); Id CurId; if (!rDoc.RetrieveDetailId(rAddr, 0, CurId)) return true; FunctionDetail FuncDtl; if (!rDoc.GetFunctionDetail(CurId, FuncDtl)) return true; rPrintData.AppendNewLine().AppendSpace(2).AppendComment(";").AppendSpace(); auto const& RetType = FuncDtl.GetReturnType(); std::string FuncName; Label CurLbl = rDoc.GetLabelFromAddress(rAddr); if (CurLbl.GetType() == Label::Unknown) FuncName = FuncDtl.GetName(); else FuncName = CurLbl.GetName(); FormatTypeDetail(RetType, rPrintData); rPrintData.AppendSpace().AppendLabel(FuncName).AppendOperator("("); bool FirstParam = true; auto const& Params = FuncDtl.GetParameters(); for (auto const& Param : Params) { if (FirstParam) FirstParam = false; else rPrintData.AppendOperator(",").AppendSpace(); FormatTypeDetail(Param.GetType(), rPrintData); rPrintData.AppendSpace().AppendLabel(Param.GetValue().GetName()); } rPrintData.AppendOperator(");"); return true; }
bool Architecture::FormatValue( Document const& rDoc, BinaryStream const& rBinStrm, Address const& rAddr, Value const& rVal, std::string & rStrCell, Cell::Mark::List & rMarks) const { std::ostringstream oss; TOffset Off; u8 ValueType = rVal.GetSubType(); std::string BasePrefix = ""; bool IsUnk = false; auto const& rCurBinStrm = rDoc.GetBinaryStream(); if (!rDoc.ConvertAddressToFileOffset(rAddr, Off)) IsUnk = true; oss << std::setfill('0'); switch (ValueType) { case Value::BinaryType: BasePrefix = "0b"; break; // TODO: Unimplemented case Value::DecimalType: oss << std::dec; BasePrefix = "0n"; break; case Value::HexadecimalType: default: oss << std::hex; BasePrefix = "0x"; break; } Cell::Mark::Type MarkType = Cell::Mark::ImmediateType; switch (rVal.GetLength()) { case 1: default: { if (IsUnk) oss << "db (?)"; else { u8 Data; if (!rCurBinStrm.Read(Off, Data)) return false; oss << "db " << BasePrefix << std::setw(2) << static_cast<u16>(Data); // u8 type would be printed as char by ostream } break; } case 2: { if (IsUnk) oss << "dw (?)"; else { u16 Data; if (!rCurBinStrm.Read(Off, Data)) return false; Label Lbl = rDoc.GetLabelFromAddress(Data); if (Lbl.GetType() == Label::Unknown) oss << "dw " << BasePrefix << std::setw(4) << static_cast<u16>(Data); else { oss << "dw " << Lbl.GetLabel(); MarkType = Cell::Mark::LabelType; } } break; } case 4: { if (IsUnk) oss << "dd (?)"; else { u32 Data; if (!rCurBinStrm.Read(Off, Data)) return false; Label Lbl = rDoc.GetLabelFromAddress(Data); if (Lbl.GetType() == Label::Unknown) oss << "dd " << BasePrefix << std::setw(8) << static_cast<u32>(Data); else { oss << "dd " << Lbl.GetLabel(); MarkType = Cell::Mark::LabelType; } } break; } case 8: { if (IsUnk) oss << "dq (?)"; else { u64 Data; if (!rCurBinStrm.Read(Off, Data)) return false; Label Lbl = rDoc.GetLabelFromAddress(Data); if (Lbl.GetType() == Label::Unknown) oss << "dq " << BasePrefix << std::setw(16) << static_cast<u64>(Data); else { oss << "dq " << Lbl.GetLabel(); MarkType = Cell::Mark::LabelType; } } break; } } rMarks.push_back(Cell::Mark(Cell::Mark::KeywordType, 3)); rMarks.push_back(Cell::Mark(MarkType, oss.str().length() - 3)); rStrCell = oss.str(); return true; }