static void printMemOffset(MCInst *MI, unsigned Op, SStream *O) { MCOperand *DispSpec = MCInst_getOperand(MI, Op); MCOperand *SegReg = MCInst_getOperand(MI, Op+1); SStream_concat0(O, markup("<mem:")); // If this has a segment register, print it. if (MCOperand_getReg(SegReg)) { printOperand(MI, Op+1, O); SStream_concat0(O, ":"); } if (MI->csh->detail) { MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_MEM; MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.base = X86_REG_INVALID; MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.index = X86_REG_INVALID; MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.scale = 1; MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = 0; } if (MCOperand_isImm(DispSpec)) { int64_t imm = MCOperand_getImm(DispSpec); if (MI->csh->detail) MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = imm; if (imm < 0) { SStream_concat(O, "0x%"PRIx64, arch_masks[MI->csh->mode] & imm); } else { if (imm > HEX_THRESHOLD) SStream_concat(O, "0x%"PRIx64, imm); else SStream_concat(O, "%"PRIu64, imm); } } SStream_concat0(O, markup(">")); if (MI->csh->detail) MI->flat_insn->detail->x86.op_count++; }
// local printOperand, without updating public operands static void _printOperand(MCInst *MI, unsigned OpNo, SStream *O) { MCOperand *Op = MCInst_getOperand(MI, OpNo); if (MCOperand_isReg(Op)) { printRegName(O, MCOperand_getReg(Op)); } else if (MCOperand_isImm(Op)) { // Print X86 immediates as signed values. int64_t imm = MCOperand_getImm(Op); if (imm < 0) { if (imm < -HEX_THRESHOLD) SStream_concat(O, "%s$-0x%"PRIx64"%s", markup("<imm:"), -imm, markup(">")); else SStream_concat(O, "%s$-%"PRIu64"%s", markup("<imm:"), -imm, markup(">")); } else { if (imm > HEX_THRESHOLD) SStream_concat(O, "%s$0x%"PRIx64"%s", markup("<imm:"), imm, markup(">")); else SStream_concat(O, "%s$%"PRIu64"%s", markup("<imm:"), imm, markup(">")); } } }
void PasteboardHelper::fillDataObjectFromDropData(GtkSelectionData* data, guint info, DataObjectGtk* dataObject) { if (!gtk_selection_data_get_data(data)) return; GdkAtom target = gtk_selection_data_get_target(data); if (target == textPlainAtom) dataObject->setText(selectionDataToUTF8String(data)); else if (target == markupAtom) { String markup(selectionDataToUTF8String(data)); removeMarkupPrefix(markup); dataObject->setMarkup(markup); } else if (target == uriListAtom) { dataObject->setURIList(selectionDataToUTF8String(data)); } else if (target == netscapeURLAtom) { String urlWithLabel(selectionDataToUTF8String(data)); Vector<String> pieces; urlWithLabel.split("\n", pieces); // Give preference to text/uri-list here, as it can hold more // than one URI but still take the label if there is one. if (!dataObject->hasURIList()) dataObject->setURIList(pieces[0]); if (pieces.size() > 1) dataObject->setText(pieces[1]); } else if (target == unknownAtom) { GRefPtr<GVariant> variant = g_variant_new_parsed(reinterpret_cast<const char*>(gtk_selection_data_get_data(data))); GOwnPtr<gchar> key; GOwnPtr<gchar> value; GVariantIter iter; g_variant_iter_init(&iter, variant.get()); while (g_variant_iter_next(&iter, "{ss}", &key.outPtr(), &value.outPtr())) { dataObject->setUnknownTypeData(key.get(), value.get()); // FIXME: should GOwnPtr be smarter about this and replace the existing ptr when outPtr() is used? key.clear(); value.clear(); } } }
static void parse_element(rapidxml::xml_node<>* node, configuration const& config, std::string const& parent, Element& el) { if (node != NULL) { std::string name = node->name(); std::string full = parent + "." + name; if (full == ".briefdescription.para") { parse_para(node, el.brief_description, el.skip); } else if (full == ".detaileddescription.para") { std::string para; parse_para(node, para, el.skip); if (!para.empty() && !el.detailed_description.empty()) { el.detailed_description += "\n\n"; } el.detailed_description += para; } else if (full == ".location") { std::string loc = get_attribute(node, "file"); // Location of (header)file. It is a FULL path, so find the start // and strip the rest std::size_t pos = loc.rfind(config.start_include); if (pos != std::string::npos) { loc = loc.substr(pos); } el.location = loc; el.line = atol(get_attribute(node, "line").c_str()); } else if (full == ".detaileddescription.para.qbk") { el.qbk_markup.push_back(markup(node->value())); } else if (full == ".detaileddescription.para.qbk.after.synopsis") { el.qbk_markup.push_back(markup(markup_after, markup_synopsis, node->value())); } else if (full == ".detaileddescription.para.qbk.before.synopsis") { el.qbk_markup.push_back(markup(markup_before, markup_synopsis, node->value())); } else if (full == ".detaileddescription.para.qbk.distinguish") { el.additional_description = node->value(); boost::trim(el.additional_description); } else if (full == ".templateparamlist") { parse_parameter_list(node->first_node(), el.template_parameters); } else if (full == ".detaileddescription.para.parameterlist") { std::string kind = get_attribute(node, "kind"); if (kind == "param") { parse_parameter_list(node->first_node(), el.parameters); } else if (kind == "templateparam") { parse_parameter_list(node->first_node(), el.template_parameters); } } parse_element(node->first_node(), config, full, el); parse_element(node->next_sibling(), config, parent, el); } }
static void printRegName(SStream *OS, unsigned RegNo) { SStream_concat(OS, "%s%%%s%s", markup("<reg:"), getRegisterName(RegNo), markup(">")); }
static void printMemReference(MCInst *MI, unsigned Op, SStream *O) { MCOperand *BaseReg = MCInst_getOperand(MI, Op); MCOperand *IndexReg = MCInst_getOperand(MI, Op+2); MCOperand *DispSpec = MCInst_getOperand(MI, Op+3); MCOperand *SegReg = MCInst_getOperand(MI, Op+4); uint64_t ScaleVal; if (MI->csh->detail) { MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].type = X86_OP_MEM; MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.base = MCOperand_getReg(BaseReg); MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.index = MCOperand_getReg(IndexReg); MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.scale = 1; MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = 0; } SStream_concat0(O, markup("<mem:")); // If this has a segment register, print it. if (MCOperand_getReg(SegReg)) { _printOperand(MI, Op+4, O); SStream_concat0(O, ":"); } if (MCOperand_isImm(DispSpec)) { int64_t DispVal = MCOperand_getImm(DispSpec); if (MI->csh->detail) MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.disp = DispVal; if (DispVal || (!MCOperand_getReg(IndexReg) && !MCOperand_getReg(BaseReg))) { if (DispVal < 0) { SStream_concat(O, "0x%"PRIx64, arch_masks[MI->csh->mode] & DispVal); } else { if (DispVal > HEX_THRESHOLD) SStream_concat(O, "0x%"PRIx64, DispVal); else SStream_concat(O, "%"PRIu64, DispVal); } } } if (MCOperand_getReg(IndexReg) || MCOperand_getReg(BaseReg)) { SStream_concat0(O, "("); if (MCOperand_getReg(BaseReg)) _printOperand(MI, Op, O); if (MCOperand_getReg(IndexReg)) { SStream_concat0(O, ", "); _printOperand(MI, Op+2, O); ScaleVal = MCOperand_getImm(MCInst_getOperand(MI, Op+1)); if (MI->csh->detail) MI->flat_insn->detail->x86.operands[MI->flat_insn->detail->x86.op_count].mem.scale = (int)ScaleVal; if (ScaleVal != 1) { SStream_concat(O, ", %s%u%s", markup("<imm:"), ScaleVal, markup(">")); } } SStream_concat0(O, ")"); } SStream_concat0(O, markup(">")); if (MI->csh->detail) MI->flat_insn->detail->x86.op_count++; }