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 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;
+2 -2
View File
@@ -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
View File
@@ -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 -2
View File
@@ -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);
+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\\ ==\\ resize" StrOpsTest "resize == resize")
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);
}
},
{
"ox_strchr 0",
[]() {
auto testStr = "asdf";
return !(ox_strchr(testStr, 0, 4) == &testStr[4]);
}
},
};
int main(int argc, const char **args) {