1 /* gkeyfile.c - key file parser
3 * Copyright 2004 Red Hat, Inc.
5 * Written by Ray Strode <rstrode@redhat.com>
7 * GLib is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU Lesser General Public License as
9 * published by the Free Software Foundation; either version 2 of the
10 * License, or (at your option) any later version.
12 * GLib is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with GLib; see the file COPYING.LIB. If not,
19 * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
33 #include <sys/types.h>
40 #include "gfileutils.h"
46 #include "gmessages.h"
48 #include "gstrfuncs.h"
51 typedef struct _GKeyFileGroup GKeyFileGroup;
57 gchar *start_group_name;
59 GKeyFileGroup *current_group;
61 GString *parse_buffer; /* Holds up to one line of not-yet-parsed data */
63 /* Used for sizing the output buffer during serialization
65 gsize approximate_size;
74 const gchar *name; /* NULL for above first group (which will be comments) */
76 GList *key_value_pairs;
78 /* Used in parallel with key_value_pairs for
79 * increased lookup performance
81 GHashTable *lookup_map;
86 gchar *key; /* NULL for comments */
88 } GKeyFileKeyValuePair;
90 static gint find_file_in_data_dirs (const gchar *file,
94 static void g_key_file_load_from_fd (GKeyFile *key_file,
98 static GKeyFileGroup *g_key_file_lookup_group (GKeyFile *key_file,
99 const gchar *group_name);
100 static GKeyFileKeyValuePair *g_key_file_lookup_key_value_pair (GKeyFile *key_file,
101 GKeyFileGroup *group,
103 static void g_key_file_remove_group_node (GKeyFile *entry,
105 static void g_key_file_add_key (GKeyFile *entry,
106 const gchar *group_name,
109 static void g_key_file_add_group (GKeyFile *entry,
110 const gchar *group_name);
111 static void g_key_file_key_value_pair_free (GKeyFileKeyValuePair *pair);
112 static gboolean g_key_file_line_is_comment (const gchar *line);
113 static gboolean g_key_file_line_is_group (const gchar *line);
114 static gboolean g_key_file_line_is_key_value_pair (const gchar *line);
115 static gchar *g_key_file_parse_value_as_string (GKeyFile *entry,
119 static gchar *g_key_file_parse_string_as_value (GKeyFile *entry,
121 gboolean escape_separator);
122 static gint g_key_file_parse_value_as_integer (GKeyFile *entry,
125 static gchar *g_key_file_parse_integer_as_value (GKeyFile *entry,
127 static gboolean g_key_file_parse_value_as_boolean (GKeyFile *entry,
130 static gchar *g_key_file_parse_boolean_as_value (GKeyFile *entry,
132 static void g_key_file_parse_key_value_pair (GKeyFile *entry,
136 static void g_key_file_parse_comment (GKeyFile *entry,
140 static void g_key_file_parse_group (GKeyFile *entry,
144 static gchar *key_get_locale (const gchar *key);
145 static void g_key_file_parse_data (GKeyFile *entry,
149 static void g_key_file_flush_parse_buffer (GKeyFile *entry,
154 g_key_file_error_quark (void)
156 static GQuark error_quark = 0;
158 if (error_quark == 0)
159 error_quark = g_quark_from_static_string ("g-key-file-error-quark");
165 g_key_file_init (GKeyFile *key_file)
167 key_file->current_group = g_new0 (GKeyFileGroup, 1);
168 key_file->groups = g_list_prepend (NULL, key_file->current_group);
169 key_file->start_group_name = NULL;
170 key_file->parse_buffer = g_string_sized_new (128);
171 key_file->approximate_size = 0;
172 key_file->list_separator = ';';
177 g_key_file_clear (GKeyFile *key_file)
179 GList *tmp, *group_node;
181 if (key_file->parse_buffer)
182 g_string_free (key_file->parse_buffer, TRUE);
184 g_free (key_file->start_group_name);
186 tmp = key_file->groups;
191 g_key_file_remove_group_node (key_file, group_node);
194 g_assert (key_file->groups == NULL);
200 * @flags: flags from #GKeyFileFlags
202 * Creates a new empty #GKeyFile object. Use g_key_file_load_from_file(),
203 * g_key_file_load_from_data() or g_key_file_load_from_data_dirs() to
204 * read an existing key file.
206 * Return value: an empty #GKeyFile.
211 g_key_file_new (void)
215 key_file = g_new0 (GKeyFile, 1);
216 g_key_file_init (key_file);
222 * g_key_file_set_list_separator:
223 * @key_file: a #GKeyFile
224 * @separator: the separator
226 * Sets the character which is used to separate
227 * values in lists. Typically ';' or ',' are used
228 * as separators. The default list separator is ';'.
233 g_key_file_set_list_separator (GKeyFile *key_file,
236 key_file->list_separator = separator;
240 /* Iterates through all the directories in *dirs trying to
241 * open file. When it successfully locates and opens a file it
242 * returns the file descriptor to the open file. It also
243 * outputs the absolute path of the file in output_file and
244 * leaves the unchecked directories in *dirs.
247 find_file_in_data_dirs (const gchar *file,
252 gchar **data_dirs, *data_dir, *path;
265 while (data_dirs && (data_dir = *data_dirs) && fd < 0)
267 gchar *candidate_file, *sub_dir;
269 candidate_file = (gchar *) file;
270 sub_dir = g_strdup ("");
271 while (candidate_file != NULL && fd < 0)
275 path = g_build_filename (data_dir, sub_dir,
276 candidate_file, NULL);
278 fd = open (path, O_RDONLY);
280 if (output_file != NULL)
281 *output_file = g_strdup (path);
285 if (fd < 0 && file_error == NULL)
286 file_error = g_error_new (G_KEY_FILE_ERROR,
287 G_KEY_FILE_ERROR_NOT_FOUND,
288 _("Valid key file could not be "
289 "found in data dirs"));
291 candidate_file = strchr (candidate_file, '-');
293 if (candidate_file == NULL)
299 sub_dir = g_strndup (file, candidate_file - file - 1);
301 for (p = sub_dir; *p != '\0'; p++)
304 *p = G_DIR_SEPARATOR;
316 g_error_free (file_error);
318 g_propagate_error (error, file_error);
321 if (output_file && fd < 0)
323 g_free (*output_file);
331 g_key_file_load_from_fd (GKeyFile *key_file,
336 GError *key_file_error = NULL;
338 struct stat stat_buf;
339 gchar read_buf[4096];
341 if (key_file->approximate_size > 0)
343 g_key_file_clear (key_file);
344 g_key_file_init (key_file);
346 key_file->flags = flags;
348 fstat (fd, &stat_buf);
349 if (stat_buf.st_size == 0)
351 g_set_error (error, G_KEY_FILE_ERROR,
352 G_KEY_FILE_ERROR_PARSE,
357 key_file->start_group_name = NULL;
362 bytes_read = read (fd, read_buf, 4096);
364 if (bytes_read == 0) /* End of File */
372 g_set_error (error, G_FILE_ERROR,
373 g_file_error_from_errno (errno),
374 _("Failed to read from file: %s"),
380 g_key_file_parse_data (key_file,
381 read_buf, bytes_read,
384 while (!key_file_error);
390 g_propagate_error (error, key_file_error);
394 g_key_file_flush_parse_buffer (key_file, &key_file_error);
398 g_propagate_error (error, key_file_error);
404 * g_key_file_load_from_file:
405 * @key_file: an empty #GKeyFile struct
406 * @file: the path of a filename to load
407 * @flags: flags from #GKeyFileFlags
408 * @error: return location for a #GError, or %NULL
410 * Loads a key file into an empty #GKeyFile structure.
411 * If the file could not be loaded then %error is set to
412 * either a #GFileError or #GKeyFileError.
417 g_key_file_load_from_file (GKeyFile *key_file,
422 GError *key_file_error = NULL;
425 fd = open (file, O_RDONLY);
429 g_set_error (error, G_FILE_ERROR,
430 g_file_error_from_errno (errno),
431 _("Failed to open file '%s': %s"),
432 file, g_strerror (errno));
436 if (!g_file_test (file, G_FILE_TEST_IS_REGULAR))
438 g_set_error (error, G_FILE_ERROR,
440 _("Not a regular file: '%s'"),
445 g_key_file_load_from_fd (key_file, fd, flags, &key_file_error);
448 g_propagate_error (error, key_file_error);
452 * g_key_file_load_from_data:
453 * @key_file: an empty #GKeyFile struct
454 * @data: key file loaded in memory.
455 * @length: the length of @data in bytes
456 * @flags: flags from #GKeyFileFlags
457 * @error: return location for a #GError, or %NULL
459 * Loads a key file from memory into an empty #GKeyFile structure.
460 * If the object cannot be created then %error is set to a #GKeyFileError.
465 g_key_file_load_from_data (GKeyFile *key_file,
471 GError *key_file_error = NULL;
473 g_return_if_fail (data != NULL);
474 g_return_if_fail (length != 0);
476 if (key_file->approximate_size > 0)
478 g_key_file_clear (key_file);
479 g_key_file_init (key_file);
481 key_file->flags = flags;
483 g_key_file_parse_data (key_file, data, length, &key_file_error);
487 g_propagate_error (error, key_file_error);
491 g_key_file_flush_parse_buffer (key_file, &key_file_error);
494 g_propagate_error (error, key_file_error);
498 * g_key_file_load_from_data_dirs:
499 * @key_file: an empty #GKeyFile struct
500 * @file: a relative path to a filename to open and parse
501 * @full_path: return location for a string containing the full path
502 * of the file, or %NULL
503 * @flags: flags from #GKeyFileFlags
504 * @error: return location for a #GError, or %NULL
506 * This function looks for a key file named @file in the paths
507 * returned from g_get_user_data_dir() and g_get_system_data_dirs(),
508 * loads the file into @key_file and returns the file's full path in
509 * @full_path. If the file could not be loaded then an %error is
510 * set to either a #GFileError or #GKeyFileError.
515 g_key_file_load_from_data_dirs (GKeyFile *key_file,
521 GError *key_file_error = NULL;
522 gchar **all_data_dirs, **data_dirs;
523 const gchar * user_data_dir;
524 const const gchar * const * system_data_dirs;
529 g_return_if_fail (!g_path_is_absolute (file));
531 user_data_dir = g_get_user_data_dir ();
532 system_data_dirs = g_get_system_data_dirs ();
533 all_data_dirs = g_new (gchar *, g_strv_length ((gchar **)system_data_dirs) + 1);
536 all_data_dirs[i++] = g_strdup (user_data_dir);
539 while (system_data_dirs[j] != NULL)
540 all_data_dirs[i++] = g_strdup (system_data_dirs[j++]);
542 data_dirs = all_data_dirs;
543 while (*data_dirs != NULL)
545 fd = find_file_in_data_dirs (file, &output_path, &data_dirs,
551 g_propagate_error (error, key_file_error);
556 g_key_file_load_from_fd (key_file, fd, flags,
561 g_propagate_error (error, key_file_error);
562 g_free (output_path);
568 *full_path = output_path;
571 g_strfreev (all_data_dirs);
576 * @key_file: a #GKeyFile
583 g_key_file_free (GKeyFile *key_file)
585 g_return_if_fail (key_file != NULL);
587 g_key_file_clear (key_file);
591 /* If G_KEY_FILE_KEEP_TRANSLATIONS is not set, only returns
592 * true for locales that match those in g_get_language_names().
595 g_key_file_locale_is_interesting (GKeyFile *key_file,
598 const const gchar * const * current_locales;
601 if (key_file->flags & G_KEY_FILE_KEEP_TRANSLATIONS)
604 current_locales = g_get_language_names ();
606 for (i = 0; current_locales[i] != NULL; i++)
608 if (g_ascii_strcasecmp (current_locales[i], locale) == 0)
616 g_key_file_parse_line (GKeyFile *key_file,
621 GError *parse_error = NULL;
624 g_return_if_fail (key_file != NULL);
625 g_return_if_fail (line != NULL);
627 line_start = (gchar *) line;
628 while (g_ascii_isspace (*line_start))
631 if (g_key_file_line_is_comment (line_start))
632 g_key_file_parse_comment (key_file, line, length, &parse_error);
633 else if (g_key_file_line_is_group (line_start))
634 g_key_file_parse_group (key_file, line_start,
635 length - (line_start - line),
637 else if (g_key_file_line_is_key_value_pair (line_start))
638 g_key_file_parse_key_value_pair (key_file, line_start,
639 length - (line_start - line),
643 g_set_error (error, G_KEY_FILE_ERROR,
644 G_KEY_FILE_ERROR_PARSE,
645 _("Key file contains line '%s' which is not "
646 "a key-value pair, group, or comment"), line);
651 g_propagate_error (error, parse_error);
655 g_key_file_parse_comment (GKeyFile *key_file,
660 GKeyFileKeyValuePair *pair;
662 if (!key_file->flags & G_KEY_FILE_KEEP_COMMENTS)
665 g_assert (key_file->current_group != NULL);
667 pair = g_new0 (GKeyFileKeyValuePair, 1);
670 pair->value = g_strndup (line, length);
672 key_file->current_group->key_value_pairs =
673 g_list_prepend (key_file->current_group->key_value_pairs, pair);
677 g_key_file_parse_group (GKeyFile *key_file,
683 const gchar *group_name_start, *group_name_end;
685 /* advance past opening '['
687 group_name_start = line + 1;
688 group_name_end = line + length - 1;
690 while (*group_name_end != ']')
693 group_name = g_strndup (group_name_start,
694 group_name_end - group_name_start);
696 if (key_file->start_group_name == NULL)
697 key_file->start_group_name = g_strdup (group_name);
699 g_key_file_add_group (key_file, group_name);
704 g_key_file_parse_key_value_pair (GKeyFile *key_file,
709 gchar *key, *value, *key_end, *value_start, *locale;
710 gsize key_len, value_len;
712 if (key_file->current_group == NULL || key_file->current_group->name == NULL)
714 g_set_error (error, G_KEY_FILE_ERROR,
715 G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
716 _("Key file does not start with a group"));
720 key_end = value_start = strchr (line, '=');
722 g_assert (key_end != NULL);
727 /* Pull the key name from the line (chomping trailing whitespace)
729 while (g_ascii_isspace (*key_end))
732 key_len = key_end - line + 2;
734 g_assert (key_len <= length);
736 key = g_strndup (line, key_len - 1);
738 /* Pull the value from the line (chugging leading whitespace)
740 while (g_ascii_isspace (*value_start))
743 value_len = line + length - value_start + 1;
745 value = g_strndup (value_start, value_len);
747 if (!g_utf8_validate (value, -1, NULL))
749 g_set_error (error, G_KEY_FILE_ERROR,
750 G_KEY_FILE_ERROR_UNKNOWN_ENCODING,
751 _("Key file contains line '%s' "
752 "which is not UTF-8"), line);
759 if (key_file->current_group
760 && key_file->current_group->name
761 && strcmp (g_key_file_get_start_group (key_file),
762 key_file->current_group->name) == 0
763 && strcmp (key, "Encoding") == 0)
765 if (g_ascii_strcasecmp (value, "UTF-8") != 0)
767 g_set_error (error, G_KEY_FILE_ERROR,
768 G_KEY_FILE_ERROR_UNKNOWN_ENCODING,
769 _("Key file contains unsupported encoding '%s'"), value);
777 /* Is this key a translation? If so, is it one that we care about?
779 locale = key_get_locale (key);
781 if (locale == NULL || g_key_file_locale_is_interesting (key_file, locale))
782 g_key_file_add_key (key_file, key_file->current_group->name, key, value);
790 key_get_locale (const gchar *key)
794 locale = g_strrstr (key, "[");
796 if (locale && strlen (locale) <= 2)
800 locale = g_strndup (locale + 1, strlen (locale) - 2);
806 g_key_file_parse_data (GKeyFile *key_file,
814 g_return_if_fail (key_file != NULL);
818 for (i = 0; i < length; i++)
822 /* When a newline is encountered flush the parse buffer so that the
823 * line can be parsed. Note that completely blank lines won't show
824 * up in the parse buffer, so they get parsed directly.
826 if (key_file->parse_buffer->len > 0)
827 g_key_file_flush_parse_buffer (key_file, &parse_error);
829 g_key_file_parse_comment (key_file, "", 1, &parse_error);
833 g_propagate_error (error, parse_error);
838 g_string_append_c (key_file->parse_buffer, data[i]);
841 key_file->approximate_size += length;
845 g_key_file_flush_parse_buffer (GKeyFile *key_file,
848 GError *file_error = NULL;
850 g_return_if_fail (key_file != NULL);
854 if (key_file->parse_buffer->len > 0)
856 g_key_file_parse_line (key_file, key_file->parse_buffer->str,
857 key_file->parse_buffer->len,
859 g_string_erase (key_file->parse_buffer, 0, -1);
863 g_propagate_error (error, file_error);
870 * g_key_file_to_data:
871 * @key_file: a #GKeyFile
872 * @length: return location for the length of the
873 * returned string, or %NULL
874 * @error: return location for a #GError, or %NULL
876 * This function outputs @key_file as a string.
878 * Return value: a newly allocated string holding
879 * the contents of the #GKeyFile
884 g_key_file_to_data (GKeyFile *key_file,
888 GString *data_string;
890 GList *group_node, *key_file_node;
892 g_return_val_if_fail (key_file != NULL, NULL);
894 data_string = g_string_sized_new (2 * key_file->approximate_size);
896 for (group_node = g_list_last (key_file->groups);
898 group_node = group_node->prev)
900 GKeyFileGroup *group;
902 group = (GKeyFileGroup *) group_node->data;
904 if (group->name != NULL)
905 g_string_append_printf (data_string, "[%s]\n", group->name);
907 for (key_file_node = g_list_last (group->key_value_pairs);
908 key_file_node != NULL;
909 key_file_node = key_file_node->prev)
911 GKeyFileKeyValuePair *pair;
913 pair = (GKeyFileKeyValuePair *) key_file_node->data;
915 if (pair->key != NULL)
916 g_string_append_printf (data_string, "%s=%s\n", pair->key, pair->value);
918 g_string_append_printf (data_string, "%s\n", pair->value);
923 *length = data_string->len;
925 data = data_string->str;
927 g_string_free (data_string, FALSE);
933 * g_key_file_get_keys:
934 * @key_file: a #GKeyFile
935 * @group_name: a group name, or %NULL
936 * @length: return location for the number of keys returned, or %NULL
937 * @error: return location for a #GError, or %NULL
939 * Returns all keys for the group name @group_name. If @group_name is
940 * %NULL, the start group is used. The array of returned keys will be
941 * %NULL-terminated, so @length may optionally be %NULL.
943 * Return value: a newly-allocated %NULL-terminated array of
944 * strings. Use g_strfreev() to free it.
949 g_key_file_get_keys (GKeyFile *key_file,
950 const gchar *group_name,
954 GKeyFileGroup *group;
959 g_return_val_if_fail (key_file != NULL, NULL);
961 if (group_name == NULL)
962 group_name = (const gchar *) key_file->start_group_name;
964 group = g_key_file_lookup_group (key_file, group_name);
968 g_set_error (error, G_KEY_FILE_ERROR,
969 G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
970 _("Key file does not have group '%s'"),
975 num_keys = g_list_length (group->key_value_pairs);
977 keys = (gchar **) g_new (gchar **, num_keys + 1);
979 tmp = group->key_value_pairs;
980 for (i = 0; i < num_keys; i++)
982 GKeyFileKeyValuePair *pair;
984 pair = (GKeyFileKeyValuePair *) tmp->data;
985 keys[i] = g_strdup (pair->key);
998 * g_key_file_get_start_group:
999 * @key_file: a #GKeyFile
1001 * Returns the name of the start group of the file.
1003 * Return value: The start group of the key file.
1008 g_key_file_get_start_group (GKeyFile *key_file)
1010 g_return_val_if_fail (key_file != NULL, NULL);
1012 if (key_file->start_group_name)
1013 return g_strdup (key_file->start_group_name);
1019 * g_key_file_get_groups:
1020 * @key_file: a #GKeyFile
1021 * @length: return location for the number of returned groups, or %NULL
1023 * Returns all groups in the key file loaded with @key_file. The
1024 * array of returned groups will be %NULL-terminated, so @length may
1025 * optionally be %NULL.
1027 * Return value: a newly-allocated %NULL-terminated array of strings.
1028 * Use g_strfreev() to free it.
1032 g_key_file_get_groups (GKeyFile *key_file,
1037 gsize i, num_groups;
1039 g_return_val_if_fail (key_file != NULL, NULL);
1041 num_groups = g_list_length (key_file->groups);
1042 groups = (gchar **) g_new (gchar **, num_groups + 1);
1044 tmp = key_file->groups;
1045 for (i = 0; i < num_groups; i++)
1047 GKeyFileGroup *group;
1049 group = (GKeyFileGroup *) tmp->data;
1050 groups[i] = g_strdup (group->name);
1057 *length = num_groups;
1063 * g_key_file_get_value:
1064 * @key_file: a #GKeyFile
1065 * @group_name: a group name
1067 * @error: return location for a #GError, or #NULL
1069 * Returns the value associated with @key under @group_name.
1070 * In the event the key cannot be found, %NULL is returned and
1071 * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the
1072 * event that the @group_name cannot be found, %NULL is returned
1073 * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND.
1075 * Return value: a string or %NULL if the specified key cannot be
1081 g_key_file_get_value (GKeyFile *key_file,
1082 const gchar *group_name,
1086 GKeyFileGroup *group;
1087 GKeyFileKeyValuePair *pair;
1088 gchar *value = NULL;
1090 if (group_name == NULL)
1091 group_name = (const gchar *) key_file->start_group_name;
1093 group = g_key_file_lookup_group (key_file, group_name);
1097 g_set_error (error, G_KEY_FILE_ERROR,
1098 G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
1099 _("Key file does not have group '%s'"),
1104 pair = g_key_file_lookup_key_value_pair (key_file, group, key);
1107 value = g_strdup (pair->value);
1109 g_set_error (error, G_KEY_FILE_ERROR,
1110 G_KEY_FILE_ERROR_KEY_NOT_FOUND,
1111 _("Key file does not have key '%s'"), key);
1117 * g_key_file_set_value:
1118 * @key_file: a #GKeyFile
1119 * @group_name: a group name
1123 * Associates a new value with @key under @group_name.
1124 * If @key cannot be found then it is created. If @group_name
1125 * cannot be found then it is created as well.
1130 g_key_file_set_value (GKeyFile *key_file,
1131 const gchar *group_name,
1135 GKeyFileGroup *group;
1136 GKeyFileKeyValuePair *pair;
1140 if (group_name == NULL)
1141 group_name = (const gchar *) key_file->start_group_name;
1143 if (!g_key_file_has_key (key_file, group_name, key, NULL))
1144 g_key_file_add_key (key_file, group_name, key, value);
1147 group = g_key_file_lookup_group (key_file, group_name);
1148 pair = g_key_file_lookup_key_value_pair (key_file, group, key);
1149 g_free (pair->value);
1150 pair->value = g_strdup (value);
1155 * g_key_file_get_string:
1156 * @key_file: a #GKeyFile
1157 * @group_name: a group name
1159 * @error: return location for a #GError, or #NULL
1161 * Returns the value associated with @key under @group_name.
1162 * In the event the key cannot be found, %NULL is returned and
1163 * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the
1164 * event that the @group_name cannot be found, %NULL is returned
1165 * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND.
1167 * Return value: a string or %NULL if the specified key cannot be
1173 g_key_file_get_string (GKeyFile *key_file,
1174 const gchar *group_name,
1178 gchar *value, *string_value;
1179 GError *key_file_error;
1181 g_return_val_if_fail (key_file != NULL, NULL);
1182 g_return_val_if_fail (key != NULL, NULL);
1184 key_file_error = NULL;
1186 value = g_key_file_get_value (key_file, group_name, key, &key_file_error);
1190 g_propagate_error (error, key_file_error);
1194 string_value = g_key_file_parse_value_as_string (key_file, value, NULL,
1200 if (g_error_matches (key_file_error,
1202 G_KEY_FILE_ERROR_INVALID_VALUE))
1204 g_set_error (error, G_KEY_FILE_ERROR,
1205 G_KEY_FILE_ERROR_INVALID_VALUE,
1206 _("Key file contains key '%s' "
1207 "which has value that cannot be interpreted."),
1209 g_error_free (key_file_error);
1212 g_propagate_error (error, key_file_error);
1215 return string_value;
1219 * g_key_file_set_string:
1220 * @key_file: a #GKeyFile
1221 * @group_name: a group name
1225 * Associates a new string value with @key under @group_name.
1226 * If @key cannot be found then it is created. If @group_name
1227 * cannot be found then it is created as well.
1232 g_key_file_set_string (GKeyFile *key_file,
1233 const gchar *group_name,
1235 const gchar *string)
1239 g_return_if_fail (key_file != NULL);
1240 g_return_if_fail (key != NULL);
1242 value = g_key_file_parse_string_as_value (key_file, string, FALSE);
1243 g_key_file_set_value (key_file, group_name, key, value);
1248 * g_key_file_get_string_list:
1249 * @key_file: a #GKeyFile
1250 * @group_name: a group name
1252 * @length: return location for the number of returned strings, or %NULL
1253 * @error: return location for a #GError, or %NULL
1255 * Returns the values associated with @key under @group_name.
1256 * In the event the key cannot be found, %NULL is returned and
1257 * @error is set to #G_KEY_FILE_ERROR_KEY_NOT_FOUND. In the
1258 * event that the @group_name cannot be found, %NULL is returned
1259 * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND.
1261 * Return value: a %NULL-terminated string array or %NULL if the specified
1262 * key cannot be found. The array should be freed with g_strfreev().
1267 g_key_file_get_string_list (GKeyFile *key_file,
1268 const gchar *group_name,
1273 GError *key_file_error = NULL;
1274 gchar *value, *string_value, **values;
1276 GSList *p, *pieces = NULL;
1278 value = g_key_file_get_value (key_file, group_name, key, &key_file_error);
1282 g_propagate_error (error, key_file_error);
1286 string_value = g_key_file_parse_value_as_string (key_file, value, &pieces, &key_file_error);
1288 g_free (string_value);
1292 if (g_error_matches (key_file_error,
1294 G_KEY_FILE_ERROR_INVALID_VALUE))
1296 g_set_error (error, G_KEY_FILE_ERROR,
1297 G_KEY_FILE_ERROR_INVALID_VALUE,
1298 _("Key file contains key '%s' "
1299 "which has value that cannot be interpreted."),
1301 g_error_free (key_file_error);
1304 g_propagate_error (error, key_file_error);
1307 len = g_slist_length (pieces);
1308 values = g_new (gchar *, len + 1);
1309 for (p = pieces, i = 0; p; p = p->next)
1310 values[i++] = p->data;
1313 g_slist_free (pieces);
1322 * g_key_file_set_string_list:
1323 * @key_file: a #GKeyFile
1324 * @group_name: a group name
1326 * @list: an array of locale string values
1327 * @length: number of locale string values in @list
1329 * Associates a list of string values for @key under @group_name.
1330 * If the @key cannot be found then it is created.
1335 g_key_file_set_string_list (GKeyFile *key_file,
1336 const gchar *group_name,
1338 const gchar * const list[],
1341 GString *value_list;
1344 g_return_if_fail (key_file != NULL);
1345 g_return_if_fail (key != NULL);
1347 value_list = g_string_sized_new (length * 128);
1348 for (i = 0; list[i] != NULL && i < length; i++)
1352 value = g_key_file_parse_string_as_value (key_file, list[i], TRUE);
1353 g_string_append (value_list, value);
1354 g_string_append_c (value_list, key_file->list_separator);
1359 g_key_file_set_value (key_file, group_name, key, value_list->str);
1360 g_string_free (value_list, TRUE);
1364 * g_key_file_set_locale_string:
1365 * @key_file: a #GKeyFile
1366 * @group_name: a group name
1371 * Associates a string value for @key and @locale under
1372 * @group_name. If the translation for @key cannot be found
1373 * then it is created.
1378 g_key_file_set_locale_string (GKeyFile *key_file,
1379 const gchar *group_name,
1381 const gchar *locale,
1382 const gchar *string)
1384 gchar *full_key, *value;
1386 g_return_if_fail (key_file != NULL);
1387 g_return_if_fail (key != NULL);
1389 value = g_key_file_parse_string_as_value (key_file, string, FALSE);
1390 full_key = g_strdup_printf ("%s[%s]", key, locale);
1391 g_key_file_set_value (key_file, group_name, full_key, value);
1396 extern GSList *_g_compute_locale_variants (const gchar *locale);
1399 * g_key_file_get_locale_string:
1400 * @key_file: a #GKeyFile
1401 * @group_name: a group name
1403 * @locale: a locale or %NULL
1404 * @error: return location for a #GError, or %NULL
1406 * Returns the value associated with @key under @group_name
1407 * translated in the given @locale if available. If @locale is
1408 * %NULL then the current locale is assumed. If @key cannot be
1409 * found then %NULL is returned and @error is set to
1410 * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the value associated
1411 * with @key cannot be interpreted or no suitable translation can
1412 * be found then the untranslated value is returned and @error is
1413 * set to #G_KEY_FILE_ERROR_INVALID_VALUE and
1414 * #G_KEY_FILE_ERROR_KEY_NOT_FOUND, respectively. In the
1415 * event that the @group_name cannot be found, %NULL is returned
1416 * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND.
1418 * Return value: a string or %NULL if the specified key cannot be
1423 g_key_file_get_locale_string (GKeyFile *key_file,
1424 const gchar *group_name,
1426 const gchar *locale,
1429 gchar *candidate_key, *translated_value;
1430 GError *key_file_error;
1432 gboolean free_languages = FALSE;
1435 candidate_key = NULL;
1436 translated_value = NULL;
1437 key_file_error = NULL;
1439 if (!g_key_file_has_group (key_file, group_name))
1441 g_set_error (error, G_KEY_FILE_ERROR,
1442 G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
1443 _("Key file does not have group '%s'"),
1452 list = _g_compute_locale_variants (locale);
1454 languages = g_new0 (gchar *, g_slist_length (list) + 1);
1455 for (l = list, i = 0; l; l = l->next, i++)
1456 languages[i] = l->data;
1457 languages[i] = NULL;
1459 g_slist_free (list);
1460 free_languages = TRUE;
1464 languages = (gchar **) g_get_language_names ();
1465 free_languages = FALSE;
1468 for (i = 0; languages[i]; i++)
1470 candidate_key = g_strdup_printf ("%s[%s]", key, languages[i]);
1472 translated_value = g_key_file_get_string (key_file,
1474 candidate_key, NULL);
1475 g_free (candidate_key);
1477 if (translated_value)
1481 if (translated_value && !g_utf8_validate (translated_value, -1, NULL))
1483 g_set_error (error, G_KEY_FILE_ERROR,
1484 G_KEY_FILE_ERROR_INVALID_VALUE,
1485 _("Key file contains key '%s' "
1486 "which has value that cannot be interpreted."),
1488 g_free (translated_value);
1489 translated_value = NULL;
1492 /* Fallback to untranslated key
1494 if (!translated_value)
1496 translated_value = g_key_file_get_string (key_file, group_name, key,
1499 if (!translated_value)
1500 g_propagate_error (error, key_file_error);
1502 g_set_error (error, G_KEY_FILE_ERROR,
1503 G_KEY_FILE_ERROR_KEY_NOT_FOUND,
1504 _("Key file contains no translated value "
1505 "for key '%s' with locale '%s'."),
1510 g_strfreev (languages);
1512 return translated_value;
1516 * g_key_file_get_locale_string_list:
1517 * @key_file: a #GKeyFile
1518 * @group_name: a group name
1521 * @length: return location for the number of returned strings or %NULL
1522 * @error: return location for a #GError or %NULL
1524 * Returns the values associated with @key under @group_name
1525 * translated in the given @locale if available. If @locale is
1526 * %NULL then the current locale is assumed. If @key cannot be
1527 * found then %NULL is returned and @error is set to
1528 * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. If the values associated
1529 * with @key cannot be interpreted or no suitable translations
1530 * can be found then the untranslated values are returned and
1531 * @error is set to #G_KEY_FILE_ERROR_INVALID_VALUE and
1532 * #G_KEY_FILE_ERROR_KEY_NOT_FOUND, respectively. In the
1533 * event that the @group_name cannot be found, %NULL is returned
1534 * and @error is set to #G_KEY_FILE_ERROR_GROUP_NOT_FOUND.
1535 * The returned array is %NULL-terminated, so @length may optionally be %NULL.
1537 * Return value: a newly allocated %NULL-terminated string array
1538 * or %NULL if the key isn't found. The string array should be freed
1539 * with g_strfreev().
1544 g_key_file_get_locale_string_list (GKeyFile *key_file,
1545 const gchar *group_name,
1547 const gchar *locale,
1551 GError *key_file_error;
1552 gchar **values, *value;
1554 key_file_error = NULL;
1556 value = g_key_file_get_locale_string (key_file, group_name,
1561 g_propagate_error (error, key_file_error);
1566 if (value[strlen (value) - 1] == ';')
1567 value[strlen (value) - 1] = '\0';
1569 values = g_strsplit (value, ";", 0);
1574 *length = g_strv_length (values);
1580 * g_key_file_set_locale_string_list:
1581 * @key_file: a #GKeyFile
1582 * @group_name: a group name
1585 * @list: a %NULL-terminated array of locale string values
1586 * @length: the length of @list
1588 * Associates a list of string values for @key and @locale under
1589 * @group_name. If the translation for @key cannot be found then
1595 g_key_file_set_locale_string_list (GKeyFile *key_file,
1596 const gchar *group_name,
1598 const gchar *locale,
1599 const gchar * const list[],
1602 GString *value_list;
1606 g_return_if_fail (key_file != NULL);
1607 g_return_if_fail (key != NULL);
1609 value_list = g_string_sized_new (length * 128);
1610 for (i = 0; list[i] != NULL && i < length; i++)
1614 value = g_key_file_parse_string_as_value (key_file, list[i], TRUE);
1616 g_string_append (value_list, value);
1617 g_string_append_c (value_list, ';');
1622 full_key = g_strdup_printf ("%s[%s]", key, locale);
1623 g_key_file_set_value (key_file, group_name, full_key, value_list->str);
1625 g_string_free (value_list, TRUE);
1629 * g_key_file_get_boolean:
1630 * @key_file: a #GKeyFile
1631 * @group_name: a group name
1633 * @error: return location for a #GError
1635 * Returns the value associated with @key under @group_name as a
1636 * boolean. If @key cannot be found then the return value is
1637 * undefined and @error is set to
1638 * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value
1639 * associated with @key cannot be interpreted as a boolean then
1640 * the return value is also undefined and @error is set to
1641 * #G_KEY_FILE_ERROR_INVALID_VALUE.
1643 * Return value: the value associated with the key as a boolean
1647 g_key_file_get_boolean (GKeyFile *key_file,
1648 const gchar *group_name,
1652 GError *key_file_error = NULL;
1654 gboolean bool_value;
1656 value = g_key_file_get_value (key_file, group_name, key, &key_file_error);
1660 g_propagate_error (error, key_file_error);
1664 bool_value = g_key_file_parse_value_as_boolean (key_file, value,
1670 if (g_error_matches (key_file_error,
1672 G_KEY_FILE_ERROR_INVALID_VALUE))
1674 g_set_error (error, G_KEY_FILE_ERROR,
1675 G_KEY_FILE_ERROR_INVALID_VALUE,
1676 _("Key file contains key '%s' "
1677 "which has value that cannot be interpreted."),
1679 g_error_free (key_file_error);
1682 g_propagate_error (error, key_file_error);
1689 * g_key_file_set_boolean:
1690 * @key_file: a #GKeyFile
1691 * @group_name: a group name
1693 * @value: %TRUE or %FALSE
1695 * Associates a new boolean value with @key under @group_name.
1696 * If @key cannot be found then it is created.
1701 g_key_file_set_boolean (GKeyFile *key_file,
1702 const gchar *group_name,
1708 g_return_if_fail (key_file != NULL);
1709 g_return_if_fail (key != NULL);
1711 result = g_key_file_parse_boolean_as_value (key_file, value);
1712 g_key_file_set_value (key_file, group_name, key, result);
1717 * g_key_file_get_boolean_list:
1718 * @key_file: a #GKeyFile
1719 * @group_name: a group name
1721 * @length: the number of booleans returned
1722 * @error: return location for a #GError
1724 * Returns the values associated with @key under @group_name as
1725 * booleans. If @key cannot be found then the return value is
1726 * undefined and @error is set to
1727 * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values
1728 * associated with @key cannot be interpreted as booleans then
1729 * the return value is also undefined and @error is set to
1730 * #G_KEY_FILE_ERROR_INVALID_VALUE.
1732 * Return value: the values associated with the key as a boolean
1735 g_key_file_get_boolean_list (GKeyFile *key_file,
1736 const gchar *group_name,
1741 GError *key_file_error;
1743 gboolean *bool_values;
1746 key_file_error = NULL;
1748 values = g_key_file_get_string_list (key_file, group_name, key,
1749 &num_bools, &key_file_error);
1752 g_propagate_error (error, key_file_error);
1757 bool_values = g_new (gboolean, num_bools);
1759 for (i = 0; i < num_bools; i++)
1761 bool_values[i] = g_key_file_parse_value_as_boolean (key_file,
1767 g_propagate_error (error, key_file_error);
1768 g_strfreev (values);
1769 g_free (bool_values);
1774 g_strfreev (values);
1777 *length = num_bools;
1783 * g_key_file_set_boolean_list:
1784 * @key_file: a #GKeyFile
1785 * @group_name: a group name
1787 * @list: an array of boolean values
1788 * @length: length of @list
1790 * Associates a list of boolean values with @key under
1791 * @group_name. If @key cannot be found then it is created.
1796 g_key_file_set_boolean_list (GKeyFile *key_file,
1797 const gchar *group_name,
1802 GString *value_list;
1805 g_return_if_fail (key_file != NULL);
1806 g_return_if_fail (key != NULL);
1808 value_list = g_string_sized_new (length * 8);
1809 for (i = 0; i < length; i++)
1813 value = g_key_file_parse_boolean_as_value (key_file, list[i]);
1815 g_string_append (value_list, value);
1816 g_string_append_c (value_list, key_file->list_separator);
1821 g_key_file_set_value (key_file, group_name, key, value_list->str);
1822 g_string_free (value_list, TRUE);
1826 * g_key_file_get_integer:
1827 * @key_file: a #GKeyFile
1828 * @group_name: a group name
1830 * @error: return location for a #GError
1832 * Returns the value associated with @key under @group_name as an
1833 * integer. If @key cannot be found then the return value is
1834 * undefined and @error is set to
1835 * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the value
1836 * associated with @key cannot be interpreted as an integer then
1837 * the return value is also undefined and @error is set to
1838 * #G_KEY_FILE_ERROR_INVALID_VALUE.
1840 * Return value: the value associated with the key as an integer.
1844 g_key_file_get_integer (GKeyFile *key_file,
1845 const gchar *group_name,
1849 GError *key_file_error;
1853 key_file_error = NULL;
1855 value = g_key_file_get_value (key_file, group_name, key, &key_file_error);
1859 g_propagate_error (error, key_file_error);
1863 int_value = g_key_file_parse_value_as_integer (key_file, value,
1869 if (g_error_matches (key_file_error,
1871 G_KEY_FILE_ERROR_INVALID_VALUE))
1873 g_set_error (error, G_KEY_FILE_ERROR,
1874 G_KEY_FILE_ERROR_INVALID_VALUE,
1875 _("Key file contains key '%s' in group '%s' "
1876 "which has value that cannot be interpreted."), key,
1878 g_error_free (key_file_error);
1881 g_propagate_error (error, key_file_error);
1888 * g_key_file_set_integer:
1889 * @key_file: a #GKeyFile
1890 * @group_name: a group name
1892 * @value: an integer value
1894 * Associates a new integer value with @key under @group_name.
1895 * If @key cannot be found then it is created.
1900 g_key_file_set_integer (GKeyFile *key_file,
1901 const gchar *group_name,
1907 g_return_if_fail (key_file != NULL);
1908 g_return_if_fail (key != NULL);
1910 result = g_key_file_parse_integer_as_value (key_file, value);
1911 g_key_file_set_value (key_file, group_name, key, result);
1916 * g_key_file_get_integer_list:
1917 * @key_file: a #GKeyFile
1918 * @group_name: a group name
1920 * @length: the number of integers returned
1921 * @error: return location for a #GError
1923 * Returns the values associated with @key under @group_name as
1924 * integers. If @key cannot be found then the return value is
1925 * undefined and @error is set to
1926 * #G_KEY_FILE_ERROR_KEY_NOT_FOUND. Likewise, if the values
1927 * associated with @key cannot be interpreted as integers then
1928 * the return value is also undefined and @error is set to
1929 * #G_KEY_FILE_ERROR_INVALID_VALUE.
1931 * Return value: the values associated with the key as a integer
1935 g_key_file_get_integer_list (GKeyFile *key_file,
1936 const gchar *group_name,
1941 GError *key_file_error = NULL;
1946 values = g_key_file_get_string_list (key_file, group_name, key,
1947 &num_ints, &key_file_error);
1950 g_propagate_error (error, key_file_error);
1955 int_values = g_new (gint, num_ints);
1957 for (i = 0; i < num_ints; i++)
1959 int_values[i] = g_key_file_parse_value_as_integer (key_file,
1965 g_propagate_error (error, key_file_error);
1966 g_strfreev (values);
1967 g_free (int_values);
1972 g_strfreev (values);
1981 * g_key_file_set_integer_list:
1982 * @key_file: a #GKeyFile
1983 * @group_name: a group name
1985 * @list: an array of integer values
1986 * @length: number of integer values in @list
1988 * Associates a list of integer values with @key under
1989 * @group_name. If @key cannot be found then it is created.
1994 g_key_file_set_integer_list (GKeyFile *key_file,
1995 const gchar *group_name,
2003 g_return_if_fail (key_file != NULL);
2004 g_return_if_fail (key != NULL);
2006 values = g_string_sized_new (length * 16);
2007 for (i = 0; i < length; i++)
2011 value = g_key_file_parse_integer_as_value (key_file, list[i]);
2013 g_string_append (values, value);
2014 g_string_append_c (values, ';');
2019 g_key_file_set_value (key_file, group_name, key, values->str);
2020 g_string_free (values, TRUE);
2024 * g_key_file_has_group:
2025 * @key_file: a #GKeyFile
2026 * @group_name: a group name
2028 * Looks whether the key file has the group @group_name.
2030 * Return value: %TRUE if @group_name is a part of @key_file, %FALSE
2035 g_key_file_has_group (GKeyFile *key_file,
2036 const gchar *group_name)
2039 GKeyFileGroup *group;
2041 g_return_val_if_fail (key_file != NULL, FALSE);
2042 g_return_val_if_fail (group_name != NULL, FALSE);
2044 for (tmp = key_file->groups; tmp != NULL; tmp = tmp->next)
2046 group = (GKeyFileGroup *) tmp->data;
2047 if (group && group->name && (strcmp (group->name, group_name) == 0))
2055 * g_key_file_has_key:
2056 * @key_file: a #GKeyFile
2057 * @group_name: a group name
2059 * @error: return location for a #GError
2061 * Looks whether the key file has the key @key in the group
2064 * Return value: %TRUE if @key is a part of @group_name, %FALSE
2069 g_key_file_has_key (GKeyFile *key_file,
2070 const gchar *group_name,
2074 GKeyFileKeyValuePair *pair;
2075 GKeyFileGroup *group;
2077 g_return_val_if_fail (key_file != NULL, FALSE);
2078 g_return_val_if_fail (key != NULL, FALSE);
2082 if (group_name == NULL)
2083 group_name = (const gchar *) key_file->start_group_name;
2085 group = g_key_file_lookup_group (key_file, group_name);
2089 g_set_error (error, G_KEY_FILE_ERROR,
2090 G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
2091 _("Key file does not have group '%s'"),
2097 pair = g_key_file_lookup_key_value_pair (key_file, group, key);
2099 return pair != NULL;
2103 g_key_file_add_group (GKeyFile *key_file,
2104 const gchar *group_name)
2106 GKeyFileGroup *group;
2108 g_return_if_fail (key_file != NULL);
2109 g_return_if_fail (group_name != NULL);
2110 g_return_if_fail (g_key_file_lookup_group (key_file, group_name) == NULL);
2112 group = g_new0 (GKeyFileGroup, 1);
2113 group->name = g_strdup (group_name);
2114 group->lookup_map = g_hash_table_new (g_str_hash, g_str_equal);
2115 key_file->groups = g_list_prepend (key_file->groups, group);
2116 key_file->approximate_size += strlen (group_name) + 3;
2117 key_file->current_group = group;
2119 if (key_file->start_group_name == NULL)
2120 key_file->start_group_name = g_strdup (group_name);
2125 g_key_file_key_value_pair_free (GKeyFileKeyValuePair *pair)
2130 g_free (pair->value);
2136 g_key_file_remove_group_node (GKeyFile *key_file,
2139 GKeyFileGroup *group;
2141 group = (GKeyFileGroup *) group_node->data;
2143 /* If the current group gets deleted make the current group the first
2146 if (key_file->current_group == group)
2150 first_group = key_file->groups;
2153 key_file->current_group = (GKeyFileGroup *) first_group->data;
2155 key_file->current_group = NULL;
2158 key_file->groups = g_list_remove_link (key_file->groups, group_node);
2160 if (group->name != NULL)
2161 key_file->approximate_size -= strlen (group->name) + 3;
2163 /* FIXME: approximate_size isn't getting updated for the
2164 * removed keys in group.
2166 g_list_foreach (group->key_value_pairs,
2167 (GFunc) g_key_file_key_value_pair_free, NULL);
2168 g_list_free (group->key_value_pairs);
2169 group->key_value_pairs = NULL;
2171 g_hash_table_destroy (group->lookup_map);
2172 group->lookup_map = NULL;
2174 g_free ((gchar *) group->name);
2176 g_list_free_1 (group_node);
2180 * g_key_file_remove_group:
2181 * @key_file: a #GKeyFile
2182 * @group_name: a group name
2183 * @error: return location for a #GError or %NULL
2185 * Removes the specified group, @group_name,
2186 * from the key file.
2191 g_key_file_remove_group (GKeyFile *key_file,
2192 const gchar *group_name,
2195 GKeyFileGroup *group;
2198 g_return_if_fail (key_file != NULL);
2199 g_return_if_fail (group_name != NULL);
2201 group = g_key_file_lookup_group (key_file, group_name);
2204 g_set_error (error, G_KEY_FILE_ERROR,
2205 G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
2206 _("Key file does not have group '%s'"),
2209 group_node = g_list_find (key_file->groups, group);
2210 g_key_file_remove_group_node (key_file, group_node);
2214 g_key_file_add_key (GKeyFile *key_file,
2215 const gchar *group_name,
2219 GKeyFileGroup *group;
2220 GKeyFileKeyValuePair *pair;
2222 group = g_key_file_lookup_group (key_file, group_name);
2226 g_key_file_add_group (key_file, group_name);
2227 group = (GKeyFileGroup *) key_file->groups->data;
2230 pair = g_new0 (GKeyFileKeyValuePair, 1);
2232 pair->key = g_strdup (key);
2233 pair->value = g_strdup (value);
2235 g_hash_table_replace (group->lookup_map, pair->key, pair);
2236 group->key_value_pairs = g_list_prepend (group->key_value_pairs, pair);
2237 key_file->approximate_size += strlen (key) + strlen (value) + 2;
2241 * g_key_file_remove_key:
2242 * @key_file: a #GKeyFile
2243 * @group_name: a group name
2244 * @key: a key name to remove
2245 * @error: return location for a #GError or %NULL
2247 * Removes @key in @group_name from the key file.
2252 g_key_file_remove_key (GKeyFile *key_file,
2253 const gchar *group_name,
2257 GKeyFileGroup *group;
2258 GKeyFileKeyValuePair *pair;
2262 if (group_name == NULL)
2263 group = key_file->current_group;
2265 group = g_key_file_lookup_group (key_file, group_name);
2269 g_set_error (error, G_KEY_FILE_ERROR,
2270 G_KEY_FILE_ERROR_GROUP_NOT_FOUND,
2271 _("Key file does not have group '%s'"),
2276 group->key_value_pairs = g_list_remove (group->key_value_pairs, key_file);
2277 pair = g_key_file_lookup_key_value_pair (key_file, group, key);
2281 g_set_error (error, G_KEY_FILE_ERROR,
2282 G_KEY_FILE_ERROR_KEY_NOT_FOUND,
2283 _("Key file does not have key '%s'"), key);
2287 g_hash_table_remove (group->lookup_map, pair->key);
2289 key_file->approximate_size -= strlen (pair->key) + strlen (pair->value) + 2;
2290 g_key_file_key_value_pair_free (pair);
2293 static GKeyFileGroup *
2294 g_key_file_lookup_group (GKeyFile *key_file,
2295 const gchar *group_name)
2297 GKeyFileGroup *group;
2301 for (tmp = key_file->groups; tmp != NULL; tmp = tmp->next)
2303 group = (GKeyFileGroup *) tmp->data;
2305 if (group && group->name && strcmp (group->name, group_name) == 0)
2314 static GKeyFileKeyValuePair *
2315 g_key_file_lookup_key_value_pair (GKeyFile *key_file,
2316 GKeyFileGroup *group,
2319 return (GKeyFileKeyValuePair *) g_hash_table_lookup (group->lookup_map, key);
2322 /* Lines starting with # or consisting entirely of whitespace are merely
2323 * recorded, not parsed. This function assumes all leading whitespace
2324 * has been stripped.
2327 g_key_file_line_is_comment (const gchar *line)
2329 return (*line == '#' || *line == '\0' || *line == '\n');
2332 /* A group in a key file is made up of a starting '[' followed by one
2333 * or more letters making up the group name followed by ']'.
2336 g_key_file_line_is_group (const gchar *line)
2344 p = g_utf8_next_char (p);
2349 p = g_utf8_next_char (p);
2351 /* Group name must be non-empty
2356 while (*p && *p != ']')
2357 p = g_utf8_next_char (p);
2366 g_key_file_line_is_key_value_pair (const gchar *line)
2370 p = (gchar *) g_utf8_strchr (line, -1, '=');
2375 /* Key must be non-empty
2384 g_key_file_parse_value_as_string (GKeyFile *key_file,
2389 GError *parse_error = NULL;
2390 gchar *string_value, *p, *q0, *q;
2392 string_value = g_new (gchar, strlen (value) + 1);
2394 p = (gchar *) value;
2395 q0 = q = string_value;
2425 if (pieces && *p == key_file->list_separator)
2426 *q = key_file->list_separator;
2432 if (parse_error == NULL)
2440 g_set_error (error, G_KEY_FILE_ERROR,
2441 G_KEY_FILE_ERROR_INVALID_VALUE,
2442 _("Key file contains invalid escape "
2443 "sequence '%s'"), sequence);
2452 if (pieces && (*p == key_file->list_separator))
2454 *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0));
2463 if (p[-1] == '\\' && error == NULL)
2464 g_set_error (error, G_KEY_FILE_ERROR,
2465 G_KEY_FILE_ERROR_INVALID_VALUE,
2466 _("Key file contains escape character at end of line"));
2472 *pieces = g_slist_prepend (*pieces, g_strndup (q0, q - q0));
2473 *pieces = g_slist_reverse (*pieces);
2476 return string_value;
2480 g_key_file_parse_string_as_value (GKeyFile *key_file,
2481 const gchar *string,
2482 gboolean escape_separator)
2484 gchar *value, *p, *q;
2487 length = strlen (string) + 1;
2489 /* Worst case would be that every character needs to be escaped.
2490 * In other words every character turns to two characters
2492 value = g_new (gchar, 2 * length);
2494 p = (gchar *) string;
2496 while (p < (string + length - 1))
2498 gchar escaped_character[3] = { '\\', 0, 0 };
2503 escaped_character[1] = 's';
2504 strcpy (q, escaped_character);
2508 escaped_character[1] = 'n';
2509 strcpy (q, escaped_character);
2513 escaped_character[1] = 't';
2514 strcpy (q, escaped_character);
2518 escaped_character[1] = 'r';
2519 strcpy (q, escaped_character);
2523 escaped_character[1] = '\\';
2524 strcpy (q, escaped_character);
2528 if (escape_separator && *p == key_file->list_separator)
2530 escaped_character[1] = key_file->list_separator;
2531 strcpy (q, escaped_character);
2549 g_key_file_parse_value_as_integer (GKeyFile *key_file,
2553 gchar *end_of_valid_int;
2556 int_value = strtol (value, &end_of_valid_int, 0);
2558 if (*end_of_valid_int != '\0')
2559 g_set_error (error, G_KEY_FILE_ERROR,
2560 G_KEY_FILE_ERROR_INVALID_VALUE,
2561 _("Value '%s' cannot be interpreted as a number."), value);
2567 g_key_file_parse_integer_as_value (GKeyFile *key_file,
2571 return g_strdup_printf ("%d", value);
2575 g_key_file_parse_value_as_boolean (GKeyFile *key_file,
2581 if (strcmp (value, "true") == 0 || strcmp (value, "1") == 0)
2583 else if (strcmp (value, "false") == 0 || strcmp (value, "0") == 0)
2587 g_set_error (error, G_KEY_FILE_ERROR,
2588 G_KEY_FILE_ERROR_INVALID_VALUE,
2589 _("Value '%s' cannot be interpreted as a boolean."), value);
2595 g_key_file_parse_boolean_as_value (GKeyFile *key_file,
2599 return g_strdup ("true");
2601 return g_strdup ("false");