#include <pakfire/i18n.h>
#include <pakfire/logging.h>
#include <pakfire/pakfire.h>
+#include <pakfire/path.h>
#include <pakfire/progress.h>
#include <pakfire/string.h>
#include <pakfire/util.h>
// Default to the filename if no title is set
if (!*transfer->title) {
- r = pakfire_basename(path, transfer->url);
+ r = pakfire_path_basename(path, transfer->url);
if (r)
return NULL;
__pakfire_path_merge(path, sizeof(path), s1, s2)
int __pakfire_path_merge(char* buffer, const size_t length, const char* s1, const char* s2);
+#define pakfire_path_basename(path, s) \
+ __pakfire_path_basename(path, sizeof(path), s)
+int __pakfire_path_basename(char* buffer, const size_t length, const char* s);
+
#define pakfire_path_dirname(path, s) \
__pakfire_path_dirname(path, sizeof(path), s)
int __pakfire_path_dirname(char* buffer, const size_t length, const char* s);
__pakfire_path_replace_extension(path, sizeof(path), extension)
int __pakfire_path_replace_extension(char* path, const size_t length, const char* extension);
-#define pakfire_basename(basename, path) \
- __pakfire_basename(basename, sizeof(basename), path)
-int __pakfire_basename(char* basename, const size_t length, const char* path);
-
char* pakfire_remove_trailing_newline(char* str);
int pakfire_read_file_into_buffer(FILE* f, char** buffer, size_t* len);
#include <pakfire/package.h>
#include <pakfire/pakfire.h>
#include <pakfire/parser.h>
+#include <pakfire/path.h>
#include <pakfire/string.h>
#include <pakfire/util.h>
}
// Determine the basename of the file
- r = pakfire_basename(basename, path);
+ r = pakfire_path_basename(basename, path);
if (r)
return r;
case PAKFIRE_PKG_PATH:
if (value) {
- r = pakfire_basename(basename, value);
+ r = pakfire_path_basename(basename, value);
if (r)
return r;
Repodata* repodata = pakfire_repo_get_repodata(repo);
// Get filename part
- r = pakfire_basename(basename, path);
+ r = pakfire_path_basename(basename, path);
if (r)
return r;
return r;
}
+int __pakfire_path_basename(char* buffer, const size_t length, const char* s) {
+ struct pakfire_path* path = NULL;
+ int r;
+
+ // Check inputs
+ if (!buffer || !length)
+ return -EINVAL;
+
+ // Parse the path
+ r = pakfire_path_parse(&path, s);
+ if (r)
+ goto ERROR;
+
+ // Drop everything but the last segment
+ while (path->num_segments > 1) {
+ r = pakfire_path_remove_segment(path, 0);
+ if (r)
+ goto ERROR;
+ }
+
+ // The result is never absolute
+ path->is_absolute = 0;
+
+ // Write back the path
+ r = pakfire_path_to_string(path, buffer, length);
+ if (r)
+ goto ERROR;
+
+ERROR:
+ if (path)
+ pakfire_path_free(path);
+
+ return r;
+}
+
int __pakfire_path_dirname(char* buffer, const size_t length, const char* s) {
struct pakfire_path* path = NULL;
int r;
return r;
}
-int __pakfire_basename(char* __basename, const size_t length, const char* path) {
- char buffer[PATH_MAX];
- int r;
-
- // Copy the path into the buffer
- r = pakfire_string_set(buffer, path);
- if (r)
- return r;
-
- // Run basename()
- char* p = basename(buffer);
- if (!p)
- return -errno;
-
- return __pakfire_string_set(__basename, length, p);
-}
-
char* pakfire_remove_trailing_newline(char* str) {
ssize_t pos = strlen(str) - 1;
return EXIT_FAILURE;
}
+static int test_path_basename(const struct test* t) {
+ char path[PATH_MAX];
+
+ ASSERT_SUCCESS(pakfire_path_basename(path, "/usr/bin/bash"));
+ ASSERT_STRING_EQUALS(path, "bash");
+
+ return EXIT_SUCCESS;
+
+FAIL:
+ return EXIT_FAILURE;
+}
+
static int test_path_dirname(const struct test* t) {
char path[PATH_MAX];
testsuite_add_test(test_path_normalize);
testsuite_add_test(test_path_append);
testsuite_add_test(test_path_merge);
+ testsuite_add_test(test_path_basename);
testsuite_add_test(test_path_dirname);
return testsuite_run(argc, argv);
#include "../testsuite.h"
-static int test_basename(const struct test* t) {
- char basename[PATH_MAX];
- const char* dir = "/a/b/c";
-
- ASSERT_SUCCESS(pakfire_basename(basename, dir));
- ASSERT_STRING_EQUALS(basename, "c");
-
- return EXIT_SUCCESS;
-
-FAIL:
- return EXIT_FAILURE;
-}
-
static int test_mkdir(const struct test* t) {
char path[PATH_MAX];
}
int main(int argc, const char* argv[]) {
- testsuite_add_test(test_basename);
testsuite_add_test(test_mkdir);
testsuite_add_test(test_path_match);
testsuite_add_test(test_base64);