cprintf: properly deal with pointer types
authorNathan Binkert <nate@binkert.org>
Sat, 11 Oct 2008 04:45:35 +0000 (21:45 -0700)
committerNathan Binkert <nate@binkert.org>
Sat, 11 Oct 2008 04:45:35 +0000 (21:45 -0700)
src/base/varargs.hh
src/unittest/cprintftest.cc

index f307e58d1f5bb483bae2f91168b7e29f0e4c9b52..4328f20570a6441e8b317f984a92e5ad611ab712 100644 (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>
 struct Argument : public RefCountingPtr<Base<RECV> >
 {
@@ -156,6 +170,8 @@ struct Argument : public RefCountingPtr<Base<RECV> >
     Argument(const Null &null) { }
     template <typename T>
     Argument(const T& arg) : Base(new Any<T, RECV>(arg)) { }
+    template <typename T>
+    Argument(const T* arg) : Base(new Any<T *, RECV>(arg)) { }
 
     void
     add_arg(RECV &receiver) const
index 7fb10375ce9f11a02f49bc201c7baaf8af8b642a..1438f194be5710fda3b6386ed131eab001b3ae8f 100644 (file)
@@ -34,6 +34,7 @@
 #include <sstream>
 
 #include "base/cprintf.hh"
+#include "base/misc.hh"
 
 using namespace std;
 
@@ -43,6 +44,14 @@ main()
     char foo[] = "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("%shits%%s + %smisses%%s\n", "test", "test");
     cprintf("%%s%-10s %c he went home \'\"%d %#o %#x %1.5f %1.2E\n",