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 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;
|
||||||
|
|||||||
@@ -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
@@ -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,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);
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user