mbed library sources

Fork of mbed-src by mbed official

Revision:
64:7b352733b00a
Parent:
36:ab3ee77451e7
Child:
299:fb529cc9bc22
--- a/common/RawSerial.cpp	Thu Dec 19 09:00:06 2013 +0000
+++ b/common/RawSerial.cpp	Thu Dec 19 13:15:07 2013 +0000
@@ -15,9 +15,12 @@
  */
 #include "RawSerial.h"
 #include "wait_api.h"
+#include <cstdarg>
 
 #if DEVICE_SERIAL
 
+#define STRING_STACK_LIMIT    120
+
 namespace mbed {
 
 RawSerial::RawSerial(PinName tx, PinName rx) : SerialBase(tx, rx) {
@@ -31,6 +34,34 @@
     return _base_putc(c);
 }
 
+int RawSerial::puts(const char *str) {
+    while (*str)
+        putc(*str ++);
+    return 0;
+}
+
+// Experimental support for printf in RawSerial. No Stream inheritance
+// means we can't call printf() directly, so we use sprintf() instead.
+// We only call malloc() for the sprintf() buffer if the buffer
+// length is above a certain threshold, otherwise we use just the stack.
+int RawSerial::printf(const char *format, ...) {
+    std::va_list arg;
+    va_start(arg, format);
+    int len = vsnprintf(NULL, 0, format, arg);
+    if (len < STRING_STACK_LIMIT) {
+        char temp[STRING_STACK_LIMIT];
+        vsprintf(temp, format, arg);
+        puts(temp);
+    } else {
+        char *temp = new char[len + 1];
+        vsprintf(temp, format, arg);
+        puts(temp);
+        delete[] temp;
+    }
+    va_end(arg);
+    return len;
+}
+
 } // namespace mbed
 
 #endif