WIP.
diff --git a/src/bloaty.cc b/src/bloaty.cc index dbea25e..ea2287d 100644 --- a/src/bloaty.cc +++ b/src/bloaty.cc
@@ -39,6 +39,7 @@ #include <sys/wait.h> #include <unistd.h> +#include "absl/strings/str_cat.h" #include "absl/strings/str_join.h" #include "absl/strings/string_view.h" #include "re2/re2.h" @@ -338,7 +339,6 @@ } std::string Demangler::Demangle(const std::string& symbol) { - return symbol; const char *writeptr = symbol.c_str(); const char *writeend = writeptr + symbol.size(); @@ -797,10 +797,13 @@ size_t j; int nesting = 0; size_t nesting_start = 0; + size_t last_separator = 0; + for (j = 0; j < limit; j++) { if (curr[j] != last[j]) { break; } + if (curr[j] == ',' && nesting == 0) { break; } @@ -813,6 +816,7 @@ break; } } + if (nesting > 0) { j = nesting_start; } @@ -979,8 +983,16 @@ CollectNames(&toplevel_row_, &names); SuffixArray suffixes; + bool saw_overfull = false; for (size_t i = 0; i < names.size(); i++) { suffixes.AddString(*names[i]); + if (names[i]->size() > width) { + saw_overfull = true; + } + } + + if (!saw_overfull) { + return; } suffixes.ComputeArray(); @@ -1001,39 +1013,51 @@ for (size_t i = 0; i < suffixes.size(); i++) { size_t lcp = suffixes.GetLcp(i); - std::cout << "Suffix: " << suffixes.GetSuffix(i).first << ", lcp: " << lcp << "\n"; - if (start_indexes.empty() || lcp > suffixes.GetLcp(start_indexes.back())) { - start_indexes.push_back(i); - } - while (lcp < suffixes.GetLcp(start_indexes.back())) { + std::cout << "i: " << i << ", Suffix: " << suffixes.GetSuffix(i).first << ", lcp: " << lcp << "\n"; + while (!start_indexes.empty() && + (lcp == 0 || lcp < suffixes.GetLcp(start_indexes.back()))) { size_t index = start_indexes.back(); + std::cout << "Index: " << index << "\n"; size_t len = suffixes.GetLcp(index); start_indexes.pop_back(); - size_t weight = (i - index + 1) * len * len; - std::cout << "Weight: " << weight << "\n"; + size_t string_count = (i - index + 1); + size_t weight = string_count * string_count * len; + string_view prefix = suffixes.GetSuffix(index).first.substr(0, len); + std::cout << "Prefix: " << prefix << ", Weight: " << weight << "\n"; if (weight > 0) { - string_view substr = suffixes.GetSuffix(index).first.substr(0, len); - abbrevs.emplace(weight, substr); + abbrevs.emplace(weight, prefix); } } + if (start_indexes.empty() || lcp > suffixes.GetLcp(start_indexes.back())) { + start_indexes.push_back(i); + } } char ch = 'A'; - while (!abbrevs.empty()) { + while (!abbrevs.empty() && saw_overfull) { + saw_overfull = false; const std::string abbrev_text = abbrevs.top().str; abbrevs.pop(); - if (abbrev_text.size() < 30) { - continue; - } - std::string replacement(1, ch); - abbrevs_.emplace_back(replacement, abbrev_text); - ch++; + //if (abbrev_text.size() < 30) { + // continue; + //} + std::string replacement = absl::StrCat("[", string_view(&ch, 1), "]"); + bool saw = false; for (const auto& name : names) { size_t pos; while ((pos = name->find(abbrev_text)) != std::string::npos) { + saw = true; name->replace(pos, abbrev_text.size(), replacement); + if (name->size() > width) { + saw_overfull = true; + } } } + if (!saw) { + continue; + } + abbrevs_.emplace_back(replacement, abbrev_text); + ch++; std::cout << "Abbrev: " << abbrevs.top().str << ", weight:" << abbrevs.top().weight << "\n"; } }