diff options
Diffstat (limited to 'stdlib')
| -rw-r--r-- | stdlib/files.c | 13 | ||||
| -rw-r--r-- | stdlib/files.h | 2 |
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)) |
