summaryrefslogtreecommitdiffstats
path: root/lib/filehighlight/ini-file-read.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/filehighlight/ini-file-read.c')
-rw-r--r--lib/filehighlight/ini-file-read.c256
1 files changed, 256 insertions, 0 deletions
diff --git a/lib/filehighlight/ini-file-read.c b/lib/filehighlight/ini-file-read.c
new file mode 100644
index 0000000..88677c2
--- /dev/null
+++ b/lib/filehighlight/ini-file-read.c
@@ -0,0 +1,256 @@
+/*
+ File highlight plugin.
+ Reading and parse rules from ini-files
+
+ Copyright (C) 2009-2022
+ Free Software Foundation, Inc.
+
+ Written by:
+ Slava Zanko <slavazanko@gmail.com>, 2009.
+
+ This file is part of the Midnight Commander.
+
+ The Midnight Commander 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 3 of the License,
+ or (at your option) any later version.
+
+ The Midnight Commander 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <string.h>
+
+#include "lib/global.h"
+#include "lib/fileloc.h"
+#include "lib/strescape.h"
+#include "lib/skin.h"
+#include "lib/util.h" /* exist_file() */
+#include "lib/filehighlight.h"
+
+#include "internal.h"
+
+/*** global variables ****************************************************************************/
+
+/*** file scope macro definitions ****************************************************************/
+
+/*** file scope type declarations ****************************************************************/
+
+/*** file scope variables ************************************************************************/
+
+/*** file scope functions ************************************************************************/
+/* --------------------------------------------------------------------------------------------- */
+
+static void
+mc_fhl_parse_fill_color_info (mc_fhl_filter_t * mc_filter, mc_fhl_t * fhl, const gchar * group_name)
+{
+ (void) fhl;
+ mc_filter->color_pair_index = mc_skin_color_get ("filehighlight", group_name);
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+static gboolean
+mc_fhl_parse_get_file_type_id (mc_fhl_t * fhl, const gchar * group_name)
+{
+ mc_fhl_filter_t *mc_filter;
+
+ const gchar *types[] = {
+ "FILE", "FILE_EXE",
+ "DIR", "LINK_DIR",
+ "LINK", "HARDLINK", "SYMLINK",
+ "STALE_LINK",
+ "DEVICE", "DEVICE_BLOCK", "DEVICE_CHAR",
+ "SPECIAL", "SPECIAL_SOCKET", "SPECIAL_FIFO", "SPECIAL_DOOR",
+ NULL
+ };
+ int i;
+ gchar *param_type = mc_config_get_string (fhl->config, group_name, "type", "");
+
+ if (*param_type == '\0')
+ {
+ g_free (param_type);
+ return FALSE;
+ }
+
+ for (i = 0; types[i] != NULL; i++)
+ {
+ if (strcmp (types[i], param_type) == 0)
+ break;
+ }
+ g_free (param_type);
+ if (types[i] == NULL)
+ return FALSE;
+
+ mc_filter = g_new0 (mc_fhl_filter_t, 1);
+ mc_filter->type = MC_FLHGH_T_FTYPE;
+ mc_filter->file_type = (mc_flhgh_ftype_type) i;
+ mc_fhl_parse_fill_color_info (mc_filter, fhl, group_name);
+
+ g_ptr_array_add (fhl->filters, (gpointer) mc_filter);
+ return TRUE;
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+static gboolean
+mc_fhl_parse_get_regexp (mc_fhl_t * fhl, const gchar * group_name)
+{
+ mc_fhl_filter_t *mc_filter;
+ gchar *regexp = mc_config_get_string (fhl->config, group_name, "regexp", "");
+
+ if (*regexp == '\0')
+ {
+ g_free (regexp);
+ return FALSE;
+ }
+
+ mc_filter = g_new0 (mc_fhl_filter_t, 1);
+ mc_filter->type = MC_FLHGH_T_FREGEXP;
+ mc_filter->search_condition = mc_search_new (regexp, DEFAULT_CHARSET);
+ mc_filter->search_condition->is_case_sensitive = TRUE;
+ mc_filter->search_condition->search_type = MC_SEARCH_T_REGEX;
+
+ mc_fhl_parse_fill_color_info (mc_filter, fhl, group_name);
+ g_ptr_array_add (fhl->filters, (gpointer) mc_filter);
+ g_free (regexp);
+ return TRUE;
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+static gboolean
+mc_fhl_parse_get_extensions (mc_fhl_t * fhl, const gchar * group_name)
+{
+ mc_fhl_filter_t *mc_filter;
+ gchar **exts, **exts_orig;
+ GString *buf;
+
+ exts_orig = mc_config_get_string_list (fhl->config, group_name, "extensions", NULL);
+ if (exts_orig == NULL || exts_orig[0] == NULL)
+ {
+ g_strfreev (exts_orig);
+ return FALSE;
+ }
+
+ buf = g_string_sized_new (64);
+
+ for (exts = exts_orig; *exts != NULL; exts++)
+ {
+ char *esc_ext;
+
+ esc_ext = strutils_regex_escape (*exts);
+ if (buf->len != 0)
+ g_string_append_c (buf, '|');
+ g_string_append (buf, esc_ext);
+ g_free (esc_ext);
+ }
+ g_strfreev (exts_orig);
+
+ g_string_prepend (buf, ".*\\.(");
+ g_string_append (buf, ")$");
+
+ mc_filter = g_new0 (mc_fhl_filter_t, 1);
+ mc_filter->type = MC_FLHGH_T_FREGEXP;
+ mc_filter->search_condition = mc_search_new_len (buf->str, buf->len, DEFAULT_CHARSET);
+ mc_filter->search_condition->is_case_sensitive =
+ mc_config_get_bool (fhl->config, group_name, "extensions_case", FALSE);
+ mc_filter->search_condition->search_type = MC_SEARCH_T_REGEX;
+
+ mc_fhl_parse_fill_color_info (mc_filter, fhl, group_name);
+ g_ptr_array_add (fhl->filters, (gpointer) mc_filter);
+ g_string_free (buf, TRUE);
+ return TRUE;
+}
+
+/* --------------------------------------------------------------------------------------------- */
+/*** public functions ****************************************************************************/
+/* --------------------------------------------------------------------------------------------- */
+
+gboolean
+mc_fhl_read_ini_file (mc_fhl_t * fhl, const gchar * filename)
+{
+ if (fhl == NULL || filename == NULL || !exist_file (filename))
+ return FALSE;
+
+ if (fhl->config != NULL)
+ return mc_config_read_file (fhl->config, filename, TRUE, FALSE);
+
+ fhl->config = mc_config_init (filename, TRUE);
+ return (fhl->config != NULL);
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+gboolean
+mc_fhl_init_from_standard_files (mc_fhl_t * fhl)
+{
+ gchar *name;
+ gboolean ok;
+
+ /* ${XDG_CONFIG_HOME}/mc/filehighlight.ini */
+ name = mc_config_get_full_path (MC_FHL_INI_FILE);
+ ok = mc_fhl_read_ini_file (fhl, name);
+ g_free (name);
+ if (ok)
+ return TRUE;
+
+ /* ${sysconfdir}/mc/filehighlight.ini */
+ name = g_build_filename (mc_global.sysconfig_dir, MC_FHL_INI_FILE, (char *) NULL);
+ ok = mc_fhl_read_ini_file (fhl, name);
+ g_free (name);
+ if (ok)
+ return TRUE;
+
+ /* ${datadir}/mc/filehighlight.ini */
+ name = g_build_filename (mc_global.share_data_dir, MC_FHL_INI_FILE, (char *) NULL);
+ ok = mc_fhl_read_ini_file (fhl, name);
+ g_free (name);
+ return ok;
+}
+
+/* --------------------------------------------------------------------------------------------- */
+
+gboolean
+mc_fhl_parse_ini_file (mc_fhl_t * fhl)
+{
+ gchar **group_names, **orig_group_names;
+ gboolean ok;
+
+ mc_fhl_array_free (fhl);
+ fhl->filters = g_ptr_array_new ();
+
+ orig_group_names = mc_config_get_groups (fhl->config, NULL);
+ ok = (*orig_group_names != NULL);
+
+ for (group_names = orig_group_names; *group_names != NULL; group_names++)
+ {
+ if (mc_config_has_param (fhl->config, *group_names, "type"))
+ {
+ /* parse filetype filter */
+ mc_fhl_parse_get_file_type_id (fhl, *group_names);
+ }
+ if (mc_config_has_param (fhl->config, *group_names, "regexp"))
+ {
+ /* parse regexp filter */
+ mc_fhl_parse_get_regexp (fhl, *group_names);
+ }
+ if (mc_config_has_param (fhl->config, *group_names, "extensions"))
+ {
+ /* parse extensions filter */
+ mc_fhl_parse_get_extensions (fhl, *group_names);
+ }
+ }
+
+ g_strfreev (orig_group_names);
+
+ return ok;
+}
+
+/* --------------------------------------------------------------------------------------------- */