Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
The memory management of dirname is stupid, so be brutal
[simgrid.git] / src / xbt / xbt_os_file.c
index 232ad06..2dda1b2 100644 (file)
@@ -9,7 +9,7 @@
 #include "xbt/sysdep.h"
 #include "xbt/file.h"    /* this module */
 #include "xbt/log.h"
-#include "portable.h"
+#include "src/portable.h"
 
 #ifndef _MSC_VER
 #include "libgen.h" /* POSIX dirname */
@@ -68,12 +68,33 @@ ssize_t xbt_getline(char **buf, size_t *n, FILE *stream)
  */
 char *xbt_dirname(const char *path) {
 #if _MSC_VER
-         char drive[_MAX_DRIVE];
-         char dir[_MAX_DIR];
-         errno_t err;
-         err = _splitpath_s(path, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL,0, NULL,0);
-         return bprintf("%s%s",drive,dir);
+    char drive[_MAX_DRIVE];
+    char dir[_MAX_DIR];
+    errno_t err;
+    err = _splitpath_s(path, drive, _MAX_DRIVE, dir, _MAX_DIR, NULL,0, NULL,0);
+    return bprintf("%s%s",drive,dir);
 #else
-         return dirname(xbt_strdup(path));
+    char *tmp = xbt_strdup(path);
+    char *res = xbt_strdup(dirname(tmp));
+    free(tmp);
+    return res;
+#endif
+}
+/** @brief Returns the file component of a path (reimplementation of POSIX basename)
+ *
+ * The argument is never modified, and the returned value must be freed after use.
+ */
+char *xbt_basename(const char *path) {
+#if _MSC_VER
+    char file[1024];
+    char ext[1024];
+    errno_t err;
+    err = _splitpath_s(path, NULL,0, NULL,0, file,1024, ext,1024);
+    return bprintf("%s.%s",file,ext);
+#else
+    char *tmp = xbt_strdup(path);
+    char *res = xbt_strdup(basename(tmp));
+    free(tmp);
+    return res;
 #endif
 }