Fix comments of history and panels.ini files location.
[midnight-commander.git] / lib / mcconfig / history.c
blob7e9c0a32f91547acadd2cd7c2abc0cc26c6951c3
1 /*
2 Configure module for the Midnight Commander
4 Copyright (C) 1994-2023
5 Free Software Foundation, Inc.
7 Authors:
8 Radek Doulik, 1994, 1995
9 Miguel de Icaza, 1994, 1995
10 Jakub Jelinek, 1995
11 Andrej Borsenkow, 1996
12 Norbert Warmuth, 1997
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/>.
31 /** \file history.c
32 * \brief Source: save and load history
35 #include <config.h>
37 #include <stdlib.h>
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 /* --------------------------------------------------------------------------------------------- */
67 /**
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.
72 GList *
73 mc_config_history_get (const char *name)
75 GList *hist = NULL;
76 char *profile;
77 mc_config_t *cfg;
79 if (num_history_items_recorded == 0) /* this is how to disable */
80 return NULL;
81 if (name == NULL || *name == '\0')
82 return NULL;
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);
90 g_free (profile);
92 return hist;
95 /* --------------------------------------------------------------------------------------------- */
97 /**
98 * Load history from the mc_config
100 GList *
101 mc_config_history_load (mc_config_t * cfg, const char *name)
103 size_t i;
104 GList *hist = NULL;
105 char **keys;
106 size_t keys_num = 0;
107 GIConv conv = INVALID_CONV;
108 GString *buffer;
110 if (name == NULL || *name == '\0')
111 return NULL;
113 /* get number of keys */
114 keys = mc_config_get_keys (cfg, name, &keys_num);
115 g_strfreev (keys);
117 /* create charset conversion handler to convert strings
118 from utf-8 to system codepage */
119 if (!mc_global.utf8_display)
120 conv = str_crt_conv_from ("UTF-8");
122 buffer = g_string_sized_new (64);
124 for (i = 0; i < keys_num; i++)
126 char key[BUF_TINY];
127 char *this_entry;
129 g_snprintf (key, sizeof (key), "%lu", (unsigned long) i);
130 this_entry = mc_config_get_string_raw (cfg, name, key, "");
132 if (this_entry == NULL)
133 continue;
135 if (conv == INVALID_CONV)
136 hist = list_append_unique (hist, this_entry);
137 else
139 g_string_set_size (buffer, 0);
140 if (str_convert (conv, this_entry, buffer) == ESTR_FAILURE)
141 hist = list_append_unique (hist, this_entry);
142 else
144 hist = list_append_unique (hist, g_strndup (buffer->str, buffer->len));
145 g_free (this_entry);
150 g_string_free (buffer, TRUE);
151 if (conv != INVALID_CONV)
152 str_close_conv (conv);
154 /* return pointer to the last entry in the list */
155 return g_list_last (hist);
158 /* --------------------------------------------------------------------------------------------- */
161 * Save history to the mc_config, but don't save config to file
163 void
164 mc_config_history_save (mc_config_t * cfg, const char *name, GList * h)
166 GIConv conv = INVALID_CONV;
167 GString *buffer;
168 int i;
170 if (name == NULL || *name == '\0' || h == NULL)
171 return;
173 /* go to end of list */
174 h = g_list_last (h);
176 /* go back 60 places */
177 for (i = 0; (i < num_history_items_recorded - 1) && (h->prev != NULL); i++)
178 h = g_list_previous (h);
180 if (name != NULL)
181 mc_config_del_group (cfg, name);
183 /* create charset conversion handler to convert strings
184 from system codepage to UTF-8 */
185 if (!mc_global.utf8_display)
186 conv = str_crt_conv_to ("UTF-8");
188 buffer = g_string_sized_new (64);
190 /* dump history into profile */
191 for (i = 0; h != NULL; h = g_list_next (h))
193 char key[BUF_TINY];
194 char *text = (char *) h->data;
196 /* We shouldn't have null entries, but let's be sure */
197 if (text == NULL)
198 continue;
200 g_snprintf (key, sizeof (key), "%d", i++);
202 if (conv == INVALID_CONV)
203 mc_config_set_string_raw (cfg, name, key, text);
204 else
206 g_string_set_size (buffer, 0);
207 if (str_convert (conv, text, buffer) == ESTR_FAILURE)
208 mc_config_set_string_raw (cfg, name, key, text);
209 else
210 mc_config_set_string_raw (cfg, name, key, buffer->str);
214 g_string_free (buffer, TRUE);
215 if (conv != INVALID_CONV)
216 str_close_conv (conv);
219 /* --------------------------------------------------------------------------------------------- */