Compare commits

...

3 Commits

Author SHA1 Message Date
dd358eca29 libc/libgen.cpp: Remove #include <luna.h>
This header was included for the NOT_IMPLEMENTED macro.

Now it is implemented.
2022-10-15 16:09:54 +02:00
116e7326a4 libc: Implement dirname() and basename() 2022-10-15 16:08:27 +02:00
5256166e7a libc: Fix strrchr 2022-10-15 16:06:41 +02:00
3 changed files with 49 additions and 8 deletions

View File

@ -6,8 +6,13 @@ extern "C"
{
#endif
char* basename(char*); // Not implemented.
char* dirname(char*); // Not implemented.
/* Returns the last component of a path. This function is allowed to modify the string passed to it, so it should
* probably be a copy of another string. */
char* basename(char* path);
/* Returns the parent directory of a path. This function is allowed to modify the string passed to it, so it should
* probably be a copy of another string. */
char* dirname(char* path);
#ifdef __cplusplus
}

View File

@ -1,15 +1,50 @@
#include <libgen.h>
#include <luna.h>
#include <string.h>
static char dot[] = ".";
extern "C"
{
char* basename(char*)
char* basename(char* path)
{
NOT_IMPLEMENTED("basename");
// 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*)
char* dirname(char* path)
{
NOT_IMPLEMENTED("dirname");
// 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

@ -136,8 +136,9 @@ extern "C"
char* strrchr(const char* str, int c)
{
const char* s = str + strlen(str);
while (s != str && *str != (char)c) str--;
while (s != str && *s != (char)c) s--;
if (s != str) return const_cast<char*>(s);
if (*s == (char)c) return const_cast<char*>(s);
return NULL;
}