BString: Add SetToFormatVarArgs()

This commit is contained in:
Ingo Weinhold 2013-08-27 23:44:52 +02:00
parent af0200d6ef
commit be3833c9a4
2 changed files with 28 additions and 11 deletions

View File

@ -6,10 +6,11 @@
#define __BSTRING__
#include <BeBuild.h>
#include <SupportDefs.h>
#include <stdarg.h>
#include <string.h>
#include <SupportDefs.h>
class BStringList;
class BStringRef;
@ -55,6 +56,8 @@ public:
BString& AdoptChars(BString& from, int32 charCount);
BString& SetToFormat(const char* format, ...);
BString& SetToFormatVarArgs(const char* format,
va_list args);
// Substring copying
BString& CopyInto(BString& into, int32 fromOffset,

View File

@ -428,13 +428,31 @@ BString::AdoptChars(BString& string, int32 charCount)
BString&
BString::SetToFormat(const char* format, ...)
{
va_list args;
va_start(args, format);
SetToFormatVarArgs(format, args);
va_end(args);
return *this;
}
BString&
BString::SetToFormatVarArgs(const char* format, va_list args)
{
// Use a small on-stack buffer to save a second vsnprintf() call for most
// use cases.
int32 bufferSize = 1024;
char buffer[bufferSize];
va_list arg;
va_start(arg, format);
int32 bytes = vsnprintf(buffer, bufferSize, format, arg);
va_end(arg);
va_list clonedArgs;
#if __GNUC__ == 2
__va_copy(clonedArgs, args);
#else
va_copy(clonedArgs, args);
#endif
int32 bytes = vsnprintf(buffer, bufferSize, format, clonedArgs);
va_end(clonedArgs);
if (bytes < 0)
return Truncate(0);
@ -444,11 +462,7 @@ BString::SetToFormat(const char* format, ...)
return *this;
}
va_list arg2;
va_start(arg2, format);
bytes = vsnprintf(LockBuffer(bytes), bytes + 1, format, arg2);
va_end(arg2);
bytes = vsnprintf(LockBuffer(bytes), bytes + 1, format, args);
if (bytes < 0)
bytes = 0;