123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #include "ceres/stringprintf.h"
- #include <cerrno>
- #include <cstdarg>
- #include <cstdio>
- #include <string>
- #include <vector>
- #include "ceres/internal/export.h"
- namespace ceres::internal {
- void StringAppendV(std::string* dst, const char* format, va_list ap) {
-
- char space[1024];
-
-
-
- va_list backup_ap;
- va_copy(backup_ap, ap);
- int result = vsnprintf(space, sizeof(space), format, backup_ap);
- va_end(backup_ap);
- if (result < sizeof(space)) {
- if (result >= 0) {
-
- dst->append(space, result);
- return;
- }
- #if defined(_MSC_VER)
-
-
- va_copy(backup_ap, ap);
- result = vsnprintf(nullptr, 0, format, backup_ap);
- va_end(backup_ap);
- #endif
- if (result < 0) {
-
- return;
- }
- }
-
-
- int length = result + 1;
- char* buf = new char[length];
-
- va_copy(backup_ap, ap);
- result = vsnprintf(buf, length, format, backup_ap);
- va_end(backup_ap);
- if (result >= 0 && result < length) {
-
- dst->append(buf, result);
- }
- delete[] buf;
- }
- std::string StringPrintf(const char* format, ...) {
- va_list ap;
- va_start(ap, format);
- std::string result;
- StringAppendV(&result, format, ap);
- va_end(ap);
- return result;
- }
- const std::string& SStringPrintf(std::string* dst, const char* format, ...) {
- va_list ap;
- va_start(ap, format);
- dst->clear();
- StringAppendV(dst, format, ap);
- va_end(ap);
- return *dst;
- }
- void StringAppendF(std::string* dst, const char* format, ...) {
- va_list ap;
- va_start(ap, format);
- StringAppendV(dst, format, ap);
- va_end(ap);
- }
- }
|