/** * Return a new value object which is a deep copy of the input value * * @param val #xmmsv_t to copy. * @return 1 the address to the new copy of the value. */ xmmsv_t * xmmsv_copy (xmmsv_t *val) { xmmsv_t *cur_val = NULL; xmmsv_type_t type; int64_t i; const char *s; float f; x_return_val_if_fail (val, 0); type = xmmsv_get_type (val); switch (type) { case XMMSV_TYPE_DICT: cur_val = duplicate_dict_value (val); break; case XMMSV_TYPE_LIST: cur_val = duplicate_list_value (val); break; case XMMSV_TYPE_INT64: xmmsv_get_int (val, &i); cur_val = xmmsv_new_int (i); break; case XMMSV_TYPE_FLOAT: xmmsv_get_float (val, &f); cur_val = xmmsv_new_float (f); break; case XMMSV_TYPE_STRING: xmmsv_get_string (val, &s); cur_val = xmmsv_new_string (s); break; case XMMSV_TYPE_ERROR: xmmsv_get_error (val, &s); cur_val = xmmsv_new_error (s); break; case XMMSV_TYPE_COLL: cur_val = duplicate_coll_value (val); break; case XMMSV_TYPE_BIN: cur_val = xmmsv_new_bin (val->value.bin.data, val->value.bin.len); break; case XMMSV_TYPE_BITBUFFER: cur_val = xmmsv_new_bitbuffer (); xmmsv_bitbuffer_put_data (cur_val, val->value.bit.buf, val->value.bit.len / 8); xmmsv_bitbuffer_goto (cur_val, xmmsv_bitbuffer_pos (val)); break; default: cur_val = xmmsv_new_none (); break; } assert (cur_val); return cur_val; }
static xmmsv_t * create_data (int type, const char *data, uint32_t len) { switch (type) { case JSON_STRING: return xmmsv_new_string (data); case JSON_INT: return xmmsv_new_int (atoi(data)); case JSON_FLOAT: return xmmsv_new_float (strtof (data, NULL)); case JSON_NULL: return xmmsv_new_none (); case JSON_TRUE: return xmmsv_new_int (1); case JSON_FALSE: return xmmsv_new_int (0); default: return xmmsv_new_error ("Unknown data type."); } }
/* Converts the temporary value returned by result_to_xmmsv into the real value */ static xmmsv_t * aggregate_data (xmmsv_t *value, aggregate_function_t aggr_func) { const random_data_t *random_data; const avg_data_t *avg_data; const set_data_t *set_data; gconstpointer data; xmmsv_t *ret; guint len; ret = NULL; data = NULL; if (value != NULL && xmmsv_is_type (value, XMMSV_TYPE_BIN)) xmmsv_get_bin (value, (const guchar **) &data, &len); switch (aggr_func) { case AGGREGATE_FIRST: case AGGREGATE_MIN: case AGGREGATE_MAX: case AGGREGATE_SUM: if (value != NULL) { ret = xmmsv_ref (value); } else { ret = xmmsv_new_none (); } break; case AGGREGATE_LIST: if (value != NULL) { ret = xmmsv_ref (value); } else { ret = xmmsv_new_list (); } break; case AGGREGATE_RANDOM: random_data = data; if (random_data != NULL) { ret = random_data->data; } else { ret = xmmsv_new_none (); } break; case AGGREGATE_SET: set_data = data; if (set_data != NULL) { g_hash_table_destroy (set_data->ht); ret = set_data->list; } else { ret = xmmsv_new_list (); } break; case AGGREGATE_AVG: avg_data = data; if (avg_data != NULL) { ret = xmmsv_new_float (avg_data->n ? avg_data->sum * 1.0 / avg_data->n : 0); } else { ret = xmmsv_new_none (); } break; default: g_assert_not_reached (); } if (value != NULL) { xmmsv_unref (value); } return ret; }