Exemplo n.º 1
0
HSV
Gradient::interpolate(double x) const {
    if (colors_.isEmpty()) {
      return HSV();
    } else if(MY_ISNAN(x)) {
      return nanColor_;
    } else if (x <= colors_.least()) {
      return *colors_.values().begin();
    } else if (x >= colors_.greatest()) {
        ColorMap::ConstValueIterator iter = colors_.values().end();
        --iter;
        return *iter;
    } else {
        ColorMap::ConstNodeIterator hi = colors_.lowerBound(x);
        ASSERT_forbid(hi == colors_.nodes().end());     // would have been found by x>=colors_.greatest()
        ASSERT_forbid(hi == colors_.nodes().begin());   // would have been found by x<=colors_.least()
        ColorMap::ConstNodeIterator lo = hi; --lo;
        double interpolant = (x - lo->key()) / (hi->key() - lo->key());
        const HSV &c1 = lo->value();
        const HSV &c2 = hi->value();
        return HSV(c1.h() + interpolant * (c2.h()-c1.h()),
                   c1.s() + interpolant * (c2.s()-c1.s()),
                   c1.v() + interpolant * (c2.v()-c1.v()),
                   c1.a() + interpolant * (c2.a()-c1.a()));
    }
}
Exemplo n.º 2
0
static bool
sortBySizeAddress(const NoOperation::IndexInterval &a, const NoOperation::IndexInterval &b) {
    ASSERT_forbid(0==a.size());                         // empty or overflow
    ASSERT_forbid(0==b.size());                         // empty or overflow
    if (a.size() != b.size())
        return a.size() > b.size();                     // sort by decreasing size
    return a.least() < b.least();                       // then increasing address
}
Exemplo n.º 3
0
FunctionCallGraph::Graph::EdgeIterator
FunctionCallGraph::insertCall(const Graph::VertexIterator &source, const Graph::VertexIterator &target,
                          EdgeType type, size_t edgeCount) {
    ASSERT_forbid(source == graph_.vertices().end());
    ASSERT_forbid(target == graph_.vertices().end());
    if (edgeCount) {
        for (Graph::EdgeIterator edge=source->outEdges().begin(); edge!=source->outEdges().end(); ++edge) {
            if (edge->target()==target && edge->value().type()==type) {
                edge->value().count_ += edgeCount;
                return edge;
            }
        }
    }
    return graph_.insertEdge(source, target, Edge(type));
}
Exemplo n.º 4
0
void
BinaryDebugger::attach(const std::vector<std::string> &exeNameAndArgs) {
    ASSERT_forbid(exeNameAndArgs.empty());
    detach();

    child_ = fork();
    if (0==child_) {
        char **argv = new char*[exeNameAndArgs.size()+1];
        for (size_t i=0; i<exeNameAndArgs.size(); ++i)
            argv[i] = strdup(exeNameAndArgs[i].c_str());
        argv[exeNameAndArgs.size()] = NULL;

        if (-1 == ptrace(PTRACE_TRACEME, 0, 0, 0)) {
            std::cerr <<"BinaryDebugger::attach: ptrace_traceme failed: " <<strerror(errno) <<"\n";
            exit(1);
        }
        execv(argv[0], argv);
        std::cerr <<"BinaryDebugger::attach: exec \"" <<StringUtility::cEscape(argv[0]) <<"\" failed: " <<strerror(errno) <<"\n";
        exit(1);
    }

    howDetach_ = DETACH;
    waitForChild();
    if (isTerminated())
        throw std::runtime_error("BinaryDebugger::attach: subordinate " + howTerminated() + " before we gained control");
}
Exemplo n.º 5
0
void
WMemoryMap::updateRowGroupDataWidgets(RowGroup &rg, MemoryMap::NodeIterator mmNode) {
    ASSERT_require(mmNode != memoryMap_.nodes().end());
    const AddressInterval &interval = mmNode->key();
    ASSERT_forbid(interval.isEmpty());
    ASSERT_require(rg.segmentVa == interval.least());

    rg.wSplit->setHidden(!isEditable_ || rg.editingColumn==SplitColumn || !canSplit(rg, mmNode));
    rg.wMerge->setHidden(!isEditable_ || rg.editingColumn==MergeColumn || !canMerge(rg, mmNode));

    rg.wLeastVa->setText(StringUtility::addrToString(interval.least()));
    rg.wGreatestVa->setText(StringUtility::addrToString(interval.greatest()));

    if (interval.isWhole()) {
        rg.wSize->setText("whole");                    // since size would overflow back to zero
    } else {
        rg.wSize->setText(StringUtility::addrToString(interval.size()));
    }

    const MemoryMap::Segment &segment = mmNode->value();
    rg.wReadable->setChecked(0 != (segment.accessibility() & MemoryMap::READABLE));
    rg.wWritable->setChecked(0 != (segment.accessibility() & MemoryMap::WRITABLE));
    rg.wExecutable->setChecked(0 != (segment.accessibility() & MemoryMap::EXECUTABLE));

    rg.wName->setText(StringUtility::cEscape(segment.name()));
}
Exemplo n.º 6
0
// Number of times a tag with the same name as the top-of-stack tag appears in the stack, not counting the top-of-stack.
SAWYER_EXPORT size_t
PodFormatter::nested() const {
    ASSERT_forbid(tagStack_.empty());
    size_t count = 0;
    BOOST_FOREACH (const Tag::Ptr &tag, tagStack_) {
        if (tag->name() == tagStack_.back()->name())
            ++count;
    }
    ASSERT_require(count>0);
    return count-1;                                     // don't count top-of-stack
}
Exemplo n.º 7
0
SAWYER_EXPORT void
PodFormatter::endTag(std::ostream &out, const Tag::Ptr &tag, const TagArgs &args) {
    ASSERT_forbid(tagStack_.empty());
    ASSERT_require(tagStack_.back()==tag);
    tagStack_.pop_back();
    if (tag->type() == DIVIDING)
        out <<(atBeginningOfLine_?"":"\n") <<"\n";

    if (tag->name() == "list") {
        out <<"=back\n\n";
    } else if (tag->name() == "prose" || tag->name() == "nonprose") {
        out <<"=back\n\n";
        textModePop();
    }
}
Exemplo n.º 8
0
void
Demangler::insert(const std::string &mangledName, const std::string &demangledName) {
    ASSERT_forbid(mangledName.empty());
    ASSERT_forbid(demangledName.empty());
    nameMap_.insert(mangledName, demangledName);
}