2 Configure module for the Midnight Commander
4 Copyright (C) 1994-2024
5 Free Software Foundation, Inc.
8 Radek Doulik, 1994, 1995
9 Miguel de Icaza, 1994, 1995
11 Andrej Borsenkow, 1996
13 Andrew Borodin <aborodin@vmail.ru>, 2009-2023
15 This file is part of the Midnight Commander.
17 The Midnight Commander is free software: you can redistribute it
18 and/or modify it under the terms of the GNU General Public License as
19 published by the Free Software Foundation, either version 3 of the License,
20 or (at your option) any later version.
22 The Midnight Commander is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 GNU General Public License for more details.
27 You should have received a copy of the GNU General Public License
28 along with this program. If not, see <http://www.gnu.org/licenses/>.
32 * \brief Source: save and load history
38 #include <sys/types.h>
40 #include "lib/global.h"
42 #include "lib/fileloc.h" /* MC_HISTORY_FILE */
43 #include "lib/strutil.h"
44 #include "lib/util.h" /* list_append_unique */
46 #include "lib/mcconfig.h"
48 /*** global variables ****************************************************************************/
50 /* how much history items are used */
51 int num_history_items_recorded
= 60;
53 /*** file scope macro definitions ****************************************************************/
55 /*** file scope type declarations ****************************************************************/
57 /*** file scope variables ************************************************************************/
59 /* --------------------------------------------------------------------------------------------- */
60 /*** file scope functions ************************************************************************/
61 /* --------------------------------------------------------------------------------------------- */
63 /* --------------------------------------------------------------------------------------------- */
64 /*** public functions ****************************************************************************/
65 /* --------------------------------------------------------------------------------------------- */
68 * Load the history from the ${XDG_DATA_HOME}/mc/history file.
69 * It is called with the widgets history name and returns the GList list.
73 mc_config_history_get (const char *name
)
79 if (num_history_items_recorded
== 0) /* this is how to disable */
81 if (name
== NULL
|| *name
== '\0')
84 profile
= mc_config_get_full_path (MC_HISTORY_FILE
);
85 cfg
= mc_config_init (profile
, TRUE
);
87 hist
= mc_config_history_load (cfg
, name
);
89 mc_config_deinit (cfg
);
95 /* --------------------------------------------------------------------------------------------- */
98 * Get the recent item of a history from the ${XDG_DATA_HOME}/mc/history file.
100 * TODO: get rid of load the entire history to get the only top item.
104 mc_config_history_get_recent_item (const char *name
)
109 history
= mc_config_history_get (name
);
112 /* FIXME: can history->data be NULL? */
113 item
= (char *) history
->data
;
114 history
->data
= NULL
;
115 history
= g_list_first (history
);
116 g_list_free_full (history
, g_free
);
122 /* --------------------------------------------------------------------------------------------- */
125 * Load history from the mc_config
128 mc_config_history_load (mc_config_t
*cfg
, const char *name
)
134 GIConv conv
= INVALID_CONV
;
137 if (name
== NULL
|| *name
== '\0')
140 /* get number of keys */
141 keys
= mc_config_get_keys (cfg
, name
, &keys_num
);
144 /* create charset conversion handler to convert strings
145 from utf-8 to system codepage */
146 if (!mc_global
.utf8_display
)
147 conv
= str_crt_conv_from ("UTF-8");
149 buffer
= g_string_sized_new (64);
151 for (i
= 0; i
< keys_num
; i
++)
156 g_snprintf (key
, sizeof (key
), "%lu", (unsigned long) i
);
157 this_entry
= mc_config_get_string_raw (cfg
, name
, key
, "");
159 if (this_entry
== NULL
)
162 if (conv
== INVALID_CONV
)
163 hist
= list_append_unique (hist
, this_entry
);
166 g_string_set_size (buffer
, 0);
167 if (str_convert (conv
, this_entry
, buffer
) == ESTR_FAILURE
)
168 hist
= list_append_unique (hist
, this_entry
);
171 hist
= list_append_unique (hist
, g_strndup (buffer
->str
, buffer
->len
));
177 g_string_free (buffer
, TRUE
);
178 if (conv
!= INVALID_CONV
)
179 str_close_conv (conv
);
181 /* return pointer to the last entry in the list */
182 return g_list_last (hist
);
185 /* --------------------------------------------------------------------------------------------- */
188 * Save history to the mc_config, but don't save config to file
191 mc_config_history_save (mc_config_t
*cfg
, const char *name
, GList
*h
)
193 GIConv conv
= INVALID_CONV
;
197 if (name
== NULL
|| *name
== '\0' || h
== NULL
)
200 /* go to end of list */
203 /* go back 60 places */
204 for (i
= 0; (i
< num_history_items_recorded
- 1) && (h
->prev
!= NULL
); i
++)
205 h
= g_list_previous (h
);
207 mc_config_del_group (cfg
, name
);
209 /* create charset conversion handler to convert strings
210 from system codepage to UTF-8 */
211 if (!mc_global
.utf8_display
)
212 conv
= str_crt_conv_to ("UTF-8");
214 buffer
= g_string_sized_new (64);
216 /* dump history into profile */
217 for (i
= 0; h
!= NULL
; h
= g_list_next (h
))
220 char *text
= (char *) h
->data
;
222 /* We shouldn't have null entries, but let's be sure */
226 g_snprintf (key
, sizeof (key
), "%d", i
++);
228 if (conv
== INVALID_CONV
)
229 mc_config_set_string_raw (cfg
, name
, key
, text
);
232 g_string_set_size (buffer
, 0);
233 if (str_convert (conv
, text
, buffer
) == ESTR_FAILURE
)
234 mc_config_set_string_raw (cfg
, name
, key
, text
);
236 mc_config_set_string_raw (cfg
, name
, key
, buffer
->str
);
240 g_string_free (buffer
, TRUE
);
241 if (conv
!= INVALID_CONV
)
242 str_close_conv (conv
);
245 /* --------------------------------------------------------------------------------------------- */