Add helper_functions.cpp/hpp & unit tests

- add function which constructs a new std::string from a potentially not null
  terminated char *
- add unit tests
This commit is contained in:
Dan Čermák
2018-05-25 00:39:07 +02:00
parent 4713336c93
commit dd52b1a832
5 changed files with 107 additions and 0 deletions
+1
View File
@@ -17,6 +17,7 @@ set( LIBEXIV2_SRC
exif.cpp
futils.cpp
gifimage.cpp
helper_functions.cpp
http.cpp
image.cpp
ini.cpp
+41
View File
@@ -0,0 +1,41 @@
// ********************************************************* -*- C++ -*-
/*
* Copyright (C) 2004-2018 Exiv2 authors
*
* This program is part of the Exiv2 distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
*/
/*!
@file helper_functions.cpp
@brief A collection of helper functions
@author Dan Čermák (D4N)
<a href="mailto:dan.cermak@cgc-instruments.com">dan.cermak@cgc-instruments.com</a>
@date 25-May-18, D4N: created
*/
#include "helper_functions.hpp"
#include <algorithm>
std::string string_from_unterminated(const char* data, size_t data_length)
{
const char* termination = std::find(data, data + data_length, 0);
// if find returned the end iterator => no \0 found
const size_t string_length = termination == data + data_length ? data_length : termination - data;
return std::string(data, string_length);
}
+43
View File
@@ -0,0 +1,43 @@
// ********************************************************* -*- C++ -*-
/*
* Copyright (C) 2004-2018 Exiv2 authors
*
* This program is part of the Exiv2 distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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, write to the Free Software
* Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
*/
/*!
@file helper_functions.hpp
@brief A collection of helper functions
@author Dan Čermák (D4N)
<a href="mailto:dan.cermak@cgc-instruments.com">dan.cermak@cgc-instruments.com</a>
@date 25-May-18, D4N: created
*/
#ifndef HELPER_FUNCTIONS_HPP
#define HELPER_FUNCTIONS_HPP
#include <string>
/*!
@brief Convert a (potentially not null terminated) array into a
std::string.
Convert a C style string that may or may not be null terminated safely
into a std::string. The string's termination is either set at the first \0
or after data_length characters.
*/
std::string string_from_unterminated(const char* data, size_t data_length);
#endif // HELPER_FUNCTIONS_HPP
+1
View File
@@ -8,6 +8,7 @@ add_executable(unit_tests mainTestRunner.cpp
test_XmpKey.cpp
test_DateValue.cpp
test_cr2header_int.cpp
test_helper_functions.cpp
)
#TODO Use GTest::GTest once we upgrade the minimum CMake version required
+21
View File
@@ -0,0 +1,21 @@
#include "helper_functions.hpp"
#include "gtestwrapper.h"
TEST(string_from_unterminated, terminatedArray)
{
const char data[5] = {'a', 'b', 'c', 0, 'd'};
const std::string res = string_from_unterminated(data, 5);
ASSERT_EQ(res.size(), 3);
ASSERT_STREQ(res.c_str(), "abc");
}
TEST(string_from_unterminated, unterminatedArray)
{
const char data[4] = {'a', 'b', 'c', 'd'};
const std::string res = string_from_unterminated(data, 4);
ASSERT_EQ(res.size(), 4);
ASSERT_STREQ(res.c_str(), "abcd");
}