aboutsummaryrefslogtreecommitdiff
path: root/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib')
-rw-r--r--stdlib/files.c13
-rw-r--r--stdlib/files.h2
2 files changed, 15 insertions, 0 deletions
diff --git a/stdlib/files.c b/stdlib/files.c
index 4a4220e7..cf777689 100644
--- a/stdlib/files.c
+++ b/stdlib/files.c
@@ -75,6 +75,19 @@ public char *file_base_name(const char *path)
char *buf = GC_MALLOC_ATOMIC(len+1);
strncpy(buf, path, len);
buf[len] = '\0';
+ return buf;
+}
+
+public char *file_base_id(const char *path)
+{
+ const char *slash = strrchr(path, '/');
+ if (slash) path = slash + 1;
+ assert(!isdigit(*path));
+ const char *end = strchrnul(path, '.');
+ size_t len = (size_t)(end - path);
+ char *buf = GC_MALLOC_ATOMIC(len+1);
+ strncpy(buf, path, len);
+ buf[len] = '\0';
for (char *p = buf; *p; p++) {
if (!isalnum(*p))
*p = '_';
diff --git a/stdlib/files.h b/stdlib/files.h
index f650f78e..68827c2a 100644
--- a/stdlib/files.h
+++ b/stdlib/files.h
@@ -18,6 +18,8 @@ typedef struct {
char *resolve_path(const char *path, const char *relative_to, const char *system_path);
__attribute__((pure, nonnull))
char *file_base_name(const char *path);
+__attribute__((pure, nonnull))
+char *file_base_id(const char *path);
__attribute__((nonnull))
file_t *load_file(const char *filename);
__attribute__((nonnull, returns_nonnull))