Kernel: Copy strrchr, dirname and basename over from libc

This commit is contained in:
apio 2022-10-16 14:36:25 +02:00
parent 1624f0360d
commit 8c0a57f0c2
4 changed files with 61 additions and 1 deletions

View File

@ -0,0 +1,4 @@
#pragma once
char* basename(char* path);
char* dirname(char* path);

View File

@ -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);
char* strdup(const char* src);
char* strrchr(const char* str, int c);

47
kernel/src/std/libgen.cpp Normal file
View File

@ -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;
}

View File

@ -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<char*>(s);
return NULL;
}