From 893deb73dfbd5cdfbaa155c57f390994e1917438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Fri, 18 Jun 2010 01:07:54 +0200 Subject: [PATCH] derp --- tools/playground/incrementalsearch.cpp | 74 ++++++++++++++++++-------- 1 file changed, 51 insertions(+), 23 deletions(-) diff --git a/tools/playground/incrementalsearch.cpp b/tools/playground/incrementalsearch.cpp index ff3f5b592..e4d46dab5 100644 --- a/tools/playground/incrementalsearch.cpp +++ b/tools/playground/incrementalsearch.cpp @@ -36,40 +36,68 @@ class holder class address { public: - uint64_t addr_; - unsigned int valid : 1; - virtual void print(SegmentedFinder& sff) - { - cout << hex << "0x" << addr_ << endl; - }; - address(const uint64_t addr) - { - addr_ = addr; - valid = false; - } - address & operator=(const uint64_t in) - { - addr_ = in; - valid = false; - return *this; - } - bool isValid(SegmentedFinder& sff) + uint64_t addr_; + unsigned int valid : 1; + virtual void print(SegmentedFinder& sff) + { + cout << hex << "0x" << addr_ << endl; + }; + address(const uint64_t addr) + { + addr_ = addr; + valid = false; + } + virtual address & operator=(const uint64_t in) + { + addr_ = in; + valid = false; + return *this; + } + virtual bool isValid(SegmentedFinder& sff) + { + if(valid) return true; + if(sff.getSegmentForAddress(addr_)) { - if(valid) return true; - if(sff.getSegmentForAddress(addr_)) - { - valid = 1; - } + valid = 1; } + } + virtual bool equals (SegmentedFinder & sf, address & rhs) + { + return rhs.addr_ == addr_; + } }; +// pointer to a null-terminated byte string class Cstr: public address { void print(SegmentedFinder & sf) { cout << hex << "0x" << addr_ << ": \"" << sf.Translate(addr_) << "\"" << endl; } + bool equals(SegmentedFinder & sf,const char * rhs) + { + uint32_t addr2 = *(sf.Translate(addr_)); + return strcmp(sf.Translate(addr2), rhs) == 0; + } + template + bool equalsP(SegmentedFinder & sf,inType rhs) + { + return Predicate(addr_, sf, rhs); + } + bool isValid(SegmentedFinder& sf) + { + if (address::isValid(sf)) + { + // read the pointer + uint32_t addr2 = *(sf.Translate(addr_)); + // is it a real pointer? a pretty weak test, but whatever. + if(sf.getSegmentForAddress(addr2)) + return true; + } + return false; + } }; + // STL STRING #ifdef LINUX_BUILD class STLstr: public address