diff options
Diffstat (limited to 'gtk/src/values.c')
-rw-r--r-- | gtk/src/values.c | 976 |
1 files changed, 488 insertions, 488 deletions
diff --git a/gtk/src/values.c b/gtk/src/values.c index f755363e5..b128db049 100644 --- a/gtk/src/values.c +++ b/gtk/src/values.c @@ -24,769 +24,769 @@ static void dict_delete_value(gpointer data); GValue* ghb_value_new(GType gtype) { - GValue *gval = g_malloc0(sizeof(GValue)); - g_value_init(gval, gtype); - return gval; + GValue *gval = g_malloc0(sizeof(GValue)); + g_value_init(gval, gtype); + return gval; } void ghb_value_free(GValue *gval) { - if (gval == NULL) return; - g_value_unset(gval); - g_free(gval); + if (gval == NULL) return; + g_value_unset(gval); + g_free(gval); } GValue* ghb_value_dup(const GValue *val) { - if (val == NULL) return NULL; - GValue *copy = ghb_value_new(G_VALUE_TYPE(val)); - g_value_copy(val, copy); - return copy; + if (val == NULL) return NULL; + GValue *copy = ghb_value_new(G_VALUE_TYPE(val)); + g_value_copy(val, copy); + return copy; } void debug_show_type(GType tp) { - const gchar *str = "unknown"; - if (tp == G_TYPE_STRING) - { - str ="string"; - } - else if (tp == G_TYPE_INT) - { - str ="int"; - } - else if (tp == G_TYPE_INT64) - { - str ="int64"; - } - else if (tp == G_TYPE_DOUBLE) - { - str ="double"; - } - else if (tp == G_TYPE_BOOLEAN) - { - str ="bool"; - } - else if (tp == ghb_array_get_type()) - { - str ="array"; - } - else if (tp == ghb_dict_get_type()) - { - str ="dict"; - } - g_debug("Type %s", str); + const gchar *str = "unknown"; + if (tp == G_TYPE_STRING) + { + str ="string"; + } + else if (tp == G_TYPE_INT) + { + str ="int"; + } + else if (tp == G_TYPE_INT64) + { + str ="int64"; + } + else if (tp == G_TYPE_DOUBLE) + { + str ="double"; + } + else if (tp == G_TYPE_BOOLEAN) + { + str ="bool"; + } + else if (tp == ghb_array_get_type()) + { + str ="array"; + } + else if (tp == ghb_dict_get_type()) + { + str ="dict"; + } + g_debug("Type %s", str); } void debug_show_value(GValue *gval) { - GType tp; - - tp = G_VALUE_TYPE(gval); - if (tp == G_TYPE_STRING) - { - g_message("Type %s value %s", "string", g_value_get_string(gval)); - } - else if (tp == G_TYPE_INT) - { - g_message("Type %s value %d", "int", g_value_get_int(gval)); - } - else if (tp == G_TYPE_INT64) - { - g_message("Type %s value %" PRId64, "int64", g_value_get_int64(gval)); - } - else if (tp == G_TYPE_DOUBLE) - { - g_message("Type %s value %f", "double", g_value_get_double(gval)); - } - else if (tp == G_TYPE_BOOLEAN) - { - g_message("Type %s value %d", "boolean", g_value_get_boolean(gval)); - } - else if (tp == ghb_array_get_type()) - { - g_message("Type %s", "boolean"); - } - else if (tp == ghb_dict_get_type()) - { - g_message("Type %s", "dict"); - } + GType tp; + + tp = G_VALUE_TYPE(gval); + if (tp == G_TYPE_STRING) + { + g_message("Type %s value %s", "string", g_value_get_string(gval)); + } + else if (tp == G_TYPE_INT) + { + g_message("Type %s value %d", "int", g_value_get_int(gval)); + } + else if (tp == G_TYPE_INT64) + { + g_message("Type %s value %" PRId64, "int64", g_value_get_int64(gval)); + } + else if (tp == G_TYPE_DOUBLE) + { + g_message("Type %s value %f", "double", g_value_get_double(gval)); + } + else if (tp == G_TYPE_BOOLEAN) + { + g_message("Type %s value %d", "boolean", g_value_get_boolean(gval)); + } + else if (tp == ghb_array_get_type()) + { + g_message("Type %s", "boolean"); + } + else if (tp == ghb_dict_get_type()) + { + g_message("Type %s", "dict"); + } } gint ghb_value_int(const GValue *val) { - gint result; - - if (val == NULL) return 0; - GValue xform = {0,}; - if (G_VALUE_TYPE(val) != G_TYPE_INT) - { - g_value_init(&xform, G_TYPE_INT); - if (!g_value_transform(val, &xform)) - { - debug_show_type(G_VALUE_TYPE(val)); - g_warning("int can't transform"); - return 0; - } - result = g_value_get_int(&xform); - g_value_unset(&xform); - } - else - { - result = g_value_get_int(val); - } - return result; + gint result; + + if (val == NULL) return 0; + GValue xform = {0,}; + if (G_VALUE_TYPE(val) != G_TYPE_INT) + { + g_value_init(&xform, G_TYPE_INT); + if (!g_value_transform(val, &xform)) + { + debug_show_type(G_VALUE_TYPE(val)); + g_warning("int can't transform"); + return 0; + } + result = g_value_get_int(&xform); + g_value_unset(&xform); + } + else + { + result = g_value_get_int(val); + } + return result; } gint64 ghb_value_int64(const GValue *val) { - gint64 result; - - if (val == NULL) return 0; - GValue xform = {0,}; - if (G_VALUE_TYPE(val) != G_TYPE_INT64) - { - g_value_init(&xform, G_TYPE_INT64); - if (!g_value_transform(val, &xform)) - { - debug_show_type(G_VALUE_TYPE(val)); - g_warning("int64 can't transform"); - return 0; - } - result = g_value_get_int64(&xform); - g_value_unset(&xform); - } - else - { - result = g_value_get_int64(val); - } - return result; + gint64 result; + + if (val == NULL) return 0; + GValue xform = {0,}; + if (G_VALUE_TYPE(val) != G_TYPE_INT64) + { + g_value_init(&xform, G_TYPE_INT64); + if (!g_value_transform(val, &xform)) + { + debug_show_type(G_VALUE_TYPE(val)); + g_warning("int64 can't transform"); + return 0; + } + result = g_value_get_int64(&xform); + g_value_unset(&xform); + } + else + { + result = g_value_get_int64(val); + } + return result; } gdouble ghb_value_double(const GValue *val) { - gdouble result; - - if (val == NULL) return 0; - GValue xform = {0,}; - if (G_VALUE_TYPE(val) != G_TYPE_DOUBLE) - { - g_value_init(&xform, G_TYPE_DOUBLE); - if (!g_value_transform(val, &xform)) - { - debug_show_type(G_VALUE_TYPE(val)); - g_warning("double can't transform"); - return 0; - } - result = g_value_get_double(&xform); - g_value_unset(&xform); - } - else - { - result = g_value_get_double(val); - } - return result; + gdouble result; + + if (val == NULL) return 0; + GValue xform = {0,}; + if (G_VALUE_TYPE(val) != G_TYPE_DOUBLE) + { + g_value_init(&xform, G_TYPE_DOUBLE); + if (!g_value_transform(val, &xform)) + { + debug_show_type(G_VALUE_TYPE(val)); + g_warning("double can't transform"); + return 0; + } + result = g_value_get_double(&xform); + g_value_unset(&xform); + } + else + { + result = g_value_get_double(val); + } + return result; } gchar* ghb_value_string(const GValue *val) { - gchar *result; - - if (val == NULL) return 0; - GValue xform = {0,}; - if (G_VALUE_TYPE(val) != G_TYPE_STRING) - { - g_value_init(&xform, G_TYPE_STRING); - if (!g_value_transform(val, &xform)) - { - debug_show_type(G_VALUE_TYPE(val)); - g_warning("string can't transform"); - return NULL; - } - result = g_strdup(g_value_get_string(&xform)); - g_value_unset(&xform); - } - else - { - result = g_strdup(g_value_get_string(val)); - } - return result; + gchar *result; + + if (val == NULL) return 0; + GValue xform = {0,}; + if (G_VALUE_TYPE(val) != G_TYPE_STRING) + { + g_value_init(&xform, G_TYPE_STRING); + if (!g_value_transform(val, &xform)) + { + debug_show_type(G_VALUE_TYPE(val)); + g_warning("string can't transform"); + return NULL; + } + result = g_strdup(g_value_get_string(&xform)); + g_value_unset(&xform); + } + else + { + result = g_strdup(g_value_get_string(val)); + } + return result; } gboolean ghb_value_boolean(const GValue *val) { - gboolean result; - - if (val == NULL) return FALSE; - GValue xform = {0,}; - if (G_VALUE_TYPE(val) != G_TYPE_BOOLEAN) - { - g_value_init(&xform, G_TYPE_BOOLEAN); - if (!g_value_transform(val, &xform)) - { - debug_show_type(G_VALUE_TYPE(val)); - g_warning("boolean can't transform"); - return FALSE; - } - result = g_value_get_boolean(&xform); - g_value_unset(&xform); - } - else - { - result = g_value_get_boolean(val); - } - return result; + gboolean result; + + if (val == NULL) return FALSE; + GValue xform = {0,}; + if (G_VALUE_TYPE(val) != G_TYPE_BOOLEAN) + { + g_value_init(&xform, G_TYPE_BOOLEAN); + if (!g_value_transform(val, &xform)) + { + debug_show_type(G_VALUE_TYPE(val)); + g_warning("boolean can't transform"); + return FALSE; + } + result = g_value_get_boolean(&xform); + g_value_unset(&xform); + } + else + { + result = g_value_get_boolean(val); + } + return result; } gint ghb_value_cmp(const GValue *vala, const GValue *valb) { - GType typa; - GType typb; - - if ((vala == NULL && valb != NULL) || (vala != NULL && valb == NULL)) - { - return 1; - } - typa = G_VALUE_TYPE(vala); - typb = G_VALUE_TYPE(valb); - if (typa != typb) - { - return 1; - } - - if (typa == G_TYPE_STRING) - { - char *stra, *strb; - gint res; - stra = ghb_value_string(vala); - strb = ghb_value_string(valb); - if (stra == NULL && strb == NULL) - return 0; - if (stra == NULL) - { - g_free(strb); - return -1; - } - if (strb == NULL) - { - g_free(stra); - return 1; - } - res = strcmp(stra, strb); - g_free(stra); - g_free(strb); - return res; - } - else if (typa == G_TYPE_INT64 || typa == G_TYPE_INT || - typa == G_TYPE_BOOLEAN) - { - return ghb_value_int64(vala) - ghb_value_int64(valb); - } - else if (typa == G_TYPE_DOUBLE || typa == G_TYPE_FLOAT) - { - return ghb_value_double(vala) - ghb_value_double(valb); - } - else if (typa == ghb_array_get_type()) - { - // Cheating here. Just assume they are different. - // Maybe later I'll recurse through these - return 1; - } - else if (typa == ghb_dict_get_type()) - { - // Cheating here. Just assume they are different. - // Maybe later I'll recurse through these - return 1; - } - else - { - g_warning("ghb_value_cmp: unrecognized type"); - return 1; - } - return 0; + GType typa; + GType typb; + + if ((vala == NULL && valb != NULL) || (vala != NULL && valb == NULL)) + { + return 1; + } + typa = G_VALUE_TYPE(vala); + typb = G_VALUE_TYPE(valb); + if (typa != typb) + { + return 1; + } + + if (typa == G_TYPE_STRING) + { + char *stra, *strb; + gint res; + stra = ghb_value_string(vala); + strb = ghb_value_string(valb); + if (stra == NULL && strb == NULL) + return 0; + if (stra == NULL) + { + g_free(strb); + return -1; + } + if (strb == NULL) + { + g_free(stra); + return 1; + } + res = strcmp(stra, strb); + g_free(stra); + g_free(strb); + return res; + } + else if (typa == G_TYPE_INT64 || typa == G_TYPE_INT || + typa == G_TYPE_BOOLEAN) + { + return ghb_value_int64(vala) - ghb_value_int64(valb); + } + else if (typa == G_TYPE_DOUBLE || typa == G_TYPE_FLOAT) + { + return ghb_value_double(vala) - ghb_value_double(valb); + } + else if (typa == ghb_array_get_type()) + { + // Cheating here. Just assume they are different. + // Maybe later I'll recurse through these + return 1; + } + else if (typa == ghb_dict_get_type()) + { + // Cheating here. Just assume they are different. + // Maybe later I'll recurse through these + return 1; + } + else + { + g_warning("ghb_value_cmp: unrecognized type"); + return 1; + } + return 0; } GValue* ghb_string_value(const gchar *str) { - static GValue gval = {0,}; - if (!G_IS_VALUE(&gval)) - g_value_init(&gval, G_TYPE_STRING); - if (str == NULL) - { - g_value_set_string(&gval, ""); - } - else - { - g_value_set_string(&gval, str); - } - return &gval; + static GValue gval = {0,}; + if (!G_IS_VALUE(&gval)) + g_value_init(&gval, G_TYPE_STRING); + if (str == NULL) + { + g_value_set_string(&gval, ""); + } + else + { + g_value_set_string(&gval, str); + } + return &gval; } GValue* ghb_int64_value(gint64 ival) { - static GValue gval = {0,}; - if (!G_IS_VALUE(&gval)) - g_value_init(&gval, G_TYPE_INT64); - g_value_set_int64(&gval, ival); - return &gval; + static GValue gval = {0,}; + if (!G_IS_VALUE(&gval)) + g_value_init(&gval, G_TYPE_INT64); + g_value_set_int64(&gval, ival); + return &gval; } GValue* ghb_int_value(gint ival) { - static GValue gval = {0,}; - if (!G_IS_VALUE(&gval)) - g_value_init(&gval, G_TYPE_INT64); - g_value_set_int64(&gval, (gint64)ival); - return &gval; + static GValue gval = {0,}; + if (!G_IS_VALUE(&gval)) + g_value_init(&gval, G_TYPE_INT64); + g_value_set_int64(&gval, (gint64)ival); + return &gval; } GValue* ghb_double_value(gdouble dval) { - static GValue gval = {0,}; - if (!G_IS_VALUE(&gval)) - g_value_init(&gval, G_TYPE_DOUBLE); - g_value_set_double(&gval, dval); - return &gval; + static GValue gval = {0,}; + if (!G_IS_VALUE(&gval)) + g_value_init(&gval, G_TYPE_DOUBLE); + g_value_set_double(&gval, dval); + return &gval; } GValue* ghb_boolean_value(gboolean bval) { - static GValue gval = {0,}; - if (!G_IS_VALUE(&gval)) - g_value_init(&gval, G_TYPE_BOOLEAN); - g_value_set_boolean(&gval, bval); - return &gval; + static GValue gval = {0,}; + if (!G_IS_VALUE(&gval)) + g_value_init(&gval, G_TYPE_BOOLEAN); + g_value_set_boolean(&gval, bval); + return &gval; } GValue* ghb_string_value_new(const gchar *str) { - if (str == NULL) str = ""; - GValue *gval = ghb_value_new(G_TYPE_STRING); - g_value_set_string(gval, str); - return gval; + if (str == NULL) str = ""; + GValue *gval = ghb_value_new(G_TYPE_STRING); + g_value_set_string(gval, str); + return gval; } GValue* ghb_int64_value_new(gint64 ival) { - GValue *gval = ghb_value_new(G_TYPE_INT64); - g_value_set_int64(gval, ival); - return gval; + GValue *gval = ghb_value_new(G_TYPE_INT64); + g_value_set_int64(gval, ival); + return gval; } GValue* ghb_int_value_new(gint ival) { - GValue *gval = ghb_value_new(G_TYPE_INT64); - g_value_set_int64(gval, ival); - return gval; + GValue *gval = ghb_value_new(G_TYPE_INT64); + g_value_set_int64(gval, ival); + return gval; } GValue* ghb_double_value_new(gdouble dval) { - GValue *gval = ghb_value_new(G_TYPE_DOUBLE); - g_value_set_double(gval, dval); - return gval; + GValue *gval = ghb_value_new(G_TYPE_DOUBLE); + g_value_set_double(gval, dval); + return gval; } GValue* ghb_boolean_value_new(gboolean bval) { - GValue *gval = ghb_value_new(G_TYPE_BOOLEAN); - g_value_set_boolean(gval, bval); - return gval; + GValue *gval = ghb_value_new(G_TYPE_BOOLEAN); + g_value_set_boolean(gval, bval); + return gval; } GValue* ghb_dict_value_new() { - GHashTable *dict; - GValue *gval = ghb_value_new(ghb_dict_get_type()); - dict = g_hash_table_new_full(g_str_hash, g_str_equal, - dict_delete_key, dict_delete_value); - g_value_take_boxed(gval, dict); - return gval; + GHashTable *dict; + GValue *gval = ghb_value_new(ghb_dict_get_type()); + dict = g_hash_table_new_full(g_str_hash, g_str_equal, + dict_delete_key, dict_delete_value); + g_value_take_boxed(gval, dict); + return gval; } GValue* ghb_array_value_new(guint size) { - GValue *gval = ghb_value_new(ghb_array_get_type()); - GArray *array; + GValue *gval = ghb_value_new(ghb_array_get_type()); + GArray *array; - array = g_array_sized_new(FALSE, FALSE, sizeof(GValue*), size); - g_value_take_boxed(gval, array); - return gval; + array = g_array_sized_new(FALSE, FALSE, sizeof(GValue*), size); + g_value_take_boxed(gval, array); + return gval; } void ghb_array_value_reset(GValue *gval, guint size) { - GArray *array; - g_value_reset(gval); - array = g_array_sized_new(FALSE, FALSE, sizeof(GValue*), size); - g_value_take_boxed(gval, array); + GArray *array; + g_value_reset(gval); + array = g_array_sized_new(FALSE, FALSE, sizeof(GValue*), size); + g_value_take_boxed(gval, array); } GValue* ghb_date_value_new(GDate *date) { - GValue *gval = ghb_value_new(g_date_get_type()); - g_value_set_boxed(gval, date); - return gval; + GValue *gval = ghb_value_new(g_date_get_type()); + g_value_set_boxed(gval, date); + return gval; } GValue* ghb_rawdata_value_new(ghb_rawdata_t *data) { - GValue *gval = ghb_value_new(ghb_rawdata_get_type()); - g_value_take_boxed(gval, data); - return gval; + GValue *gval = ghb_value_new(ghb_rawdata_get_type()); + g_value_take_boxed(gval, data); + return gval; } static gpointer rawdata_copy(gpointer boxed) { - const ghb_rawdata_t *data = (const ghb_rawdata_t*)boxed; - ghb_rawdata_t *copy = g_malloc(sizeof(ghb_rawdata_t)); - copy->size = data->size; - if (data->data) - { - copy->data = g_malloc(data->size); - memcpy(copy->data, data->data, data->size); - } - else - { - copy->data = NULL; - copy->size = 0; - } - return copy; + const ghb_rawdata_t *data = (const ghb_rawdata_t*)boxed; + ghb_rawdata_t *copy = g_malloc(sizeof(ghb_rawdata_t)); + copy->size = data->size; + if (data->data) + { + copy->data = g_malloc(data->size); + memcpy(copy->data, data->data, data->size); + } + else + { + copy->data = NULL; + copy->size = 0; + } + return copy; } static void rawdata_free(gpointer boxed) { - ghb_rawdata_t *data = (ghb_rawdata_t*)boxed; - if (data->data) g_free(data->data); - g_free(data); + ghb_rawdata_t *data = (ghb_rawdata_t*)boxed; + if (data->data) g_free(data->data); + g_free(data); } GType ghb_rawdata_get_type(void) { - static GType type_id = 0; - if (!type_id) - type_id = g_boxed_type_register_static(g_intern_static_string("GHBData"), - (GBoxedCopyFunc) rawdata_copy, - (GBoxedFreeFunc) rawdata_free); - return type_id; + static GType type_id = 0; + if (!type_id) + type_id = g_boxed_type_register_static(g_intern_static_string("GHBData"), + (GBoxedCopyFunc) rawdata_copy, + (GBoxedFreeFunc) rawdata_free); + return type_id; } static void dict_delete_key(gpointer data) { - if (data == NULL) - { - g_warning("dict frees null key"); - return; - } - g_free(data); + if (data == NULL) + { + g_warning("dict frees null key"); + return; + } + g_free(data); } static void dict_delete_value(gpointer data) { - GValue *gval = (GValue*)data; - if (gval == NULL) - { - g_warning("dict frees null value"); - return; - } - ghb_value_free(gval); + GValue *gval = (GValue*)data; + if (gval == NULL) + { + g_warning("dict frees null value"); + return; + } + ghb_value_free(gval); } static gpointer dict_copy(gpointer boxed) { - GHashTable *dict = (GHashTable*)boxed; - GHashTable *copy; - GHashTableIter iter; - gchar *key; - GValue *gval; + GHashTable *dict = (GHashTable*)boxed; + GHashTable *copy; + GHashTableIter iter; + gchar *key; + GValue *gval; - copy = g_hash_table_new_full(g_str_hash, g_str_equal, - dict_delete_key, dict_delete_value); + copy = g_hash_table_new_full(g_str_hash, g_str_equal, + dict_delete_key, dict_delete_value); - g_hash_table_iter_init(&iter, dict); - // middle (void*) cast prevents gcc warning "defreferencing type-punned - // pointer will break strict-aliasing rules" - while (g_hash_table_iter_next( - &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval)) - { - g_hash_table_insert(copy, g_strdup(key), ghb_value_dup(gval)); - } - return copy; + g_hash_table_iter_init(&iter, dict); + // middle (void*) cast prevents gcc warning "defreferencing type-punned + // pointer will break strict-aliasing rules" + while (g_hash_table_iter_next( + &iter, (gpointer*)(void*)&key, (gpointer*)(void*)&gval)) + { + g_hash_table_insert(copy, g_strdup(key), ghb_value_dup(gval)); + } + return copy; } static void dict_free(gpointer boxed) { - GHashTable *dict = (GHashTable*)boxed; - g_hash_table_destroy(dict); + GHashTable *dict = (GHashTable*)boxed; + g_hash_table_destroy(dict); } GType ghb_dict_get_type(void) { - static GType type_id = 0; - if (!type_id) - type_id = g_boxed_type_register_static( - g_intern_static_string("GHBDict"), - (GBoxedCopyFunc) dict_copy, - (GBoxedFreeFunc) dict_free); - return type_id; + static GType type_id = 0; + if (!type_id) + type_id = g_boxed_type_register_static( + g_intern_static_string("GHBDict"), + (GBoxedCopyFunc) dict_copy, + (GBoxedFreeFunc) dict_free); + return type_id; } void ghb_dict_insert(GValue *gval, gchar *key, GValue *val) { - GHashTable *dict = g_value_get_boxed(gval); - g_hash_table_insert(dict, key, val); + GHashTable *dict = g_value_get_boxed(gval); + g_hash_table_insert(dict, key, val); } void ghb_dict_iter_init(GHashTableIter *iter, GValue *gval) { - GHashTable *dict = g_value_get_boxed(gval); - g_hash_table_iter_init(iter, dict); + GHashTable *dict = g_value_get_boxed(gval); + g_hash_table_iter_init(iter, dict); } GValue* ghb_dict_lookup(const GValue *gval, const gchar *key) { - GHashTable *dict = g_value_get_boxed(gval); - return g_hash_table_lookup(dict, key); + GHashTable *dict = g_value_get_boxed(gval); + return g_hash_table_lookup(dict, key); } gboolean ghb_dict_remove(GValue *gval, const gchar *key) { - GHashTable *dict = g_value_get_boxed(gval); - return g_hash_table_remove(dict, key); + GHashTable *dict = g_value_get_boxed(gval); + return g_hash_table_remove(dict, key); } static gpointer array_copy(gpointer boxed) { - const GArray *array = (const GArray*)boxed; - GArray *copy = g_array_new(FALSE, FALSE, sizeof(GValue*)); + const GArray *array = (const GArray*)boxed; + GArray *copy = g_array_new(FALSE, FALSE, sizeof(GValue*)); - GValue *gval, *gval_copy; - gint ii; + GValue *gval, *gval_copy; + gint ii; - for (ii = 0; ii < array->len; ii++) - { - gval = g_array_index(array, GValue*, ii); - if (gval) - { - gval_copy = ghb_value_dup(gval); - g_array_append_val(copy, gval_copy); - } - } - return copy; + for (ii = 0; ii < array->len; ii++) + { + gval = g_array_index(array, GValue*, ii); + if (gval) + { + gval_copy = ghb_value_dup(gval); + g_array_append_val(copy, gval_copy); + } + } + return copy; } static void array_free(gpointer boxed) { - GArray *array = (GArray*)boxed; - GValue *gval; - gint ii; + GArray *array = (GArray*)boxed; + GValue *gval; + gint ii; - for (ii = 0; ii < array->len; ii++) - { - gval = g_array_index(array, GValue*, ii); - if (gval) - { - ghb_value_free(gval); - } - } - g_array_free(array, TRUE); + for (ii = 0; ii < array->len; ii++) + { + gval = g_array_index(array, GValue*, ii); + if (gval) + { + ghb_value_free(gval); + } + } + g_array_free(array, TRUE); } GType ghb_array_get_type(void) { - static GType type_id = 0; - if (!type_id) - type_id = g_boxed_type_register_static( - g_intern_static_string("GHBArray"), - (GBoxedCopyFunc) array_copy, - (GBoxedFreeFunc) array_free); - return type_id; + static GType type_id = 0; + if (!type_id) + type_id = g_boxed_type_register_static( + g_intern_static_string("GHBArray"), + (GBoxedCopyFunc) array_copy, + (GBoxedFreeFunc) array_free); + return type_id; } GValue* ghb_array_get_nth(const GValue *gval, gint ii) { - GArray *arr = g_value_get_boxed(gval); - return g_array_index(arr, GValue*, ii); + GArray *arr = g_value_get_boxed(gval); + return g_array_index(arr, GValue*, ii); } void ghb_array_insert(GValue *gval, guint ii, GValue *val) { - GArray *arr = g_value_get_boxed(gval); - // A little nastyness here. The array pointer - // can change when the array changes size. So - // I must re-box it in the GValue each time. - arr = g_array_insert_val(arr, ii, val); - memset(gval, 0, sizeof(GValue)); - g_value_init(gval, ghb_array_get_type()); - g_value_take_boxed(gval, arr); + GArray *arr = g_value_get_boxed(gval); + // A little nastyness here. The array pointer + // can change when the array changes size. So + // I must re-box it in the GValue each time. + arr = g_array_insert_val(arr, ii, val); + memset(gval, 0, sizeof(GValue)); + g_value_init(gval, ghb_array_get_type()); + g_value_take_boxed(gval, arr); } void ghb_array_append(GValue *gval, GValue *val) { - GArray *arr = g_value_get_boxed(gval); - // A little nastyness here. The array pointer - // can change when the array changes size. So - // I must re-box it in the GValue each time. - arr = g_array_append_val(arr, val); - memset(gval, 0, sizeof(GValue)); - g_value_init(gval, ghb_array_get_type()); - g_value_take_boxed(gval, arr); + GArray *arr = g_value_get_boxed(gval); + // A little nastyness here. The array pointer + // can change when the array changes size. So + // I must re-box it in the GValue each time. + arr = g_array_append_val(arr, val); + memset(gval, 0, sizeof(GValue)); + g_value_init(gval, ghb_array_get_type()); + g_value_take_boxed(gval, arr); } void ghb_array_remove(GValue *gval, guint ii) { - GArray *arr = g_value_get_boxed(gval); - // A little nastyness here. The array pointer - // can change when the array changes size. So - // I must re-box it in the GValue each time. - arr = g_array_remove_index(arr, ii); - memset(gval, 0, sizeof(GValue)); - g_value_init(gval, ghb_array_get_type()); - g_value_take_boxed(gval, arr); + GArray *arr = g_value_get_boxed(gval); + // A little nastyness here. The array pointer + // can change when the array changes size. So + // I must re-box it in the GValue each time. + arr = g_array_remove_index(arr, ii); + memset(gval, 0, sizeof(GValue)); + g_value_init(gval, ghb_array_get_type()); + g_value_take_boxed(gval, arr); } void ghb_array_replace(GValue *gval, guint ii, GValue *val) { - GArray *arr = g_value_get_boxed(gval); - // A little nastyness here. The array pointer - // can change when the array changes size. So - // I must re-box it in the GValue each time. - if (ii >= arr->len) return; - ghb_value_free(((GValue**)arr->data)[ii]); - ((GValue**)arr->data)[ii] = val; + GArray *arr = g_value_get_boxed(gval); + // A little nastyness here. The array pointer + // can change when the array changes size. So + // I must re-box it in the GValue each time. + if (ii >= arr->len) return; + ghb_value_free(((GValue**)arr->data)[ii]); + ((GValue**)arr->data)[ii] = val; } void ghb_array_copy(GValue *arr1, GValue *arr2, gint count) { - gint len, ii; + gint len, ii; - // empty the first array if it is not already empty - len = ghb_array_len(arr1); - for (ii = 0; ii < len; ii++) - ghb_array_remove(arr1, 0); + // empty the first array if it is not already empty + len = ghb_array_len(arr1); + for (ii = 0; ii < len; ii++) + ghb_array_remove(arr1, 0); - len = ghb_array_len(arr2); - count = MIN(count, len); - for (ii = 0; ii < count; ii++) - ghb_array_append(arr1, ghb_value_dup(ghb_array_get_nth(arr2, ii))); + len = ghb_array_len(arr2); + count = MIN(count, len); + for (ii = 0; ii < count; ii++) + ghb_array_append(arr1, ghb_value_dup(ghb_array_get_nth(arr2, ii))); } gint ghb_array_len(const GValue *gval) { - if (gval == NULL) return 0; - GArray *arr = g_value_get_boxed(gval); - return arr->len; + if (gval == NULL) return 0; + GArray *arr = g_value_get_boxed(gval); + return arr->len; } static void xform_string_int(const GValue *sval, GValue *ival) { - gchar *end; + gchar *end; - const gchar *str = g_value_get_string(sval); - gint val = g_strtod(str, &end); - if (*end) - val = (guint)(~0)>>1; - g_value_set_int(ival, val); + const gchar *str = g_value_get_string(sval); + gint val = g_strtod(str, &end); + if (*end) + val = (guint)(~0)>>1; + g_value_set_int(ival, val); } static void xform_string_int64(const GValue *sval, GValue *ival) { - gchar *end; - const gchar *str = g_value_get_string(sval); - gint64 val = g_strtod(str, &end); - if (*end) - val = (guint64)(~0L)>>1; - g_value_set_int64(ival, val); + gchar *end; + const gchar *str = g_value_get_string(sval); + gint64 val = g_strtod(str, &end); + if (*end) + val = (guint64)(~0L)>>1; + g_value_set_int64(ival, val); } static void xform_string_double(const GValue *sval, GValue *dval) { - const gchar *str = g_value_get_string(sval); - double val = g_strtod(str, NULL); - g_value_set_double(dval, val); + const gchar *str = g_value_get_string(sval); + double val = g_strtod(str, NULL); + g_value_set_double(dval, val); } static void xform_double_string(const GValue *dval, GValue *sval) { - gchar *str; - double val = g_value_get_double(dval); - str = g_strdup_printf("%g", val); - g_value_take_string(sval, str); + gchar *str; + double val = g_value_get_double(dval); + str = g_strdup_printf("%g", val); + g_value_take_string(sval, str); } static void xform_boolean_double(const GValue *bval, GValue *dval) { - gboolean b = g_value_get_boolean(bval); - double val = b; - g_value_set_double(dval, val); + gboolean b = g_value_get_boolean(bval); + double val = b; + g_value_set_double(dval, val); } void ghb_register_transforms() { - g_value_register_transform_func(G_TYPE_STRING, G_TYPE_INT64, - xform_string_int64); - g_value_register_transform_func(G_TYPE_STRING, G_TYPE_INT, - xform_string_int); - g_value_register_transform_func(G_TYPE_STRING, G_TYPE_DOUBLE, - xform_string_double); - g_value_register_transform_func(G_TYPE_BOOLEAN, G_TYPE_DOUBLE, - xform_boolean_double); - g_value_register_transform_func(G_TYPE_DOUBLE, G_TYPE_STRING, - xform_double_string); + g_value_register_transform_func(G_TYPE_STRING, G_TYPE_INT64, + xform_string_int64); + g_value_register_transform_func(G_TYPE_STRING, G_TYPE_INT, + xform_string_int); + g_value_register_transform_func(G_TYPE_STRING, G_TYPE_DOUBLE, + xform_string_double); + g_value_register_transform_func(G_TYPE_BOOLEAN, G_TYPE_DOUBLE, + xform_boolean_double); + g_value_register_transform_func(G_TYPE_DOUBLE, G_TYPE_STRING, + xform_double_string); } |