Last active
May 3, 2016 04:51
-
-
Save rangerz/1d63892fad05ba58cfe1 to your computer and use it in GitHub Desktop.
[C++] StringPrintf
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "stringprintf.h" | |
static void StringAppendV(string* dst, const char* format, va_list ap) { | |
// First try with a small fixed size buffer | |
char space[1024]; | |
// It's possible for methods that use a va_list to invalidate | |
// the data in it upon use. The fix is to make a copy | |
// of the structure before using it and use that copy instead. | |
va_list backup_ap; | |
va_copy(backup_ap, ap); | |
int result = vsnprintf(space, sizeof(space), format, backup_ap); | |
va_end(backup_ap); | |
if ((result >= 0) && (result < sizeof(space))) { | |
// It fit | |
dst->append(space, result); | |
return; | |
} | |
// Repeatedly increase buffer size until it fits | |
int length = sizeof(space); | |
while (true) { | |
if (result < 0) { | |
// Older behavior: just try doubling the buffer size | |
length *= 2; | |
} else { | |
// We need exactly "result+1" characters | |
length = result+1; | |
} | |
char* buf = new char[length]; | |
// Restore the va_list before we use it again | |
va_copy(backup_ap, ap); | |
result = vsnprintf(buf, length, format, backup_ap); | |
va_end(backup_ap); | |
if ((result >= 0) && (result < length)) { | |
// It fit | |
dst->append(buf, result); | |
delete[] buf; | |
return; | |
} | |
delete[] buf; | |
} | |
} | |
string StringPrintf(const char* format, ...) { | |
va_list ap; | |
va_start(ap, format); | |
string result; | |
StringAppendV(&result, format, ap); | |
va_end(ap); | |
return result; | |
} | |
void SStringPrintf(string* dst, const char* format, ...) { | |
va_list ap; | |
va_start(ap, format); | |
dst->clear(); | |
StringAppendV(dst, format, ap); | |
va_end(ap); | |
} | |
void SStringAppendF(string* dst, const char* format, ...) { | |
va_list ap; | |
va_start(ap, format); | |
StringAppendV(dst, format, ap); | |
va_end(ap); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef _STRINGPRINTF_H__ | |
#define _STRINGPRINTF_H__ | |
extern string StringPrintf(const char* format, ...); | |
extern void SStringPrintf(string* dst, const char* format, ...); | |
extern void SStringAppendF(string* dst, const char* format, ...); | |
#endif /* _STRINGPRINTF_H__ */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment