| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 | // Ceres Solver - A fast non-linear least squares minimizer// Copyright 2015 Google Inc. All rights reserved.// http://ceres-solver.org///// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are met://// * Redistributions of source code must retain the above copyright notice,//   this list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above copyright notice,//   this list of conditions and the following disclaimer in the documentation//   and/or other materials provided with the distribution.// * Neither the name of Google Inc. nor the names of its contributors may be//   used to endorse or promote products derived from this software without//   specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE// POSSIBILITY OF SUCH DAMAGE.//// Author: Sanjay Ghemawat#include "ceres/stringprintf.h"#include <cerrno>#include <cstdarg>  // For va_list and related operations#include <cstdio>   // MSVC requires this for _vsnprintf#include <string>#include <vector>#include "ceres/internal/port.h"namespace ceres {namespace internal {using std::string;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 < sizeof(space)) {    if (result >= 0) {      // Normal case -- everything fit.      dst->append(space, result);      return;    }#if defined (_MSC_VER)    // Error or MSVC running out of space.  MSVC 8.0 and higher    // can be asked about space needed with the special idiom below:    va_copy(backup_ap, ap);    result = vsnprintf(NULL, 0, format, backup_ap);    va_end(backup_ap);#endif    if (result < 0) {      // Just an error.      return;    }  }  // Increase the buffer size to the size requested by vsnprintf,  // plus one for the closing \0.  int 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;}string StringPrintf(const char* format, ...) {  va_list ap;  va_start(ap, format);  string result;  StringAppendV(&result, format, ap);  va_end(ap);  return result;}const string& SStringPrintf(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(string* dst, const char* format, ...) {  va_list ap;  va_start(ap, format);  StringAppendV(dst, format, ap);  va_end(ap);}}  // namespace internal}  // namespace ceres
 |