summaryrefslogtreecommitdiff
path: root/src/base/cprintf.hh
diff options
context:
space:
mode:
authorNathan Binkert <nate@binkert.org>2008-12-03 04:57:54 -0800
committerNathan Binkert <nate@binkert.org>2008-12-03 04:57:54 -0800
commit74f10be5266039fc9d2c1be14c551d1bcefed99c (patch)
tree99bfdb9d3ff33d397f7dc935a97dd5b5968cc06b /src/base/cprintf.hh
parent47e2b0889359877cb9a86c02c4bdf862fbd87338 (diff)
downloadgem5-74f10be5266039fc9d2c1be14c551d1bcefed99c.tar.xz
cprintf: support a configurable width and precision ("*" in printf)
Diffstat (limited to 'src/base/cprintf.hh')
-rw-r--r--src/base/cprintf.hh35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/base/cprintf.hh b/src/base/cprintf.hh
index cff73a228..2920e210d 100644
--- a/src/base/cprintf.hh
+++ b/src/base/cprintf.hh
@@ -51,24 +51,53 @@ struct Print
std::ostream &stream;
const char *format;
const char *ptr;
+ bool cont;
std::ios::fmtflags saved_flags;
char saved_fill;
int saved_precision;
- void process(Format &fmt);
+ Format fmt;
+ void process();
public:
Print(std::ostream &stream, const std::string &format);
Print(std::ostream &stream, const char *format);
~Print();
+ int
+ get_number(int data)
+ {
+ return data;
+ }
+
+ template <typename T>
+ int
+ get_number(const T& data)
+ {
+ return 0;
+ }
+
template <typename T>
void
add_arg(const T &data)
{
- Format fmt;
- process(fmt);
+ if (!cont)
+ process();
+
+ if (fmt.get_width) {
+ fmt.get_width = false;
+ cont = true;
+ fmt.width = get_number(data);
+ return;
+ }
+
+ if (fmt.get_precision) {
+ fmt.get_precision = false;
+ cont = true;
+ fmt.precision = get_number(data);
+ return;
+ }
switch (fmt.format) {
case Format::character: