3 Reading and parse rules from ini-files
5 Copyright (C) 2009-2024
6 Free Software Foundation, Inc.
9 Slava Zanko <slavazanko@gmail.com>, 2009.
11 This file is part of the Midnight Commander.
13 The Midnight Commander is free software: you can redistribute it
14 and/or modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation, either version 3 of the License,
16 or (at your option) any later version.
18 The Midnight Commander is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program. If not, see <http://www.gnu.org/licenses/>.
30 #include "lib/global.h"
31 #include "lib/fileloc.h"
32 #include "lib/strutil.h"
34 #include "lib/util.h" /* exist_file() */
36 #include "lib/filehighlight.h"
40 /*** global variables ****************************************************************************/
42 /*** file scope macro definitions ****************************************************************/
44 /*** file scope type declarations ****************************************************************/
46 /*** forward declarations (file scope functions) *************************************************/
48 /*** file scope variables ************************************************************************/
50 /* --------------------------------------------------------------------------------------------- */
51 /*** file scope functions ************************************************************************/
52 /* --------------------------------------------------------------------------------------------- */
55 mc_fhl_parse_fill_color_info (mc_fhl_filter_t
* mc_filter
, mc_fhl_t
* fhl
, const gchar
* group_name
)
59 mc_filter
->color_pair_index
= mc_skin_color_get ("filehighlight", group_name
);
62 /* --------------------------------------------------------------------------------------------- */
65 mc_fhl_parse_get_file_type_id (mc_fhl_t
* fhl
, const gchar
* group_name
)
67 mc_fhl_filter_t
*mc_filter
;
69 const gchar
*types
[] = {
72 "LINK", "HARDLINK", "SYMLINK",
74 "DEVICE", "DEVICE_BLOCK", "DEVICE_CHAR",
75 "SPECIAL", "SPECIAL_SOCKET", "SPECIAL_FIFO", "SPECIAL_DOOR",
81 param_type
= mc_config_get_string (fhl
->config
, group_name
, "type", "");
82 if (*param_type
== '\0')
88 for (i
= 0; types
[i
] != NULL
; i
++)
89 if (strcmp (types
[i
], param_type
) == 0)
97 mc_filter
= g_new0 (mc_fhl_filter_t
, 1);
98 mc_filter
->type
= MC_FLHGH_T_FTYPE
;
99 mc_filter
->file_type
= (mc_flhgh_ftype_type
) i
;
100 mc_fhl_parse_fill_color_info (mc_filter
, fhl
, group_name
);
102 g_ptr_array_add (fhl
->filters
, (gpointer
) mc_filter
);
107 /* --------------------------------------------------------------------------------------------- */
110 mc_fhl_parse_get_regexp (mc_fhl_t
* fhl
, const gchar
* group_name
)
112 mc_fhl_filter_t
*mc_filter
;
115 regexp
= mc_config_get_string (fhl
->config
, group_name
, "regexp", "");
122 mc_filter
= g_new0 (mc_fhl_filter_t
, 1);
123 mc_filter
->type
= MC_FLHGH_T_FREGEXP
;
124 mc_filter
->search_condition
= mc_search_new (regexp
, DEFAULT_CHARSET
);
125 mc_filter
->search_condition
->is_case_sensitive
= TRUE
;
126 mc_filter
->search_condition
->search_type
= MC_SEARCH_T_REGEX
;
128 mc_fhl_parse_fill_color_info (mc_filter
, fhl
, group_name
);
129 g_ptr_array_add (fhl
->filters
, (gpointer
) mc_filter
);
135 /* --------------------------------------------------------------------------------------------- */
138 mc_fhl_parse_get_extensions (mc_fhl_t
* fhl
, const gchar
* group_name
)
140 mc_fhl_filter_t
*mc_filter
;
141 gchar
**exts
, **exts_orig
;
144 exts_orig
= mc_config_get_string_list (fhl
->config
, group_name
, "extensions", NULL
);
145 if (exts_orig
== NULL
|| exts_orig
[0] == NULL
)
147 g_strfreev (exts_orig
);
151 buf
= g_string_sized_new (64);
153 for (exts
= exts_orig
; *exts
!= NULL
; exts
++)
157 esc_ext
= str_regex_escape (*exts
);
159 g_string_append_c (buf
, '|');
160 g_string_append (buf
, esc_ext
);
164 g_strfreev (exts_orig
);
166 g_string_prepend (buf
, ".*\\.(");
167 g_string_append (buf
, ")$");
169 mc_filter
= g_new0 (mc_fhl_filter_t
, 1);
170 mc_filter
->type
= MC_FLHGH_T_FREGEXP
;
171 mc_filter
->search_condition
= mc_search_new_len (buf
->str
, buf
->len
, DEFAULT_CHARSET
);
172 mc_filter
->search_condition
->is_case_sensitive
=
173 mc_config_get_bool (fhl
->config
, group_name
, "extensions_case", FALSE
);
174 mc_filter
->search_condition
->search_type
= MC_SEARCH_T_REGEX
;
176 mc_fhl_parse_fill_color_info (mc_filter
, fhl
, group_name
);
177 g_ptr_array_add (fhl
->filters
, (gpointer
) mc_filter
);
178 g_string_free (buf
, TRUE
);
183 /* --------------------------------------------------------------------------------------------- */
184 /*** public functions ****************************************************************************/
185 /* --------------------------------------------------------------------------------------------- */
188 mc_fhl_read_ini_file (mc_fhl_t
* fhl
, const gchar
* filename
)
190 if (fhl
== NULL
|| filename
== NULL
|| !exist_file (filename
))
193 if (fhl
->config
!= NULL
)
194 return mc_config_read_file (fhl
->config
, filename
, TRUE
, FALSE
);
196 fhl
->config
= mc_config_init (filename
, TRUE
);
198 return (fhl
->config
!= NULL
);
201 /* --------------------------------------------------------------------------------------------- */
204 mc_fhl_init_from_standard_files (mc_fhl_t
* fhl
)
209 /* ${XDG_CONFIG_HOME}/mc/filehighlight.ini */
210 name
= mc_config_get_full_path (MC_FHL_INI_FILE
);
211 ok
= mc_fhl_read_ini_file (fhl
, name
);
216 /* ${sysconfdir}/mc/filehighlight.ini */
217 name
= g_build_filename (mc_global
.sysconfig_dir
, MC_FHL_INI_FILE
, (char *) NULL
);
218 ok
= mc_fhl_read_ini_file (fhl
, name
);
223 /* ${datadir}/mc/filehighlight.ini */
224 name
= g_build_filename (mc_global
.share_data_dir
, MC_FHL_INI_FILE
, (char *) NULL
);
225 ok
= mc_fhl_read_ini_file (fhl
, name
);
230 /* --------------------------------------------------------------------------------------------- */
233 mc_fhl_parse_ini_file (mc_fhl_t
* fhl
)
235 gchar
**group_names
, **orig_group_names
;
238 mc_fhl_array_free (fhl
);
239 fhl
->filters
= g_ptr_array_new_with_free_func (mc_fhl_filter_free
);
241 orig_group_names
= mc_config_get_groups (fhl
->config
, NULL
);
242 ok
= (*orig_group_names
!= NULL
);
244 for (group_names
= orig_group_names
; *group_names
!= NULL
; group_names
++)
246 if (mc_config_has_param (fhl
->config
, *group_names
, "type"))
248 /* parse filetype filter */
249 mc_fhl_parse_get_file_type_id (fhl
, *group_names
);
251 if (mc_config_has_param (fhl
->config
, *group_names
, "regexp"))
253 /* parse regexp filter */
254 mc_fhl_parse_get_regexp (fhl
, *group_names
);
256 if (mc_config_has_param (fhl
->config
, *group_names
, "extensions"))
258 /* parse extensions filter */
259 mc_fhl_parse_get_extensions (fhl
, *group_names
);
263 g_strfreev (orig_group_names
);
268 /* --------------------------------------------------------------------------------------------- */