diff options
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/file.c | 43 | ||||
-rw-r--r-- | src/utils/file.h | 4 | ||||
-rw-r--r-- | src/utils/string.c | 7 | ||||
-rw-r--r-- | src/utils/string.h | 2 |
4 files changed, 55 insertions, 1 deletions
diff --git a/src/utils/file.c b/src/utils/file.c index 714dc2c..340875c 100644 --- a/src/utils/file.c +++ b/src/utils/file.c @@ -80,3 +80,46 @@ size_t getFileIndex(const char *filePath) { return fileCodes_length; } + +char *joinToPathOf(const char *original, const char *file) { + size_t result_size = 0; + for (size_t i = 0; original[i] != '\0'; ++i) { + if (original[i] == '/') { + result_size = i; + } + } + char *result = + a404m_malloc((result_size + 1 + strlen(file) + 1) * sizeof(*result)); + + strncpy(result, original, result_size); + result[result_size++] = '/'; + + bool startOfDirName = true; + for (size_t i = 0; file[i] != '\0'; ++i) { + if (startOfDirName && file[i + 1] == '.') { + if (file[i + 2] == '/') { + i += 2; + continue; + } else if (file[i + 2] == '.' && file[i + 3] == '/') { + bool found = false; + for (size_t j = i - 2; j != -1ULL; --j) { + if (result[j] == '/') { + result_size = j; + found = true; + break; + } + } + if (!found) { + result_size = 0; + } + continue; + } + } + result[result_size++] = file[i]; + } + + result[result_size++] = '\0'; + result = a404m_realloc(result, result_size); + + return result; +} diff --git a/src/utils/file.h b/src/utils/file.h index f0b0d8c..7b0dc37 100644 --- a/src/utils/file.h +++ b/src/utils/file.h @@ -10,7 +10,9 @@ extern size_t fileCodes_length; void fileInit(); void fileDelete(); -void filePush(const char *filePath,char *code); +void filePush(const char *filePath, char *code); char *readWholeFile(const char *filePath); size_t getFileIndex(const char *filePath); + +char *joinToPathOf(const char *original, const char *file); diff --git a/src/utils/string.c b/src/utils/string.c index 16e9f9b..55d2c3e 100644 --- a/src/utils/string.c +++ b/src/utils/string.c @@ -85,3 +85,10 @@ char *u64ToString(u64 value) { return a404m_realloc(str, (i + 1) * sizeof(*str)); } + +char *strClone(const char *str) { + const size_t str_length = strlen(str) + 1; + char *result = a404m_malloc(str_length * sizeof(*result)); + strncpy(result, str, str_length); + return result; +} diff --git a/src/utils/string.h b/src/utils/string.h index 54130e5..a5a0319 100644 --- a/src/utils/string.h +++ b/src/utils/string.h @@ -10,3 +10,5 @@ size_t searchInStringArray(const char *array[], size_t array_size, u64 decimalToU64(char *str_begin, char *str_end, bool *success); f128 numberToFloat(char *str_begin, char *str_end, bool *success); char* u64ToString(u64 value); + +char *strClone(const char *str); |