From 8c0a57f0c2368e0bb2021c064140f7f932b9706d Mon Sep 17 00:00:00 2001 From: apio Date: Sun, 16 Oct 2022 14:36:25 +0200 Subject: [PATCH] Kernel: Copy strrchr, dirname and basename over from libc --- kernel/include/std/libgen.h | 4 ++++ kernel/include/std/string.h | 3 ++- kernel/src/std/libgen.cpp | 47 +++++++++++++++++++++++++++++++++++++ kernel/src/std/string.cpp | 8 +++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 kernel/include/std/libgen.h create mode 100644 kernel/src/std/libgen.cpp diff --git a/kernel/include/std/libgen.h b/kernel/include/std/libgen.h new file mode 100644 index 00000000..d9a7ec48 --- /dev/null +++ b/kernel/include/std/libgen.h @@ -0,0 +1,4 @@ +#pragma once + +char* basename(char* path); +char* dirname(char* path); \ No newline at end of file diff --git a/kernel/include/std/string.h b/kernel/include/std/string.h index ac1a2459..6a2543b3 100644 --- a/kernel/include/std/string.h +++ b/kernel/include/std/string.h @@ -19,4 +19,5 @@ void* memset(void* dest, int c, size_t n); int memcmp(const void* a, const void* b, size_t n); void* memmove(void* dest, void* src, size_t n); -char* strdup(const char* src); \ No newline at end of file +char* strdup(const char* src); +char* strrchr(const char* str, int c); \ No newline at end of file diff --git a/kernel/src/std/libgen.cpp b/kernel/src/std/libgen.cpp new file mode 100644 index 00000000..908aee15 --- /dev/null +++ b/kernel/src/std/libgen.cpp @@ -0,0 +1,47 @@ +#include "std/libgen.h" +#include "std/string.h" + +static char dot[] = "."; + +char* basename(char* path) +{ + // If path is NULL, or the string's length is 0, return . + if (!path) return dot; + size_t len = strlen(path); + if (!len) return dot; + + // Strip trailing slashes. + char* it = path + len - 1; + while (*it == '/' && it != path) { it--; } + *(it + 1) = 0; + if (it == path) return path; + + // Return path from the first character if there are no more slashes, or from the first character after the last + // slash. + char* beg = strrchr(path, '/'); + if (!beg) return path; + return beg + 1; +} + +char* dirname(char* path) +{ + // If path is NULL, or the string's length is 0, return . + if (!path) return dot; + size_t len = strlen(path); + if (!len) return dot; + + // Strip trailing slashes. + char* it = path + len - 1; + while (*it == '/' && it != path) { it--; } + *(char*)(it + 1) = 0; + if (it == path) return path; + + // Search for the last slash. If there is none, return . + // Otherwise, we end the string there and return. + char* end = strrchr(path, '/'); + if (!end) return dot; + if (end != path) *end = 0; + else + *(end + 1) = 0; + return path; +} \ No newline at end of file diff --git a/kernel/src/std/string.cpp b/kernel/src/std/string.cpp index ef5481fd..79fe1d76 100644 --- a/kernel/src/std/string.cpp +++ b/kernel/src/std/string.cpp @@ -148,4 +148,12 @@ char* strdup(const char* src) char* duplicated = (char*)kmalloc(length + 1); memcpy(duplicated, src, length + 1); return duplicated; +} + +char* strrchr(const char* str, int c) +{ + const char* s = str + strlen(str); + while (s != str && *s != (char)c) s--; + if (*s == (char)c) return const_cast(s); + return NULL; } \ No newline at end of file