From e34e39a41c193dc6cac5fbd943c76badbe82af26 Mon Sep 17 00:00:00 2001 From: Nick Bolton Date: Thu, 20 Mar 2014 13:34:21 +0000 Subject: [PATCH] fixed XArchEvalUnix using wrong memeber, string_format using c++11 (which we're not ready for yet), code style (indentation and new lines) --- src/lib/arch/unix/XArchUnix.cpp | 4 +- src/lib/base/String.cpp | 67 ++++++++++++------------- src/test/unittests/base/StringTests.cpp | 42 ++++++++++++++++ 3 files changed, 76 insertions(+), 37 deletions(-) create mode 100644 src/test/unittests/base/StringTests.cpp diff --git a/src/lib/arch/unix/XArchUnix.cpp b/src/lib/arch/unix/XArchUnix.cpp index 3cd9dffd..fd3a162b 100644 --- a/src/lib/arch/unix/XArchUnix.cpp +++ b/src/lib/arch/unix/XArchUnix.cpp @@ -25,8 +25,8 @@ // std::string -XArchEvalUnix::eval() const throw() +XArchEvalUnix::eval() const { // FIXME -- not thread safe - return strerror(m_errno); + return strerror(m_error); } diff --git a/src/lib/base/String.cpp b/src/lib/base/String.cpp index 8f23a2ae..e9f90a0d 100644 --- a/src/lib/base/String.cpp +++ b/src/lib/base/String.cpp @@ -17,7 +17,7 @@ #include "base/String.h" -#include +#include #include void @@ -26,40 +26,37 @@ find_replace_all( const CString& find, const CString& replace) { - size_t pos = 0; - while ((pos = subject.find(find, pos)) != CString::npos) { - subject.replace(pos, find.length(), replace); - pos += replace.length(); - } + size_t pos = 0; + while ((pos = subject.find(find, pos)) != CString::npos) { + subject.replace(pos, find.length(), replace); + pos += replace.length(); + } } -CString -string_format(const CString format, ...) -{ - // reserve 2 times as much as the length of the format - size_t final, n = format.size() * 2; - - CString str; - std::unique_ptr formatted; - va_list ap; - - while (true) { - - // wrap the plain char array in unique_ptr - formatted.reset(new char[n]); - - strcpy(&formatted[0], format.c_str()); - va_start(ap, format); - final = vsnprintf(&formatted[0], n, format.c_str(), ap); - va_end(ap); - - if (final < 0 || final >= n) { - n += abs(static_cast(final - n + 1)); - } - else { - break; - } - } - - return CString(formatted.get()); +CString +string_format(const std::string fmt, ...) +{ + int size = 100; + std::string str; + va_list ap; + + while (true) { + str.resize(size); + va_start(ap, fmt); + int n = vsnprintf((char *)str.c_str(), size, fmt.c_str(), ap); + va_end(ap); + + if (n > -1 && n < size) { + str.resize(n); + return str; + } + if (n > -1) { + size = n + 1; + } + else { + size *= 2; + } + } + + return str; } diff --git a/src/test/unittests/base/StringTests.cpp b/src/test/unittests/base/StringTests.cpp new file mode 100644 index 00000000..a9e87a73 --- /dev/null +++ b/src/test/unittests/base/StringTests.cpp @@ -0,0 +1,42 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2014 Bolton Software Ltd. + * + * This package is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * found in the file COPYING that should have accompanied this file. + * + * This package is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "base/String.h" + +#include "test/global/gtest.h" + +TEST(CStringTests, find_replace_all) +{ + CString subject = "foobar"; + CString find = "bar"; + CString replace = "baz"; + + find_replace_all(subject, find, replace); + + EXPECT_EQ("foobaz", subject); +} + +TEST(CStringTests, string_format) +{ + CString format = "%s=%d"; + const char* arg1 = "answer"; + int arg2 = 42; + + CString result = string_format(format, arg1, arg2); + + EXPECT_EQ("answer=42", result); +}