LibC: Implement basename and dirname
This commit is contained in:
parent
f4c6afbdae
commit
cccb4e6d5e
|
@ -10,6 +10,7 @@ set(LIBC_SOURCES
|
||||||
ftw.cpp
|
ftw.cpp
|
||||||
grp.cpp
|
grp.cpp
|
||||||
inttypes.cpp
|
inttypes.cpp
|
||||||
|
libgen.cpp
|
||||||
locale.cpp
|
locale.cpp
|
||||||
malloc.cpp
|
malloc.cpp
|
||||||
math.cpp
|
math.cpp
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
char* basename(char* path)
|
||||||
|
{
|
||||||
|
static char buffer[PATH_MAX];
|
||||||
|
|
||||||
|
constexpr auto prep_string =
|
||||||
|
[](const char* str) -> char*
|
||||||
|
{
|
||||||
|
strcpy(buffer, str);
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (path == nullptr || path[0] == '\0')
|
||||||
|
return prep_string(".");
|
||||||
|
|
||||||
|
char* endp = path + strlen(path);
|
||||||
|
|
||||||
|
while (endp > path && endp[-1] == '/')
|
||||||
|
endp--;
|
||||||
|
if (endp == path)
|
||||||
|
return prep_string("/");
|
||||||
|
|
||||||
|
char* startp = endp;
|
||||||
|
while (startp > path && startp[-1] != '/')
|
||||||
|
startp--;
|
||||||
|
|
||||||
|
memcpy(buffer, startp, endp - startp);
|
||||||
|
buffer[endp - startp] = '\0';
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* dirname(char* path)
|
||||||
|
{
|
||||||
|
static char buffer[PATH_MAX];
|
||||||
|
|
||||||
|
constexpr auto prep_string =
|
||||||
|
[](const char* str) -> char*
|
||||||
|
{
|
||||||
|
strcpy(buffer, str);
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (path == nullptr || path[0] == '\0')
|
||||||
|
return prep_string(".");
|
||||||
|
|
||||||
|
char* endp = path + strlen(path);
|
||||||
|
|
||||||
|
while (endp > path && endp[-1] == '/')
|
||||||
|
endp--;
|
||||||
|
if (endp == path)
|
||||||
|
return prep_string("/");
|
||||||
|
|
||||||
|
while (endp > path && endp[-1] != '/')
|
||||||
|
endp--;
|
||||||
|
if (endp == path)
|
||||||
|
return prep_string(".");
|
||||||
|
|
||||||
|
while (endp > path && endp[-1] == '/')
|
||||||
|
endp--;
|
||||||
|
if (endp == path)
|
||||||
|
return prep_string("/");
|
||||||
|
|
||||||
|
memcpy(buffer, path, endp - path);
|
||||||
|
buffer[endp - path] = '\0';
|
||||||
|
return buffer;
|
||||||
|
}
|
Loading…
Reference in New Issue