Fix PathIterator for paths that don't end with /

This commit is contained in:
2017-04-22 07:11:48 -05:00
parent d48183218c
commit f9634a2f3a
6 changed files with 44 additions and 18 deletions
+15 -10
View File
@@ -19,17 +19,22 @@ PathIterator::PathIterator(const char *path, size_t maxSize) {
} }
int PathIterator::next(char *pathOut, size_t pathOutSize) { int PathIterator::next(char *pathOut, size_t pathOutSize) {
int size = 0; size_t size = 0;
const char *substr = ox_strchar(m_path + m_iterator, '/', m_maxSize - m_iterator); const char *substr = ox_strchr(m_path + m_iterator, '/', m_maxSize - m_iterator);
m_iterator = (substr - m_path) + 1; if (substr) {
if (substr && m_iterator < m_maxSize) { m_iterator = (substr - m_path) + 1;
int start = m_iterator; if (m_iterator < m_maxSize) {
int end = (ox_strchar(m_path + start, '/', m_maxSize - start) - m_path); size_t start = m_iterator;
if (end < 0) { // end is at the next /
end = m_maxSize; 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 pathOut[size] = 0; // end with null terminator
return 0; return 0;
+2 -2
View File
@@ -16,8 +16,8 @@ namespace fs {
class PathIterator { class PathIterator {
private: private:
const char *m_path = nullptr; const char *m_path = nullptr;
int m_iterator = 0; size_t m_iterator = 0;
int m_maxSize = 0; size_t m_maxSize = 0;
public: public:
PathIterator(const char *path, size_t maxSize); PathIterator(const char *path, size_t maxSize);
+14 -4
View File
@@ -30,19 +30,29 @@ int ox_strlen(const char *str1) {
return len; return len;
} }
const char *ox_strchar(const char *str, int character, size_t maxLen) { int ox_strlen(char *str1) {
for (size_t i = 0; i < maxLen && str[i]; i++) { 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) { if (str[i] == character) {
return &str[i]; return &str[i];
} else if (str[i] == 0) {
return nullptr;
} }
} }
return nullptr; return nullptr;
} }
char *ox_strchar(char *str, int character, size_t maxLen) { char *ox_strchr(char *str, int character, size_t maxLen) {
for (size_t i = 0; i < maxLen && str[i]; i++) { for (size_t i = 0; i < maxLen; i++) {
if (str[i] == character) { if (str[i] == character) {
return &str[i]; return &str[i];
} else if (str[i] == 0) {
return nullptr;
} }
} }
return nullptr; return nullptr;
+5 -2
View File
@@ -5,6 +5,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
#pragma once #pragma once
#include "types.hpp" #include "types.hpp"
@@ -13,8 +14,10 @@ int ox_strcmp(const char *str1, const char *str2);
int ox_strlen(const char *str1); 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); int ox_atoi(const char *str);
+1
View File
@@ -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\\ !=\\ read" StrOpsTest "resize > read")
add_test("Test\\ ox_strcmp\\ resize\\ ==\\ resize" StrOpsTest "resize == resize") add_test("Test\\ ox_strcmp\\ resize\\ ==\\ resize" StrOpsTest "resize == resize")
add_test("Test\\ ox_strcmp\\ resize\\ ==\\ resize" StrOpsTest " == ") add_test("Test\\ ox_strcmp\\ resize\\ ==\\ resize" StrOpsTest " == ")
add_test("Test\\ ox_strchr\\ 0" StrOpsTest "ox_strchr 0")
################################################################################ ################################################################################
+7
View File
@@ -49,6 +49,13 @@ map<string, function<int()>> tests = {
return !(ox_strcmp("", "") == 0); 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) { int main(int argc, const char **args) {