summaryrefslogtreecommitdiffstats
path: root/lldb/source/Utility/VASprintf.cpp
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2017-02-16 19:38:21 +0000
committerZachary Turner <zturner@google.com>2017-02-16 19:38:21 +0000
commit24ae6294a4a97d4dfe0e43f7bcd52811b6346c17 (patch)
treefbca446d37efde935ee0a5c69ac1410c7c6a1b94 /lldb/source/Utility/VASprintf.cpp
parentcac10f9768594c039d1f4dc41ece8380ba448b07 (diff)
downloadbcm5719-llvm-24ae6294a4a97d4dfe0e43f7bcd52811b6346c17.tar.gz
bcm5719-llvm-24ae6294a4a97d4dfe0e43f7bcd52811b6346c17.zip
Finish breaking the dependency from Utility.
Differential Revision: https://reviews.llvm.org/D29964 llvm-svn: 295368
Diffstat (limited to 'lldb/source/Utility/VASprintf.cpp')
-rw-r--r--lldb/source/Utility/VASprintf.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/lldb/source/Utility/VASprintf.cpp b/lldb/source/Utility/VASprintf.cpp
new file mode 100644
index 00000000000..cc280ec3a14
--- /dev/null
+++ b/lldb/source/Utility/VASprintf.cpp
@@ -0,0 +1,52 @@
+//===-- VASPrintf.cpp -------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Utility/VASprintf.h"
+
+#include "llvm/ADT/SmallString.h"
+
+using namespace lldb_private;
+
+bool lldb_private::VASprintf(llvm::SmallVectorImpl<char> &buf, const char *fmt,
+ va_list args) {
+ llvm::SmallString<16> error("<Encoding error>");
+ bool result = true;
+
+ // Copy in case our first call to vsnprintf doesn't fit into our buffer
+ va_list copy_args;
+ va_copy(copy_args, args);
+
+ buf.resize(buf.capacity());
+ // Write up to `capacity` bytes, ignoring the current size.
+ int length = ::vsnprintf(buf.data(), buf.size(), fmt, args);
+ if (length < 0) {
+ buf = error;
+ result = false;
+ goto finish;
+ }
+
+ if (length >= buf.size()) {
+ // The error formatted string didn't fit into our buffer, resize it
+ // to the exact needed size, and retry
+ buf.resize(length + 1);
+ length = ::vsnprintf(buf.data(), buf.size(), fmt, copy_args);
+ if (length < 0) {
+ buf = error;
+ result = false;
+ goto finish;
+ }
+ assert(length < buf.size());
+ }
+ buf.resize(length);
+
+finish:
+ va_end(args);
+ va_end(copy_args);
+ return result;
+}
OpenPOWER on IntegriCloud