Internals: In .tree files show filename as letter

This commit is contained in:
Wilson Snyder
2011-10-11 07:17:39 -04:00
parent ca81db8edf
commit 40076287ea
7 changed files with 79 additions and 22 deletions
+32 -1
View File
@@ -34,6 +34,9 @@
//======================================================================
// Statics
map<string,int> FileLine::s_namemap;
deque<string> FileLine::s_names;
// s_defaultFileLine must be after s_name* initializer and in same .cpp file
FileLine FileLine::s_defaultFileLine = FileLine(EmptySecret());
int V3Error::s_errCount = 0;
@@ -70,8 +73,9 @@ V3ErrorCode::V3ErrorCode(const char* msgp) {
// FileLine class functions
FileLine::FileLine(FileLine::EmptySecret) {
// Sort of a singleton
m_lineno=0;
m_filename="COMMAND_LINE";
m_filenameno=nameToNumber("AstRoot");
m_warnOn=0;
for (int codei=V3ErrorCode::EC_MIN; codei<V3ErrorCode::_ENUM_MAX; codei++) {
@@ -80,6 +84,31 @@ FileLine::FileLine(FileLine::EmptySecret) {
}
}
int FileLine::nameToNumber(const string& filename) {
// Convert filenames to a filenameno
// This lets us assign a nice small identifier for debug messages, but more
// importantly lets us use a 4 byte int instead of 8 byte pointer in every FileLine.
map<string,int>::const_iterator iter = s_namemap.find(filename);
if (VL_LIKELY(iter != s_namemap.end())) return iter->second;
int num = s_names.size();
s_names.push_back(filename);
s_namemap.insert(make_pair(filename,num));
return num;
}
const string FileLine::filenameLetters() const {
const int size = 1 + (64 / 4); // Each letter retires more than 4 bits of a > 64 bit number
char out[size];
char* op = out+size-1;
*--op = '\0'; // We build backwards
int num = m_filenameno;
do {
*--op = 'a'+num%26;
num /= 26;
} while (num);
return op;
}
string FileLine::lineDirectiveStrg(int enterExit) const {
char numbuf[20]; sprintf(numbuf, "%d", lineno());
char levelbuf[20]; sprintf(levelbuf, "%d", enterExit);
@@ -262,6 +291,8 @@ void FileLine::deleteAllRemaining() {
// Eventually the list will be empty and terminate the loop.
}
fileLineLeakChecks.clear();
s_names.clear();
s_namemap.clear();
#endif
}