- Katılım
- 24 Şubat 2018
- Mesajlar
- 24,695
Linux'ta yaygın kullanılan bir PDF görüntüleyici olan okular kullanarak bir işlemci dokümanından register isimlerini kopyalayıp ghidra'ya aktarmaya çalışıyordum. Register ismi üzerine çift tıklayıp copy/paste yapıyordum. Ama dokümanda register isimlerinin etrafında bazan normal parantez, bazan köşeli, bazan da farklı bir parantez oluyor. Her seferinde seçilen bölgeyi ayarlamam gerekiyordu. Yüzlerce register var aktarılması gereken, yeterince canımı sıktı ve bu konuda birşey yapmaya karar verdim.
Okular ve bağımlı olduğu bütün kütüphanelerin kaynak kodlarını ve debug sembollerini indirdim. Sonra da okular'da "double click" işinin gereğini yapan fonksiyonu araştırdım ilgili fonksiyonu bulup analiz ettim. Benim tanımladığım bir listedeki karakterleri de "delimiter" olarak kabul edecek şekilde değiştirdim. Başkasının da işini yarayabilir o yüzden yaptığım değişikliği paylaşıyorum. Benim kullandığım okular 23.08.11, ama değişikliğin mantığı basit, başka sürümlere de uyarlanabilir.
Okular ve bağımlı olduğu bütün kütüphanelerin kaynak kodlarını ve debug sembollerini indirdim. Sonra da okular'da "double click" işinin gereğini yapan fonksiyonu araştırdım ilgili fonksiyonu bulup analiz ettim. Benim tanımladığım bir listedeki karakterleri de "delimiter" olarak kabul edecek şekilde değiştirdim. Başkasının da işini yarayabilir o yüzden yaptığım değişikliği paylaşıyorum. Benim kullandığım okular 23.08.11, ama değişikliğin mantığı basit, başka sürümlere de uyarlanabilir.
Kod:
diff --git a/core/textpage.cpp b/core/textpage.cpp
index 0693fcf..39470c3 100644
--- a/core/textpage.cpp
+++ b/core/textpage.cpp
@@ -1775,6 +1775,23 @@ TextEntity::List TextPage::words(const RegularAreaRect *area, TextAreaInclusionB
return ret;
}
+static char delimiters[] = {'[', ']', '(', ')', '{', '}'};
+
+static bool is_delimiter(const QChar& c, const char* delim, unsigned int count)
+{
+ bool rc = false;
+
+ for (unsigned int i = 0; i < count; ++i)
+ {
+ if (c.toLatin1() == delim[i])
+ {
+ rc = true;
+ }
+ }
+
+ return rc;
+}
+
RegularAreaRect *TextPage::wordAt(const NormalizedPoint &p, QString *word) const
{
TextList::ConstIterator itBegin = d->m_words.constBegin(), itEnd = d->m_words.constEnd();
@@ -1795,7 +1812,8 @@ RegularAreaRect *TextPage::wordAt(const NormalizedPoint &p, QString *word) const
while (posIt != itBegin) {
--posIt;
const QString itText = (*posIt)->text();
- if (itText.right(1).at(0).isSpace()) {
+ if (itText.right(1).at(0).isSpace() ||
+ is_delimiter(itText.right(1).at(0), delimiters, sizeof(delimiters))) {
if (itText.endsWith(QLatin1String("-\n"))) {
// Is an hyphenated word
// continue searching the start of the word back
@@ -1819,7 +1837,8 @@ RegularAreaRect *TextPage::wordAt(const NormalizedPoint &p, QString *word) const
RegularAreaRect *ret = new RegularAreaRect();
for (; posIt != itEnd; ++posIt) {
const QString itText = (*posIt)->text();
- if (itText.simplified().isEmpty()) {
+ if (itText.simplified().isEmpty() ||
+ is_delimiter(itText.simplified().right(1).at(0), delimiters, sizeof(delimiters))) {
break;
}
Son düzenleme: