From f9634a2f3a4cc0dc76e2eea96c9311e551346bd1 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sat, 22 Apr 2017 07:11:48 -0500 Subject: [PATCH] Fix PathIterator for paths that don't end with / --- src/ox/fs/pathiterator.cpp | 25 +++++++++++++++---------- src/ox/fs/pathiterator.hpp | 4 ++-- src/ox/std/strops.cpp | 18 ++++++++++++++---- src/ox/std/strops.hpp | 7 +++++-- src/ox/std/test/CMakeLists.txt | 1 + src/ox/std/test/strops_test.cpp | 7 +++++++ 6 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/ox/fs/pathiterator.cpp b/src/ox/fs/pathiterator.cpp index a667a1098..17b7eca8d 100644 --- a/src/ox/fs/pathiterator.cpp +++ b/src/ox/fs/pathiterator.cpp @@ -19,17 +19,22 @@ PathIterator::PathIterator(const char *path, size_t maxSize) { } int PathIterator::next(char *pathOut, size_t pathOutSize) { - int size = 0; - const char *substr = ox_strchar(m_path + m_iterator, '/', m_maxSize - m_iterator); - m_iterator = (substr - m_path) + 1; - if (substr && m_iterator < m_maxSize) { - int start = m_iterator; - int end = (ox_strchar(m_path + start, '/', m_maxSize - start) - m_path); - if (end < 0) { - end = m_maxSize; + size_t size = 0; + const char *substr = ox_strchr(m_path + m_iterator, '/', m_maxSize - m_iterator); + if (substr) { + m_iterator = (substr - m_path) + 1; + if (m_iterator < m_maxSize) { + size_t start = m_iterator; + // end is at the next / + substr = ox_strchr(&m_path[start], '/', m_maxSize - start); + // correct end if it is invalid, which happens if there is no next / + if (!substr) { + substr = ox_strchr(&m_path[start], 0, m_maxSize - start); + } + size_t end = substr - m_path; + size = end - start; + ox_memcpy(pathOut, &m_path[start], size); } - size = end - start; - ox_memcpy(pathOut, &m_path[start], size); } pathOut[size] = 0; // end with null terminator return 0; diff --git a/src/ox/fs/pathiterator.hpp b/src/ox/fs/pathiterator.hpp index 85a9ae939..85de80c89 100644 --- a/src/ox/fs/pathiterator.hpp +++ b/src/ox/fs/pathiterator.hpp @@ -16,8 +16,8 @@ namespace fs { class PathIterator { private: const char *m_path = nullptr; - int m_iterator = 0; - int m_maxSize = 0; + size_t m_iterator = 0; + size_t m_maxSize = 0; public: PathIterator(const char *path, size_t maxSize); diff --git a/src/ox/std/strops.cpp b/src/ox/std/strops.cpp index f82984037..52b244ce6 100644 --- a/src/ox/std/strops.cpp +++ b/src/ox/std/strops.cpp @@ -30,19 +30,29 @@ int ox_strlen(const char *str1) { return len; } -const char *ox_strchar(const char *str, int character, size_t maxLen) { - for (size_t i = 0; i < maxLen && str[i]; i++) { +int ox_strlen(char *str1) { + int len; + for (len = 0; str1[len]; len++); + return len; +} + +const char *ox_strchr(const char *str, int character, size_t maxLen) { + for (size_t i = 0; i <= maxLen; i++) { if (str[i] == character) { return &str[i]; + } else if (str[i] == 0) { + return nullptr; } } return nullptr; } -char *ox_strchar(char *str, int character, size_t maxLen) { - for (size_t i = 0; i < maxLen && str[i]; i++) { +char *ox_strchr(char *str, int character, size_t maxLen) { + for (size_t i = 0; i < maxLen; i++) { if (str[i] == character) { return &str[i]; + } else if (str[i] == 0) { + return nullptr; } } return nullptr; diff --git a/src/ox/std/strops.hpp b/src/ox/std/strops.hpp index efea25c4f..80e574398 100644 --- a/src/ox/std/strops.hpp +++ b/src/ox/std/strops.hpp @@ -5,6 +5,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + #pragma once #include "types.hpp" @@ -13,8 +14,10 @@ int ox_strcmp(const char *str1, const char *str2); int ox_strlen(const char *str1); -const char *ox_strchar(const char *str, int character, size_t maxLen = 0xFFFFFFFF); +int ox_strlen(char *str1); -char *ox_strchar(char *str, int character, size_t maxLen = 0xFFFFFFFF); +const char *ox_strchr(const char *str, int character, size_t maxLen = 0xFFFFFFFF); + +char *ox_strchr(char *str, int character, size_t maxLen = 0xFFFFFFFF); int ox_atoi(const char *str); diff --git a/src/ox/std/test/CMakeLists.txt b/src/ox/std/test/CMakeLists.txt index 8926e2528..3bf8f2bf1 100644 --- a/src/ox/std/test/CMakeLists.txt +++ b/src/ox/std/test/CMakeLists.txt @@ -29,6 +29,7 @@ add_test("Test\\ ox_strcmp\\ read\\ !=\\ resize" StrOpsTest "read < resize") add_test("Test\\ ox_strcmp\\ resize\\ !=\\ read" StrOpsTest "resize > read") add_test("Test\\ ox_strcmp\\ resize\\ ==\\ resize" StrOpsTest "resize == resize") add_test("Test\\ ox_strcmp\\ resize\\ ==\\ resize" StrOpsTest " == ") +add_test("Test\\ ox_strchr\\ 0" StrOpsTest "ox_strchr 0") ################################################################################ diff --git a/src/ox/std/test/strops_test.cpp b/src/ox/std/test/strops_test.cpp index 770c291a5..963b0f486 100644 --- a/src/ox/std/test/strops_test.cpp +++ b/src/ox/std/test/strops_test.cpp @@ -49,6 +49,13 @@ map> tests = { return !(ox_strcmp("", "") == 0); } }, + { + "ox_strchr 0", + []() { + auto testStr = "asdf"; + return !(ox_strchr(testStr, 0, 4) == &testStr[4]); + } + }, }; int main(int argc, const char **args) {