Fix PathIterator for paths that don't end with /
This commit is contained in:
+15
-10
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
+14
-4
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
################################################################################
|
||||
|
||||
@@ -49,6 +49,13 @@ map<string, function<int()>> 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) {
|
||||
|
||||
Reference in New Issue
Block a user