cprintf: properly deal with pointer types

This commit is contained in:
Nathan Binkert 2008-10-10 21:45:35 -07:00
parent 1f57193439
commit 89f016aacb
2 changed files with 25 additions and 0 deletions

View file

@ -147,6 +147,20 @@ struct Any : public Base<RECV>
} }
}; };
template <typename T, class RECV>
struct Any<T *, RECV> : public Base<RECV>
{
const T *argument;
Any(const T *arg) : argument(arg) {}
virtual void
add_arg(RECV &receiver) const
{
receiver.add_arg(argument);
}
};
template <class RECV> template <class RECV>
struct Argument : public RefCountingPtr<Base<RECV> > struct Argument : public RefCountingPtr<Base<RECV> >
{ {
@ -156,6 +170,8 @@ struct Argument : public RefCountingPtr<Base<RECV> >
Argument(const Null &null) { } Argument(const Null &null) { }
template <typename T> template <typename T>
Argument(const T& arg) : Base(new Any<T, RECV>(arg)) { } Argument(const T& arg) : Base(new Any<T, RECV>(arg)) { }
template <typename T>
Argument(const T* arg) : Base(new Any<T *, RECV>(arg)) { }
void void
add_arg(RECV &receiver) const add_arg(RECV &receiver) const

View file

@ -34,6 +34,7 @@
#include <sstream> #include <sstream>
#include "base/cprintf.hh" #include "base/cprintf.hh"
#include "base/misc.hh"
using namespace std; using namespace std;
@ -43,6 +44,14 @@ main()
char foo[] = "foo"; char foo[] = "foo";
cprintf("%s\n", foo); cprintf("%s\n", foo);
string _bar = "asdfkhasdlkfjhasdlkfhjalksdjfhalksdjhfalksdjfhalksdjhf";
int length = 11;
char bar[length + 1];
bar[length] = 0;
memcpy(bar, _bar.c_str(), length);
warn("%s\n", bar);
cprintf("%d\n", 'A'); cprintf("%d\n", 'A');
cprintf("%shits%%s + %smisses%%s\n", "test", "test"); cprintf("%shits%%s + %smisses%%s\n", "test", "test");
cprintf("%%s%-10s %c he went home \'\"%d %#o %#x %1.5f %1.2E\n", cprintf("%%s%-10s %c he went home \'\"%d %#o %#x %1.5f %1.2E\n",