From 375c7c9770c5407af33058170d13d9801a508b30 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Sat, 17 Aug 2019 20:35:59 +0300 Subject: Don't load default options from directories which subdirectory contains --no-default-options --- libbutl/default-options.cxx | 74 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 libbutl/default-options.cxx (limited to 'libbutl/default-options.cxx') 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 +#endif + +#include + +#ifndef __cpp_lib_modules_ts +#include +#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 + default_options_start (const optional& home, + const vector& 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; + } +} -- cgit v1.1