Fix %{number}s with strings. #2093.

This commit is contained in:
Wilson Snyder
2020-01-09 19:39:27 -05:00
parent 029ff69d30
commit 2a50fafef2
6 changed files with 32 additions and 9 deletions
+16 -7
View File
@@ -496,11 +496,18 @@ bool V3Number::displayedFmtLegal(char format) {
default: return false;
}
}
string V3Number::displayPad(size_t fmtsize, char pad, const string& in) {
string prefix;
if (in.length() < fmtsize) prefix = string(fmtsize - in.length(), pad);
return prefix + in;
}
string V3Number::displayed(AstNode* nodep, const string& vformat) const {
return displayed(nodep->fileline(), vformat);
}
string V3Number::displayed(FileLine*fl, const string& vformat) const {
string V3Number::displayed(FileLine* fl, const string& vformat) const {
string::const_iterator pos = vformat.begin();
UASSERT(pos != vformat.end() && pos[0]=='%',
"$display-like function with non format argument "<<*this);
@@ -566,6 +573,8 @@ string V3Number::displayed(FileLine*fl, const string& vformat) const {
if (fmtsize != "0") str += ' ';
}
}
size_t fmtsizen = static_cast<size_t>(atoi(fmtsize.c_str()));
str = displayPad(fmtsizen, ' ', str);
return str;
}
case '~': // Signed decimal
@@ -592,12 +601,10 @@ string V3Number::displayed(FileLine*fl, const string& vformat) const {
str = cvtToStr(toUQuad());
}
}
int intfmtsize = atoi(fmtsize.c_str());
bool zeropad = fmtsize.length()>0 && fmtsize[0]=='0';
while (static_cast<int>(str.length()) < intfmtsize) {
if (zeropad) str.insert(0, "0");
else str.insert(0, " ");
}
// fmtsize might have changed since we parsed the %fmtsize
size_t fmtsizen = static_cast<size_t>(atoi(fmtsize.c_str()));
str = displayPad(fmtsizen, (zeropad ? '0' : ' '), str);
return str;
}
case 'e':
@@ -643,7 +650,9 @@ string V3Number::displayed(FileLine*fl, const string& vformat) const {
return str;
}
case '@': { // Packed string
return toString();
size_t fmtsizen = static_cast<size_t>(atoi(fmtsize.c_str()));
str = displayPad(fmtsizen, ' ', toString());
return str;
}
default:
fl->v3fatalSrc("Unknown $display-like format code for number: %"<<pos[0]);
+1
View File
@@ -175,6 +175,7 @@ private:
for (int i=0; i<words(); i++) m_value[i] = m_valueX[i] = 0;
}
void setNames(AstNode* nodep);
static string displayPad(size_t fmtsize, char pad, const string& in);
string displayed(FileLine* fl, const string& vformat) const;
string displayed(const string& vformat) const {
return displayed(m_fileline, vformat);