Подробности

[В начало]

Проблема в реализации № 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

Способ воспроизведения

  1. Производится загрузка таблицы ключей из символьной строки.
  2. Для имеющейся в наличии группы производится вызов функции g_key_file_remove_comment с параметрами "group_name" = "Second Group" и "key" = NULL. При правильном поведении комментарий над группой "Second Group", содержащий текст "Third Comment" должен быть удален.
  3. Производится вызов функции "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

[В начало]