libc: Add libgen.h
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
apio 2023-03-28 19:47:47 +02:00
parent d00ca0d3ed
commit df10544e84
Signed by: apio
GPG Key ID: B8A7D06E42258954
3 changed files with 69 additions and 40 deletions

23
libc/include/libgen.h Normal file
View File

@ -0,0 +1,23 @@
/* libgen.h: Path parsing functions. */
#ifndef _LIBGEN_H
#define _LIBGEN_H
// These functions are implemented in libluna (CPath.h)
#ifdef __cplusplus
extern "C"
{
#endif
/* Returns path's base name. Will modify path. */
char* basename(char* path);
/* Returns path's parent directory. Will modify path. */
char* dirname(char* path);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,4 +1,7 @@
#pragma once
char* basename(char*);
char* dirname(char*);
extern "C"
{
char* basename(char*);
char* dirname(char*);
}

View File

@ -3,45 +3,48 @@
static char dot[] = ".";
char* basename(char* path)
extern "C"
{
// If path is NULL, or the string's length is 0, return .
if (!path) return dot;
usize len = strlen(path);
if (!len) return dot;
char* basename(char* path)
{
// If path is NULL, or the string's length is 0, return .
if (!path) return dot;
usize 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;
// 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;
usize 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;
// 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;
usize 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;
}
}