This effects the get_integer, set_integer, get_integer_list, and
set_integer_list functions.
---
I ran out of bits while trying to save an integer in a GKeyFile.
Swapping gint with gint64 seemed like the easiest solution.
I'm not entirely sure how this effects portability or backwards
compatibility (could be more of a problem with the _list functions).
You could also add separate get/set functions for longlong or int64, not
sure if that would be better or worse though. Thoughts?
glib/gkeyfile.c | 32 +++++++++++++++-----------------
glib/gkeyfile.h | 8 ++++----
2 files changed, 19 insertions(+), 21 deletions(-)
diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c
index 2226e70..364d791 100644
--- a/glib/gkeyfile.c
+++ b/glib/gkeyfile.c
@@ -156,11 +156,11 @@ static gchar *g_key_file_parse_value_as_string (GKeyFile
static gchar *g_key_file_parse_string_as_value (GKeyFile *key_file,
const gchar *string,
gboolean escape_separator);
-static gint g_key_file_parse_value_as_integer (GKeyFile *key_file,
+static gint64 g_key_file_parse_value_as_integer (GKeyFile *key_file,
const gchar *value,
GError **error);
static gchar *g_key_file_parse_integer_as_value (GKeyFile *key_file,
- gint value);
+ gint64 value);
static gdouble g_key_file_parse_value_as_double (GKeyFile *key_file,
const gchar *value,
GError **error);
@@ -2085,7 +2085,7 @@ g_key_file_set_boolean_list (GKeyFile *key_file,
*
* Since: 2.6
**/
-gint
+gint64
g_key_file_get_integer (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
@@ -2093,7 +2093,7 @@ g_key_file_get_integer (GKeyFile *key_file,
{
GError *key_file_error;
gchar *value;
- gint int_value;
+ gint64 int_value;
g_return_val_if_fail (key_file != NULL, -1);
g_return_val_if_fail (group_name != NULL, -1);
@@ -2149,7 +2149,7 @@ void
g_key_file_set_integer (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
- gint value)
+ gint64 value)
{
gchar *result;
@@ -2181,7 +2181,7 @@ g_key_file_set_integer (GKeyFile *key_file,
*
* Since: 2.6
**/
-gint *
+gint64 *
g_key_file_get_integer_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
@@ -2190,7 +2190,7 @@ g_key_file_get_integer_list (GKeyFile *key_file,
{
GError *key_file_error = NULL;
gchar **values;
- gint *int_values;
+ gint64 *int_values;
gsize i, num_ints;
g_return_val_if_fail (key_file != NULL, NULL);
@@ -2209,7 +2209,7 @@ g_key_file_get_integer_list (GKeyFile *key_file,
if (!values)
return NULL;
- int_values = g_new (gint, num_ints);
+ int_values = g_new (gint64, num_ints);
for (i = 0; i < num_ints; i++)
{
@@ -2251,7 +2251,7 @@ void
g_key_file_set_integer_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
- gint list[],
+ gint64 list[],
gsize length)
{
GString *values;
@@ -3629,17 +3629,16 @@ g_key_file_parse_string_as_value (GKeyFile *key_file,
return value;
}
-static gint
+static gint64
g_key_file_parse_value_as_integer (GKeyFile *key_file,
const gchar *value,
GError **error)
{
gchar *end_of_valid_int;
- glong long_value;
- gint int_value;
+ gint64 int_value;
errno = 0;
- long_value = strtol (value, &end_of_valid_int, 10);
+ int_value = strtoll (value, &end_of_valid_int, 10);
if (*value == '\0' || *end_of_valid_int != '\0')
{
@@ -3653,8 +3652,7 @@ g_key_file_parse_value_as_integer (GKeyFile *key_file,
return 0;
}
- int_value = long_value;
- if (int_value != long_value || errno == ERANGE)
+ if (errno == ERANGE)
{
gchar *value_utf8 = _g_utf8_make_valid (value);
g_set_error (error,
@@ -3672,10 +3670,10 @@ g_key_file_parse_value_as_integer (GKeyFile *key_file,
static gchar *
g_key_file_parse_integer_as_value (GKeyFile *key_file,
- gint value)
+ gint64 value)
{
- return g_strdup_printf ("%d", value);
+ return g_strdup_printf ("%lld", value);
}
static gdouble
diff --git a/glib/gkeyfile.h b/glib/gkeyfile.h
index b19124c..4e2781b 100644
--- a/glib/gkeyfile.h
+++ b/glib/gkeyfile.h
@@ -128,14 +128,14 @@ void g_key_file_set_boolean (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gboolean value);
-gint g_key_file_get_integer (GKeyFile *key_file,
+gint64 g_key_file_get_integer (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
GError **error);
void g_key_file_set_integer (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
- gint value);
+ gint64 value);
gdouble g_key_file_get_double (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
@@ -176,7 +176,7 @@ void g_key_file_set_boolean_list (GKeyFile *key_file,
const gchar *key,
gboolean list[],
gsize length);
-gint *g_key_file_get_integer_list (GKeyFile *key_file,
+gint64 *g_key_file_get_integer_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
gsize *length,
@@ -194,7 +194,7 @@ gdouble *g_key_file_get_double_list (GKeyFile *key_file,
void g_key_file_set_integer_list (GKeyFile *key_file,
const gchar *group_name,
const gchar *key,
- gint list[],
+ gint64 list[],
gsize length);
gboolean g_key_file_set_comment (GKeyFile *key_file,
const gchar *group_name,
--
1.6.5.2
Attachment:
pgpn9SjXXiQ6f.pgp
Description: PGP signature