conf: split into several source files
authorMax Kellermann <max@musicpd.org>
Tue, 10 Sep 2019 18:30:28 +0000 (20:30 +0200)
committerMax Kellermann <max@musicpd.org>
Tue, 10 Sep 2019 18:39:48 +0000 (20:39 +0200)
meson.build
po/POTFILES
src/ConfigFile.cxx [new file with mode: 0644]
src/ConfigFile.hxx [moved from src/conf.hxx with 95% similarity]
src/ConfigParser.cxx [moved from src/conf.cxx with 76% similarity]
src/ConfigParser.hxx [new file with mode: 0644]
src/Main.cxx
src/Options.cxx
src/XdgBaseDirectory.cxx [new file with mode: 0644]
src/XdgBaseDirectory.hxx [new file with mode: 0644]
src/screen_keydef.cxx

index 0c71ce5..66e76a6 100644 (file)
@@ -198,8 +198,15 @@ if not mini
     'src/xterm_title.cxx',
     'src/BasicMarquee.cxx',
     'src/hscroll.cxx',
-    'src/conf.cxx',
+    'src/ConfigFile.cxx',
+    'src/ConfigParser.cxx',
   ]
+
+  if host_machine.system() != 'windows'
+    sources += [
+      'src/XdgBaseDirectory.cxx',
+    ]
+  endif
 endif
 
 if async_connect
index 34b6552..84ca71b 100644 (file)
@@ -1,7 +1,7 @@
 src/Bindings.cxx
 src/ChatPage.cxx
 src/Command.cxx
-src/conf.cxx
+src/ConfigParser.cxx
 src/CustomColors.cxx
 src/FileBrowserPage.cxx
 src/FileListPage.cxx
diff --git a/src/ConfigFile.cxx b/src/ConfigFile.cxx
new file mode 100644 (file)
index 0000000..3647fb3
--- /dev/null
@@ -0,0 +1,210 @@
+/* ncmpc (Ncurses MPD Client)
+ * (c) 2004-2019 The Music Player Daemon Project
+ * Project homepage: http://musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "ConfigFile.hxx"
+#include "ConfigParser.hxx"
+#include "config.h"
+#include "Options.hxx"
+#include "io/Path.hxx"
+#include "util/Compiler.h"
+
+#include <sys/stat.h>
+
+#ifdef _WIN32
+#include <glib.h>
+#else
+#include "XdgBaseDirectory.hxx"
+#endif
+
+#ifdef _WIN32
+#define CONFIG_FILENAME "ncmpc.conf"
+#define KEYS_FILENAME "keys.conf"
+#else
+#define CONFIG_FILENAME "config"
+#define KEYS_FILENAME "keys"
+#endif
+
+gcc_pure
+static bool
+IsFile(const char *path) noexcept
+{
+       struct stat st;
+       return stat(path, &st) == 0 && S_ISREG(st.st_mode);
+}
+
+std::string
+MakeKeysPath()
+{
+       return MakeUserConfigPath(KEYS_FILENAME);
+}
+
+#ifndef _WIN32
+
+std::string
+GetHomeConfigPath() noexcept
+{
+       const char *home = GetHomeDirectory();
+       if (home == nullptr)
+               return {};
+
+       return BuildPath(home, "." PACKAGE, CONFIG_FILENAME);
+}
+
+#endif
+
+std::string
+GetUserConfigPath() noexcept
+{
+       const auto dir = GetHomeConfigDirectory();
+       if (dir.empty())
+               return {};
+
+       return BuildPath(dir, PACKAGE, CONFIG_FILENAME);
+}
+
+std::string
+GetSystemConfigPath() noexcept
+{
+#ifdef _WIN32
+       const gchar* const *system_data_dirs;
+
+       for (system_data_dirs = g_get_system_config_dirs (); *system_data_dirs != nullptr; system_data_dirs++)
+       {
+               auto path = BuildPath(*system_data_dirs, PACKAGE, CONFIG_FILENAME);
+               if (IsFile(path.c_str()))
+                       return path;
+       }
+       return {};
+#else
+       return BuildPath(SYSCONFDIR, PACKAGE, CONFIG_FILENAME);
+#endif
+}
+
+#ifndef _WIN32
+
+gcc_pure
+static std::string
+GetHomeKeysPath() noexcept
+{
+       const char *home = GetHomeDirectory();
+       if (home == nullptr)
+               return {};
+
+       return BuildPath(home, "." PACKAGE, KEYS_FILENAME);
+}
+
+#endif
+
+gcc_pure
+static std::string
+GetUserKeysPath() noexcept
+{
+       const auto dir = GetHomeConfigDirectory();
+       if (dir.empty())
+               return {};
+
+       return BuildPath(dir, PACKAGE, KEYS_FILENAME);
+}
+
+gcc_pure
+static std::string
+GetSystemKeysPath() noexcept
+{
+#ifdef _WIN32
+       const gchar* const *system_data_dirs;
+
+       for (system_data_dirs = g_get_system_config_dirs (); *system_data_dirs != nullptr; system_data_dirs++)
+       {
+               auto path = BuildPath(*system_data_dirs, PACKAGE, KEYS_FILENAME);
+               if (IsFile(pathname.c_str()))
+                       return path;
+       }
+       return {}
+#else
+       return BuildPath(SYSCONFDIR, PACKAGE, KEYS_FILENAME);
+#endif
+}
+
+static std::string
+find_config_file() noexcept
+{
+       /* check for command line configuration file */
+       if (!options.config_file.empty())
+               return options.config_file;
+
+       /* check for user configuration ~/.config/ncmpc/config */
+       auto filename = GetUserConfigPath();
+       if (!filename.empty() && IsFile(filename.c_str()))
+               return filename;
+
+#ifndef _WIN32
+       /* check for user configuration ~/.ncmpc/config */
+       filename = GetHomeConfigPath();
+       if (!filename.empty() && IsFile(filename.c_str()))
+               return filename;
+#endif
+
+       /* check for  global configuration SYSCONFDIR/ncmpc/config */
+       filename = GetSystemConfigPath();
+       if (IsFile(filename.c_str()))
+               return filename;
+
+       return {};
+}
+
+static std::string
+find_keys_file() noexcept
+{
+       /* check for command line key binding file */
+       if (!options.key_file.empty())
+               return options.key_file;
+
+       /* check for user key bindings ~/.config/ncmpc/keys */
+       auto filename = GetUserKeysPath();
+       if (!filename.empty() && IsFile(filename.c_str()))
+               return filename;
+
+#ifndef _WIN32
+       /* check for  user key bindings ~/.ncmpc/keys */
+       filename = GetHomeKeysPath();
+       if (!filename.empty() && IsFile(filename.c_str()))
+               return filename;
+#endif
+
+       /* check for  global key bindings SYSCONFDIR/ncmpc/keys */
+       filename = GetSystemKeysPath();
+       if (IsFile(filename.c_str()))
+               return filename;
+
+       return {};
+}
+
+void
+read_configuration()
+{
+       /* load configuration */
+       auto filename = find_config_file();
+       if (!filename.empty())
+               ReadConfigFile(filename.c_str());
+
+       /* load key bindings */
+       filename = find_keys_file();
+       if (!filename.empty())
+               ReadConfigFile(filename.c_str());
+}
similarity index 95%
rename from src/conf.hxx
rename to src/ConfigFile.hxx
index e36e9ad..fe5b3f4 100644 (file)
@@ -17,6 +17,9 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#ifndef CONFIG_FILE_HXX
+#define CONFIG_FILE_HXX
+
 #include <string>
 
 std::string
@@ -36,3 +39,4 @@ GetSystemConfigPath() noexcept;
 void
 read_configuration();
 
+#endif
similarity index 76%
rename from src/conf.cxx
rename to src/ConfigParser.cxx
index 3e50805..27f19bd 100644 (file)
@@ -17,7 +17,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include "conf.hxx"
+#include "ConfigParser.hxx"
 #include "config.h"
 #include "Bindings.hxx"
 #include "GlobalBindings.hxx"
 #include "screen_list.hxx"
 #include "PageMeta.hxx"
 #include "Options.hxx"
-#include "io/Path.hxx"
 #include "util/CharUtil.hxx"
+#include "util/Compiler.h"
 #include "util/PrintException.hxx"
 #include "util/RuntimeError.hxx"
 #include "util/StringStrip.hxx"
 
+#include <algorithm>
+#include <array>
+
 #include <assert.h>
-#include <sys/stat.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-
-#ifdef _WIN32
-#include <glib.h>
-#endif
+#include <strings.h>
 
 #define MAX_LINE_LENGTH 1024
 #define COMMENT_TOKEN '#'
 #define CONF_CHAT_PREFIX "chat-prefix"
 #define CONF_SECOND_COLUMN "second-column"
 
-#ifdef _WIN32
-#define CONFIG_FILENAME "ncmpc.conf"
-#define KEYS_FILENAME "keys.conf"
-#else
-#define CONFIG_FILENAME "config"
-#define KEYS_FILENAME "keys"
-#endif
-
 gcc_pure
 static bool
 str2bool(char *str) noexcept
@@ -636,8 +627,8 @@ parse_line(char *line)
                                         name);
 }
 
-static bool
-read_rc_file(const char *filename)
+bool
+ReadConfigFile(const char *filename)
 {
        assert(filename != nullptr);
 
@@ -670,236 +661,3 @@ read_rc_file(const char *filename)
        fclose(file);
        return true;
 }
-
-gcc_pure
-static bool
-IsFile(const char *path) noexcept
-{
-       struct stat st;
-       return stat(path, &st) == 0 && S_ISREG(st.st_mode);
-}
-
-gcc_pure
-static bool
-IsDirectory(const char *path) noexcept
-{
-       struct stat st;
-       return stat(path, &st) == 0 && S_ISDIR(st.st_mode);
-}
-
-#ifndef _WIN32
-
-gcc_const
-static const char *
-GetHomeDirectory() noexcept
-{
-       return getenv("HOME");
-}
-
-gcc_const
-static std::string
-GetHomeConfigDirectory() noexcept
-{
-       const char *config_home = getenv("XDG_CONFIG_HOME");
-       if (config_home != nullptr && *config_home != 0)
-               return config_home;
-
-       const char *home = GetHomeDirectory();
-       if (home != nullptr)
-               return BuildPath(home, ".config");
-
-       return {};
-}
-
-gcc_pure
-static std::string
-GetHomeConfigDirectory(const char *package) noexcept
-{
-       const auto dir = GetHomeConfigDirectory();
-       if (dir.empty())
-               return {};
-
-       return BuildPath(dir, package);
-}
-
-#endif
-
-/**
- * Find or create the directory for writing configuration files.
- *
- * @return the absolute path; an empty string indicates that no
- * directory could be created
- */
-static std::string
-MakeUserConfigPath(const char *filename)
-{
-       const auto directory = GetHomeConfigDirectory(PACKAGE);
-       if (directory.empty())
-               return {};
-
-       return IsDirectory(directory.c_str()) ||
-               mkdir(directory.c_str(), 0755) == 0
-               ? BuildPath(directory, filename)
-               : std::string();
-}
-
-std::string
-MakeKeysPath()
-{
-       return MakeUserConfigPath(KEYS_FILENAME);
-}
-
-#ifndef _WIN32
-
-std::string
-GetHomeConfigPath() noexcept
-{
-       const char *home = GetHomeDirectory();
-       if (home == nullptr)
-               return {};
-
-       return BuildPath(home, "." PACKAGE, CONFIG_FILENAME);
-}
-
-#endif
-
-std::string
-GetUserConfigPath() noexcept
-{
-       const auto dir = GetHomeConfigDirectory();
-       if (dir.empty())
-               return {};
-
-       return BuildPath(dir, PACKAGE, CONFIG_FILENAME);
-}
-
-std::string
-GetSystemConfigPath() noexcept
-{
-#ifdef _WIN32
-       const gchar* const *system_data_dirs;
-
-       for (system_data_dirs = g_get_system_config_dirs (); *system_data_dirs != nullptr; system_data_dirs++)
-       {
-               auto path = BuildPath(*system_data_dirs, PACKAGE, CONFIG_FILENAME);
-               if (IsFile(path.c_str()))
-                       return path;
-       }
-       return {};
-#else
-       return BuildPath(SYSCONFDIR, PACKAGE, CONFIG_FILENAME);
-#endif
-}
-
-#ifndef _WIN32
-
-gcc_pure
-static std::string
-GetHomeKeysPath() noexcept
-{
-       const char *home = GetHomeDirectory();
-       if (home == nullptr)
-               return {};
-
-       return BuildPath(home, "." PACKAGE, KEYS_FILENAME);
-}
-
-#endif
-
-gcc_pure
-static std::string
-GetUserKeysPath() noexcept
-{
-       const auto dir = GetHomeConfigDirectory();
-       if (dir.empty())
-               return {};
-
-       return BuildPath(dir, PACKAGE, KEYS_FILENAME);
-}
-
-gcc_pure
-static std::string
-GetSystemKeysPath() noexcept
-{
-#ifdef _WIN32
-       const gchar* const *system_data_dirs;
-
-       for (system_data_dirs = g_get_system_config_dirs (); *system_data_dirs != nullptr; system_data_dirs++)
-       {
-               auto path = BuildPath(*system_data_dirs, PACKAGE, KEYS_FILENAME);
-               if (IsFile(pathname.c_str()))
-                       return path;
-       }
-       return {}
-#else
-       return BuildPath(SYSCONFDIR, PACKAGE, KEYS_FILENAME);
-#endif
-}
-
-static std::string
-find_config_file() noexcept
-{
-       /* check for command line configuration file */
-       if (!options.config_file.empty())
-               return options.config_file;
-
-       /* check for user configuration ~/.config/ncmpc/config */
-       auto filename = GetUserConfigPath();
-       if (!filename.empty() && IsFile(filename.c_str()))
-               return filename;
-
-#ifndef _WIN32
-       /* check for user configuration ~/.ncmpc/config */
-       filename = GetHomeConfigPath();
-       if (!filename.empty() && IsFile(filename.c_str()))
-               return filename;
-#endif
-
-       /* check for  global configuration SYSCONFDIR/ncmpc/config */
-       filename = GetSystemConfigPath();
-       if (IsFile(filename.c_str()))
-               return filename;
-
-       return {};
-}
-
-static std::string
-find_keys_file() noexcept
-{
-       /* check for command line key binding file */
-       if (!options.key_file.empty())
-               return options.key_file;
-
-       /* check for user key bindings ~/.config/ncmpc/keys */
-       auto filename = GetUserKeysPath();
-       if (!filename.empty() && IsFile(filename.c_str()))
-               return filename;
-
-#ifndef _WIN32
-       /* check for  user key bindings ~/.ncmpc/keys */
-       filename = GetHomeKeysPath();
-       if (!filename.empty() && IsFile(filename.c_str()))
-               return filename;
-#endif
-
-       /* check for  global key bindings SYSCONFDIR/ncmpc/keys */
-       filename = GetSystemKeysPath();
-       if (IsFile(filename.c_str()))
-               return filename;
-
-       return {};
-}
-
-void
-read_configuration()
-{
-       /* load configuration */
-       auto filename = find_config_file();
-       if (!filename.empty())
-               read_rc_file(filename.c_str());
-
-       /* load key bindings */
-       filename = find_keys_file();
-       if (!filename.empty())
-               read_rc_file(filename.c_str());
-}
diff --git a/src/ConfigParser.hxx b/src/ConfigParser.hxx
new file mode 100644 (file)
index 0000000..385b78c
--- /dev/null
@@ -0,0 +1,26 @@
+/* ncmpc (Ncurses MPD Client)
+ * (c) 2004-2019 The Music Player Daemon Project
+ * Project homepage: http://musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef CONFIG_PARSER_HXX
+#define CONFIG_PARSER_HXX
+
+bool
+ReadConfigFile(const char *filename);
+
+#endif
index 3104f3d..c1dffa4 100644 (file)
@@ -39,7 +39,7 @@
 #include "util/Compiler.h"
 
 #ifndef NCMPC_MINI
-#include "conf.hxx"
+#include "ConfigFile.hxx"
 #endif
 
 #ifdef ENABLE_LYRICS_SCREEN
index a406adc..a85c4d4 100644 (file)
@@ -22,7 +22,7 @@
 #include "GlobalBindings.hxx"
 #include "config.h"
 #include "charset.hxx"
-#include "conf.hxx"
+#include "ConfigFile.hxx"
 #include "i18n.h"
 
 #include <stdlib.h>
diff --git a/src/XdgBaseDirectory.cxx b/src/XdgBaseDirectory.cxx
new file mode 100644 (file)
index 0000000..87118cb
--- /dev/null
@@ -0,0 +1,76 @@
+/* ncmpc (Ncurses MPD Client)
+ * (c) 2004-2019 The Music Player Daemon Project
+ * Project homepage: http://musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "XdgBaseDirectory.hxx"
+#include "config.h"
+#include "io/Path.hxx"
+
+#include <stdlib.h>
+#include <sys/stat.h>
+
+gcc_pure
+static bool
+IsDirectory(const char *path) noexcept
+{
+       struct stat st;
+       return stat(path, &st) == 0 && S_ISDIR(st.st_mode);
+}
+
+const char *
+GetHomeDirectory() noexcept
+{
+       return getenv("HOME");
+}
+
+std::string
+GetHomeConfigDirectory() noexcept
+{
+       const char *config_home = getenv("XDG_CONFIG_HOME");
+       if (config_home != nullptr && *config_home != 0)
+               return config_home;
+
+       const char *home = GetHomeDirectory();
+       if (home != nullptr)
+               return BuildPath(home, ".config");
+
+       return {};
+}
+
+std::string
+GetHomeConfigDirectory(const char *package) noexcept
+{
+       const auto dir = GetHomeConfigDirectory();
+       if (dir.empty())
+               return {};
+
+       return BuildPath(dir, package);
+}
+
+std::string
+MakeUserConfigPath(const char *filename) noexcept
+{
+       const auto directory = GetHomeConfigDirectory(PACKAGE);
+       if (directory.empty())
+               return {};
+
+       return IsDirectory(directory.c_str()) ||
+               mkdir(directory.c_str(), 0755) == 0
+               ? BuildPath(directory, filename)
+               : std::string();
+}
diff --git a/src/XdgBaseDirectory.hxx b/src/XdgBaseDirectory.hxx
new file mode 100644 (file)
index 0000000..138765c
--- /dev/null
@@ -0,0 +1,48 @@
+/* ncmpc (Ncurses MPD Client)
+ * (c) 2004-2019 The Music Player Daemon Project
+ * Project homepage: http://musicpd.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef XDG_BASE_DIRECTORY_HXX
+#define XDG_BASE_DIRECTORY_HXX
+
+#include "util/Compiler.h"
+
+#include <string>
+
+gcc_const
+const char *
+GetHomeDirectory() noexcept;
+
+gcc_const
+std::string
+GetHomeConfigDirectory() noexcept;
+
+gcc_pure
+std::string
+GetHomeConfigDirectory(const char *package) noexcept;
+
+/**
+ * Find or create the directory for writing configuration files.
+ *
+ * @return the absolute path; an empty string indicates that no
+ * directory could be created
+ */
+std::string
+MakeUserConfigPath(const char *filename) noexcept;
+
+#endif
index a072ae7..a18b0b5 100644 (file)
@@ -27,7 +27,7 @@
 #include "screen_find.hxx"
 #include "KeyName.hxx"
 #include "i18n.h"
-#include "conf.hxx"
+#include "ConfigFile.hxx"
 #include "Bindings.hxx"
 #include "GlobalBindings.hxx"
 #include "screen_utils.hxx"