This commit is contained in:
parent
d00ca0d3ed
commit
df10544e84
23
libc/include/libgen.h
Normal file
23
libc/include/libgen.h
Normal 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
|
@ -1,4 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
char* basename(char*);
|
extern "C"
|
||||||
char* dirname(char*);
|
{
|
||||||
|
char* basename(char*);
|
||||||
|
char* dirname(char*);
|
||||||
|
}
|
||||||
|
@ -3,45 +3,48 @@
|
|||||||
|
|
||||||
static char dot[] = ".";
|
static char dot[] = ".";
|
||||||
|
|
||||||
char* basename(char* path)
|
extern "C"
|
||||||
{
|
{
|
||||||
// If path is NULL, or the string's length is 0, return .
|
char* basename(char* path)
|
||||||
if (!path) return dot;
|
{
|
||||||
usize len = strlen(path);
|
// If path is NULL, or the string's length is 0, return .
|
||||||
if (!len) return dot;
|
if (!path) return dot;
|
||||||
|
usize len = strlen(path);
|
||||||
|
if (!len) return dot;
|
||||||
|
|
||||||
// Strip trailing slashes.
|
// Strip trailing slashes.
|
||||||
char* it = path + len - 1;
|
char* it = path + len - 1;
|
||||||
while (*it == '/' && it != path) { it--; }
|
while (*it == '/' && it != path) { it--; }
|
||||||
*(it + 1) = 0;
|
*(it + 1) = 0;
|
||||||
if (it == path) return path;
|
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
|
// Return path from the first character if there are no more slashes, or from the first character after the last
|
||||||
// slash.
|
// slash.
|
||||||
char* beg = strrchr(path, '/');
|
char* beg = strrchr(path, '/');
|
||||||
if (!beg) return path;
|
if (!beg) return path;
|
||||||
return beg + 1;
|
return beg + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* dirname(char* path)
|
char* dirname(char* path)
|
||||||
{
|
{
|
||||||
// If path is NULL, or the string's length is 0, return .
|
// If path is NULL, or the string's length is 0, return .
|
||||||
if (!path) return dot;
|
if (!path) return dot;
|
||||||
usize len = strlen(path);
|
usize len = strlen(path);
|
||||||
if (!len) return dot;
|
if (!len) return dot;
|
||||||
|
|
||||||
// Strip trailing slashes.
|
// Strip trailing slashes.
|
||||||
char* it = path + len - 1;
|
char* it = path + len - 1;
|
||||||
while (*it == '/' && it != path) { it--; }
|
while (*it == '/' && it != path) { it--; }
|
||||||
*(char*)(it + 1) = 0;
|
*(char*)(it + 1) = 0;
|
||||||
if (it == path) return path;
|
if (it == path) return path;
|
||||||
|
|
||||||
// Search for the last slash. If there is none, return .
|
// Search for the last slash. If there is none, return .
|
||||||
// Otherwise, we end the string there and return.
|
// Otherwise, we end the string there and return.
|
||||||
char* end = strrchr(path, '/');
|
char* end = strrchr(path, '/');
|
||||||
if (!end) return dot;
|
if (!end) return dot;
|
||||||
if (end != path) *end = 0;
|
if (end != path) *end = 0;
|
||||||
else
|
else
|
||||||
*(end + 1) = 0;
|
*(end + 1) = 0;
|
||||||
return path;
|
return path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user