Massive moved some dirs from $(srcdir)/src into $(srcdir)/lib
[midnight-commander.git] / lib / filehighlight / ini-file-read.c
blob4aee22a4ec240b077ebbe9332f981116d0601c66
1 /*
2 File highlight plugin.
3 Reading and parse rules from ini-files
5 Copyright (C) 2009 The Free Software Foundation, Inc.
7 Written by:
8 Slava Zanko <slavazanko@gmail.com>, 2009.
10 This file is part of the Midnight Commander.
12 The Midnight Commander is free software; you can redistribute it
13 and/or modify it under the terms of the GNU General Public License as
14 published by the Free Software Foundation; either version 2 of the
15 License, or (at your option) any later version.
17 The Midnight Commander is distributed in the hope that it will be
18 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
19 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 MA 02110-1301, USA.
28 #include <config.h>
29 #include <string.h>
31 #include "../src/global.h"
32 #include "../src/main.h"
33 #include "../src/fileloc.h"
34 #include "../src/strescape.h"
35 #include "../src/skin/skin.h"
36 #include "../../src/util.h"
37 #include "fhl.h"
38 #include "internal.h"
40 /*** global variables ****************************************************************************/
42 extern mc_skin_t mc_skin__default;
44 /*** file scope macro definitions ****************************************************************/
46 /*** file scope type declarations ****************************************************************/
48 /*** file scope variables ************************************************************************/
50 /*** file scope functions ************************************************************************/
51 /* --------------------------------------------------------------------------------------------- */
53 static void
54 mc_fhl_parse_fill_color_info (mc_fhl_filter_t * mc_filter, mc_fhl_t * fhl, const gchar * group_name)
56 (void) fhl;
57 mc_filter->color_pair_index = mc_skin_color_get ("filehighlight", group_name);
60 /* --------------------------------------------------------------------------------------------- */
62 static gboolean
63 mc_fhl_parse_get_file_type_id (mc_fhl_t * fhl, const gchar * group_name)
65 mc_fhl_filter_t *mc_filter;
67 const gchar *types[] = {
68 "FILE", "FILE_EXE",
69 "DIR", "LINK_DIR",
70 "LINK", "HARDLINK", "SYMLINK",
71 "STALE_LINK",
72 "DEVICE", "DEVICE_BLOCK", "DEVICE_CHAR",
73 "SPECIAL", "SPECIAL_SOCKET", "SPECIAL_FIFO", "SPECIAL_DOOR",
74 NULL
76 int i;
77 gchar *param_type = mc_config_get_string (fhl->config, group_name, "type", "");
79 if (*param_type == '\0') {
80 g_free (param_type);
81 return FALSE;
84 for (i = 0; types[i] != NULL; i++) {
85 if (strcmp (types[i], param_type) == 0)
86 break;
88 g_free (param_type);
89 if (types[i] == NULL)
90 return FALSE;
92 mc_filter = g_new0 (mc_fhl_filter_t, 1);
93 mc_filter->type = MC_FLHGH_T_FTYPE;
94 mc_filter->file_type = (mc_flhgh_ftype_type) i;
95 mc_fhl_parse_fill_color_info (mc_filter, fhl, group_name);
97 g_ptr_array_add (fhl->filters, (gpointer) mc_filter);
98 return TRUE;
101 /* --------------------------------------------------------------------------------------------- */
103 static gboolean
104 mc_fhl_parse_get_regexp (mc_fhl_t * fhl, const gchar * group_name)
106 mc_fhl_filter_t *mc_filter;
107 gchar *regexp = mc_config_get_string (fhl->config, group_name, "regexp", "");
109 if (*regexp == '\0') {
110 g_free (regexp);
111 return FALSE;
114 mc_filter = g_new0 (mc_fhl_filter_t, 1);
115 mc_filter->type = MC_FLHGH_T_FREGEXP;
116 mc_filter->search_condition = mc_search_new (regexp, -1);
117 mc_filter->search_condition->is_case_sentitive = TRUE;
118 mc_filter->search_condition->search_type = MC_SEARCH_T_REGEX;
120 mc_fhl_parse_fill_color_info (mc_filter, fhl, group_name);
121 g_ptr_array_add (fhl->filters, (gpointer) mc_filter);
122 g_free (regexp);
123 return TRUE;
127 /* --------------------------------------------------------------------------------------------- */
129 static gboolean
130 mc_fhl_parse_get_extensions (mc_fhl_t * fhl, const gchar * group_name)
132 mc_fhl_filter_t *mc_filter;
133 gchar **exts, **exts_orig;
134 gchar *esc_ext;
135 gsize exts_size;
136 GString *buf = g_string_new ("");
138 exts_orig = exts =
139 mc_config_get_string_list (fhl->config, group_name, "extensions", &exts_size);
141 if (exts_orig == NULL)
142 return FALSE;
144 if (exts_orig[0] == NULL) {
145 g_strfreev (exts_orig);
146 return FALSE;
149 while (*exts != NULL) {
150 esc_ext = strutils_regex_escape (*exts);
151 if (buf->len != 0)
152 g_string_append_c (buf, '|');
153 g_string_append (buf, esc_ext);
154 g_free (esc_ext);
155 exts++;
157 g_strfreev (exts_orig);
158 esc_ext = g_string_free (buf, FALSE);
159 buf = g_string_new (".*\\.(");
160 g_string_append (buf, esc_ext);
161 g_string_append (buf, ")$");
162 g_free (esc_ext);
164 mc_filter = g_new0 (mc_fhl_filter_t, 1);
165 mc_filter->type = MC_FLHGH_T_FREGEXP;
166 mc_filter->search_condition = mc_search_new (buf->str, -1);
167 mc_filter->search_condition->is_case_sentitive =
168 mc_config_get_bool (fhl->config, group_name, "extensions_case", TRUE);
169 mc_filter->search_condition->search_type = MC_SEARCH_T_REGEX;
171 mc_fhl_parse_fill_color_info (mc_filter, fhl, group_name);
172 g_ptr_array_add (fhl->filters, (gpointer) mc_filter);
173 g_string_free (buf, TRUE);
174 return TRUE;
177 /* --------------------------------------------------------------------------------------------- */
178 /*** public functions ****************************************************************************/
179 /* --------------------------------------------------------------------------------------------- */
182 gboolean
183 mc_fhl_read_ini_file (mc_fhl_t * fhl, const gchar * filename)
185 if (fhl == NULL || filename == NULL || !exist_file (filename))
186 return FALSE;
188 if (fhl->config) {
190 if (!mc_config_read_file (fhl->config, filename))
191 return FALSE;
193 return TRUE;
196 fhl->config = mc_config_init (filename);
198 if (fhl->config == NULL)
199 return FALSE;
201 return TRUE;
205 /* --------------------------------------------------------------------------------------------- */
207 gboolean
208 mc_fhl_init_from_standart_files (mc_fhl_t * fhl)
210 gchar *name;
212 /* ${datadir}/mc/filehighlight.ini */
213 name = concat_dir_and_file (mc_home_alt, MC_FHL_INI_FILE);
214 if (exist_file (name) && (!mc_fhl_read_ini_file (fhl, name))) {
215 g_free (name);
216 return FALSE;
218 g_free (name);
220 /* ${sysconfdir}/mc/filehighlight.ini */
221 name = concat_dir_and_file (mc_home, MC_FHL_INI_FILE);
222 if (exist_file (name) && (!mc_fhl_read_ini_file (fhl, name))) {
223 g_free (name);
224 return FALSE;
226 g_free (name);
228 /* ~/.mc/filehighlight.ini */
229 name = g_build_filename (home_dir, MC_USERCONF_DIR, MC_FHL_INI_FILE, NULL);
231 if (exist_file (name) && (!mc_fhl_read_ini_file (fhl, name))) {
232 g_free (name);
233 return FALSE;
235 g_free (name);
237 return TRUE;
240 /* --------------------------------------------------------------------------------------------- */
242 gboolean
243 mc_fhl_parse_ini_file (mc_fhl_t * fhl)
245 gchar **group_names, **orig_group_names;
247 mc_fhl_array_free (fhl);
248 fhl->filters = g_ptr_array_new ();
250 orig_group_names = group_names = mc_config_get_groups (fhl->config, NULL);
252 if (group_names == NULL)
253 return FALSE;
255 while (*group_names) {
257 if (mc_config_has_param (fhl->config, *group_names, "type")) {
258 /* parse filetype filter */
259 mc_fhl_parse_get_file_type_id (fhl, *group_names);
261 if (mc_config_has_param (fhl->config, *group_names, "regexp")) {
262 /* parse regexp filter */
263 mc_fhl_parse_get_regexp (fhl, *group_names);
265 if (mc_config_has_param (fhl->config, *group_names, "extensions")) {
266 /* parse extensions filter */
267 mc_fhl_parse_get_extensions (fhl, *group_names);
269 group_names++;
272 g_strfreev (orig_group_names);
273 return TRUE;
276 /* --------------------------------------------------------------------------------------------- */