aboutsummaryrefslogtreecommitdiff
path: root/libbutl/default-options.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbutl/default-options.cxx')
-rw-r--r--libbutl/default-options.cxx74
1 files changed, 74 insertions, 0 deletions
diff --git a/libbutl/default-options.cxx b/libbutl/default-options.cxx
new file mode 100644
index 0000000..69b9c42
--- /dev/null
+++ b/libbutl/default-options.cxx
@@ -0,0 +1,74 @@
+// file : libbutl/default-options.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef __cpp_modules_ts
+#include <libbutl/default-options.mxx>
+#endif
+
+#include <cassert>
+
+#ifndef __cpp_lib_modules_ts
+#include <vector>
+#endif
+
+// Other includes.
+
+#ifdef __cpp_modules_ts
+module butl.default_options;
+
+// Only imports additional to interface.
+#ifdef __clang__
+#ifdef __cpp_lib_modules_ts
+import std.core;
+#endif
+import butl.path;
+import butl.optional;
+import butl.small_vector;
+#endif
+
+#endif
+
+using namespace std;
+
+namespace butl
+{
+ optional<dir_path>
+ default_options_start (const optional<dir_path>& home,
+ const vector<dir_path>& dirs)
+ {
+ if (home)
+ assert (home->absolute () && home->normalized ());
+
+ if (dirs.empty ())
+ return nullopt;
+
+ // Use the first directory as a start.
+ //
+ auto i (dirs.begin ());
+ dir_path d (*i);
+
+ // Try to find a common prefix for each subsequent directory.
+ //
+ for (++i; i != dirs.end (); ++i)
+ {
+ bool p (false);
+
+ for (;
+ !(d.root () || (home && d == *home));
+ d = d.directory ())
+ {
+ if (i->sub (d))
+ {
+ p = true;
+ break;
+ }
+ }
+
+ if (!p)
+ return nullopt;
+ }
+
+ return d;
+ }
+}