Подробности
[В начало]
Проблема в реализации № D0027
Краткое описание
В определенных случаях комментарий остается неудаленным после вызова функции "g_key_file_remove_comment"
Подробное описание
При вызове функции g_key_file_remove_comment с параметрами group_name = "some_group", key = "NULL" комментарий перед началом указанной группы не удаляется. В реализации это вызвано двойственностью способа хранения комментариев. В одном случае используется поле "comment" внутренней структуры, в другом - используется ключ "NULL" в таблице соответствий.
Раздел стандарта
Linux Standard Base Desktop Specification 3.1, Chapter 12. Libraries, 12.2 Interfaces for libglib-2.0; http://www.gtk.org/api/2.6/glib/glib-Key-value-file-parser.html#g-key-file-remove-comment
Способ воспроизведения
- Производится загрузка таблицы ключей из символьной строки.
- Для имеющейся в наличии группы производится вызов функции g_key_file_remove_comment с параметрами "group_name" = "Second Group" и "key" = NULL. При правильном поведении комментарий над группой "Second Group", содержащий текст "Third Comment" должен быть удален.
- Производится вызов функции "g_key_file_get_comment" с теми же параметрами. Если комментарий был удален при вызове предыдущего оператора, данный вызов возвратит значение "NULL". В обратном случае данный вызов возвращает значение "Third Comment", что указывает на некорректное поведение функции g_key_file_remove_comment.
Пример
#include <string.h> #include <stdio.h> #include <glib.h> char *textComment="#First Comment\n[First Group]\nWelcome=Hello\nWelcome[en]="\ "Hello\n \n#Second Comment\nFirst=1\n#Third Comment\n[Second Group]\n"\ "#Fourth Comment\nSecond=2\nWelcome=Hello\nWelcome[en]=Hi\n" "Welcome[fr]=Bonjourn\n"; #define GROUP "Second Group" #define KEY NULL int main () { GKeyFile *gkf=NULL; gchar *cmnt=NULL; gkf=g_key_file_new(); g_key_file_load_from_data(gkf, textComment, strlen(textComment), G_KEY_FILE_KEEP_COMMENTS, NULL); g_key_file_remove_comment(gkf, GROUP, KEY, NULL); cmnt=g_key_file_get_comment(gkf, GROUP, KEY, NULL); if (cmnt==NULL) printf ("CORRECT: comment removed\n"); else printf ("INCORRECT: comment = \"%s\" end of comment\n", cmnt); return 0; }
Компонент
gtk-glib 2.6.2 or later
Принято
Gnome Bugzilla 476852
[В начало]