📄 keyfile.c
字号:
#include <glib.h>#include <locale.h>#include <string.h>#include <stdlib.h>static GKeyFile *load_data (const gchar *data, GKeyFileFlags flags){ GKeyFile *keyfile; GError *error = NULL; keyfile = g_key_file_new (); g_key_file_load_from_data (keyfile, data, -1, flags, &error); g_assert (error == NULL); return keyfile;}static voidcheck_error (GError **error, GQuark domain, gint code){ g_assert (*error != NULL); g_assert ((*error)->domain == domain); g_assert ((*error)->code == code); g_error_free (*error); *error = NULL;}static void check_no_error (GError **error){ g_assert (*error == NULL);}static voidcheck_string_value (GKeyFile *keyfile, const gchar *group, const gchar *key, const gchar *expected) { GError *error = NULL; gchar *value; value = g_key_file_get_string (keyfile, group, key, &error); check_no_error (&error); g_assert (value != NULL); g_assert_cmpstr (value, ==, expected); g_free (value);}static voidcheck_locale_string_value (GKeyFile *keyfile, const gchar *group, const gchar *key, const gchar *locale, const gchar *expected) { GError *error = NULL; gchar *value; value = g_key_file_get_locale_string (keyfile, group, key, locale, &error); check_no_error (&error); g_assert (value != NULL); g_assert_cmpstr (value, ==, expected); g_free (value);}static voidcheck_string_list_value (GKeyFile *keyfile, const gchar *group, const gchar *key, ...){ gint i; gchar *v, **value; va_list args; gsize len; GError *error = NULL; value = g_key_file_get_string_list (keyfile, group, key, &len, &error); check_no_error (&error); g_assert (value != NULL); va_start (args, key); i = 0; v = va_arg (args, gchar*); while (v) { g_assert (value[i] != NULL); g_assert_cmpstr (v, ==, value[i]); i++; v = va_arg (args, gchar*); } va_end (args); g_strfreev (value);}static voidcheck_locale_string_list_value (GKeyFile *keyfile, const gchar *group, const gchar *key, const gchar *locale, ...){ gint i; gchar *v, **value; va_list args; gsize len; GError *error = NULL; value = g_key_file_get_locale_string_list (keyfile, group, key, locale, &len, &error); check_no_error (&error); g_assert (value != NULL); va_start (args, locale); i = 0; v = va_arg (args, gchar*); while (v) { g_assert (value[i] != NULL); g_assert_cmpstr (v, ==, value[i]); i++; v = va_arg (args, gchar*); } va_end (args); g_strfreev (value);}static voidcheck_integer_list_value (GKeyFile *keyfile, const gchar *group, const gchar *key, ...){ gint i; gint v, *value; va_list args; gsize len; GError *error = NULL; value = g_key_file_get_integer_list (keyfile, group, key, &len, &error); check_no_error (&error); g_assert (value != NULL); va_start (args, key); i = 0; v = va_arg (args, gint); while (v != -100) { g_assert_cmpint (i, <, len); g_assert_cmpint (value[i], ==, v); i++; v = va_arg (args, gint); } va_end (args); g_free (value);}static voidcheck_double_list_value (GKeyFile *keyfile, const gchar *group, const gchar *key, ...){ gint i; gdouble v, *value; va_list args; gsize len; GError *error = NULL; value = g_key_file_get_double_list (keyfile, group, key, &len, &error); check_no_error (&error); g_assert (value != NULL); va_start (args, key); i = 0; v = va_arg (args, gdouble); while (v != -100) { g_assert_cmpint (i, <, len); g_assert_cmpfloat (value[i], ==, v); i++; v = va_arg (args, gdouble); } va_end (args); g_free (value);}static voidcheck_boolean_list_value (GKeyFile *keyfile, const gchar *group, const gchar *key, ...){ gint i; gboolean v, *value; va_list args; gsize len; GError *error = NULL; value = g_key_file_get_boolean_list (keyfile, group, key, &len, &error); check_no_error (&error); g_assert (value != NULL); va_start (args, key); i = 0; v = va_arg (args, gboolean); while (v != -100) { g_assert_cmpint (i, <, len); g_assert_cmpint (value[i], ==, v); i++; v = va_arg (args, gboolean); } va_end (args); g_free (value);}static voidcheck_boolean_value (GKeyFile *keyfile, const gchar *group, const gchar *key, gboolean expected) { GError *error = NULL; gboolean value; value = g_key_file_get_boolean (keyfile, group, key, &error); check_no_error (&error); g_assert_cmpint (value, ==, expected);}static voidcheck_integer_value (GKeyFile *keyfile, const gchar *group, const gchar *key, gint expected) { GError *error = NULL; gint value; value = g_key_file_get_integer (keyfile, group, key, &error); check_no_error (&error); g_assert_cmpint (value, ==, expected);}static voidcheck_double_value (GKeyFile *keyfile, const gchar *group, const gchar *key, gdouble expected) { GError *error = NULL; gdouble value; value = g_key_file_get_double (keyfile, group, key, &error); check_no_error (&error); g_assert_cmpfloat (value, ==, expected);}static voidcheck_name (const gchar *what, const gchar *value, const gchar *expected, gint position){ g_assert_cmpstr (value, ==, expected);}static voidcheck_length (const gchar *what, gint n_items, gint length, gint expected){ g_assert_cmpint (n_items, ==, length); g_assert_cmpint (n_items, ==, expected);}/* check that both \n and \r\n are accepted as line ends, * and that stray \r are passed through */static voidtest_line_ends (void){ GKeyFile *keyfile; const gchar *data = "[group1]\n" "key1=value1\n" "key2=value2\r\n" "[group2]\r\n" "key3=value3\r\r\n" "key4=value4\n"; keyfile = load_data (data, 0); check_string_value (keyfile, "group1", "key1", "value1"); check_string_value (keyfile, "group1", "key2", "value2"); check_string_value (keyfile, "group2", "key3", "value3\r"); check_string_value (keyfile, "group2", "key4", "value4"); g_key_file_free (keyfile);}/* check handling of whitespace */static voidtest_whitespace (void){ GKeyFile *keyfile; const gchar *data = "[group1]\n" "key1 = value1\n" "key2\t=\tvalue2\n" " [ group2 ] \n" "key3 = value3 \n" "key4 = value \t4\n" " key5 = value5\n"; keyfile = load_data (data, 0); check_string_value (keyfile, "group1", "key1", "value1"); check_string_value (keyfile, "group1", "key2", "value2"); check_string_value (keyfile, " group2 ", "key3", "value3 "); check_string_value (keyfile, " group2 ", "key4", "value \t4"); check_string_value (keyfile, " group2 ", "key5", "value5"); g_key_file_free (keyfile);}/* check handling of comments */static voidtest_comments (void){ GKeyFile *keyfile; gchar **names; gsize len; GError *error = NULL; gchar *comment; const gchar *data = "# top comment\n" "# top comment, continued\n" "[group1]\n" "key1 = value1\n" "# key comment\n" "# key comment, continued\n" "key2 = value2\n" "# line end check\r\n" "key3 = value3\n" "key4 = value4\n" "# group comment\n" "# group comment, continued\n" "[group2]\n"; const gchar *top_comment= " top comment\n top comment, continued\n"; const gchar *group_comment= " group comment\n group comment, continued\n"; const gchar *key_comment= " key comment\n key comment, continued\n"; keyfile = load_data (data, 0); check_string_value (keyfile, "group1", "key1", "value1"); check_string_value (keyfile, "group1", "key2", "value2"); check_string_value (keyfile, "group1", "key3", "value3"); check_string_value (keyfile, "group1", "key4", "value4"); names = g_key_file_get_keys (keyfile, "group1", &len, &error); check_no_error (&error); check_length ("keys", g_strv_length (names), len, 4); check_name ("key", names[0], "key1", 0); check_name ("key", names[1], "key2", 1); check_name ("key", names[2], "key3", 2); check_name ("key", names[3], "key4", 3); g_strfreev (names); g_key_file_free (keyfile); keyfile = load_data (data, G_KEY_FILE_KEEP_COMMENTS); names = g_key_file_get_keys (keyfile, "group1", &len, &error); check_no_error (&error); check_length ("keys", g_strv_length (names), len, 4); check_name ("key", names[0], "key1", 0); check_name ("key", names[1], "key2", 1); check_name ("key", names[2], "key3", 2); check_name ("key", names[3], "key4", 3); g_strfreev (names); comment = g_key_file_get_comment (keyfile, NULL, NULL, &error); check_no_error (&error); check_name ("top comment", comment, top_comment, 0); g_free (comment); comment = g_key_file_get_comment (keyfile, "group1", "key2", &error); check_no_error (&error); check_name ("key comment", comment, key_comment, 0); g_free (comment); comment = g_key_file_get_comment (keyfile, "group2", NULL, &error); check_no_error (&error); check_name ("group comment", comment, group_comment, 0); g_free (comment);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -