Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Define simgrid::xbt::Path to manage file names.
[simgrid.git] / src / xbt / xbt_os_file.cpp
diff --git a/src/xbt/xbt_os_file.cpp b/src/xbt/xbt_os_file.cpp
new file mode 100644 (file)
index 0000000..d3e87df
--- /dev/null
@@ -0,0 +1,51 @@
+/* xbt_os_file.cpp -- portable interface to file-related functions            */
+
+/* Copyright (c) 2017. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "xbt/file.hpp" /* this module */
+
+#include "xbt/file.h"
+#include "xbt/sysdep.h"
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#include <cstring>
+#include <libgen.h> /* POSIX dirname */
+
+/** @brief Returns the directory component of a path (reimplementation of POSIX dirname)
+ *
+ * The argument is never modified, and the returned value must be freed after use.
+ */
+char *xbt_dirname(const char *path)
+{
+  return xbt_strdup(simgrid::xbt::Path(path).getDirname().c_str());
+}
+
+/** @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)
+{
+  return xbt_strdup(simgrid::xbt::Path(path).getBasename().c_str());
+}
+
+std::string simgrid::xbt::Path::getDirname()
+{
+  std::string p(path_);
+  char *res = dirname(&p[0]);
+  return std::string(res, strlen(res));
+}
+
+std::string simgrid::xbt::Path::getBasename()
+{
+  std::string p(path_);
+  char *res = basename(&p[0]);
+  return std::string(res, strlen(res));
+}