COMMON: Add vformat() function (Common::String analog to vsprintf)
This commit is contained in:
parent
0881f54a06
commit
e792adb1b8
3 changed files with 40 additions and 6 deletions
|
@ -302,6 +302,19 @@
|
|||
#define MAXPATHLEN 256
|
||||
#endif
|
||||
|
||||
#ifndef scumm_va_copy
|
||||
#if defined(va_copy)
|
||||
#define scumm_va_copy va_copy
|
||||
#elif defined(__va_copy)
|
||||
#define scumm_va_copy __va_copy
|
||||
#elif defined(_MSC_VER)
|
||||
#define scumm_va_copy(dst, src) ((dst) = (src))
|
||||
#else
|
||||
#error scumm_va_copy undefined for this port
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Typedef our system types unless they have already been defined by config.h,
|
||||
|
|
|
@ -25,8 +25,6 @@
|
|||
#include "common/str.h"
|
||||
#include "common/util.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
namespace Common {
|
||||
|
||||
MemoryPool *g_refCountPool = 0; // FIXME: This is never freed right now
|
||||
|
@ -429,10 +427,22 @@ uint String::hash() const {
|
|||
// static
|
||||
String String::format(const char *fmt, ...) {
|
||||
String output;
|
||||
assert(output.isStorageIntern());
|
||||
|
||||
va_list va;
|
||||
va_start(va, fmt);
|
||||
output = String::vformat(fmt, va);
|
||||
va_end(va);
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
// static
|
||||
String String::vformat(const char *fmt, va_list args) {
|
||||
String output;
|
||||
assert(output.isStorageIntern());
|
||||
|
||||
va_list va;
|
||||
scumm_va_copy(va, args);
|
||||
int len = vsnprintf(output._str, _builtinCapacity, fmt, va);
|
||||
va_end(va);
|
||||
|
||||
|
@ -457,7 +467,7 @@ String String::format(const char *fmt, ...) {
|
|||
assert(!output.isStorageIntern());
|
||||
size = output._extern._capacity;
|
||||
|
||||
va_start(va, fmt);
|
||||
scumm_va_copy(va, args);
|
||||
len = vsnprintf(output._str, size, fmt, va);
|
||||
va_end(va);
|
||||
} while (len == -1 || len >= size - 1);
|
||||
|
@ -468,7 +478,7 @@ String String::format(const char *fmt, ...) {
|
|||
} else {
|
||||
// vsnprintf didn't have enough space, so grow buffer
|
||||
output.ensureCapacity(len, false);
|
||||
va_start(va, fmt);
|
||||
scumm_va_copy(va, args);
|
||||
int len2 = vsnprintf(output._str, len+1, fmt, va);
|
||||
va_end(va);
|
||||
assert(len == len2);
|
||||
|
|
13
common/str.h
13
common/str.h
|
@ -24,6 +24,8 @@
|
|||
|
||||
#include "common/scummsys.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
namespace Common {
|
||||
|
||||
/**
|
||||
|
@ -213,10 +215,19 @@ public:
|
|||
uint hash() const;
|
||||
|
||||
/**
|
||||
* Printf-like function. Returns a formatted String.
|
||||
* Print formatted data into a String object. Similar to sprintf,
|
||||
* except that it stores the result in (variably sized) String
|
||||
* instead of a fixed size buffer.
|
||||
*/
|
||||
static Common::String format(const char *fmt, ...) GCC_PRINTF(1,2);
|
||||
|
||||
/**
|
||||
* Print formatted data into a String object. Similar to vsprintf,
|
||||
* except that it stores the result in (variably sized) String
|
||||
* instead of a fixed size buffer.
|
||||
*/
|
||||
static Common::String vformat(const char *fmt, va_list args);
|
||||
|
||||
public:
|
||||
typedef char * iterator;
|
||||
typedef const char * const_iterator;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue