+print_path_tree(FILE *fp, GString *indent, LttvAttribute *tree)
+{
+ int i, nb, saved_length;
+
+ LttvAttribute *subtree;
+
+ LttvAttributeName name;
+
+ LttvAttributeValue value;
+
+ LttvAttributeType type;
+
+ gboolean is_named;
+
+ saved_length = indent->len;
+ nb = lttv_attribute_get_number(tree);
+ for(i = 0 ; i < nb ; i++) {
+ type = lttv_attribute_get(tree, i, &name, &value, &is_named);
+ if(is_named) {
+ g_string_sprintfa(indent, "/%s", g_quark_to_string(name));
+ } else {
+ g_string_sprintfa(indent, "/%s", name);
+ }
+
+ switch(type) {
+ case LTTV_INT:
+ fprintf(fp, "%s: %d\n", indent->str, *value.v_int);
+ break;
+ case LTTV_UINT:
+ fprintf(fp, "%s: %d\n", indent->str, *value.v_int);
+ break;
+ case LTTV_LONG:
+ fprintf(fp, "%s: %ld\n", indent->str, *value.v_ulong);
+ break;
+ case LTTV_ULONG:
+ fprintf(fp, "%s: %lu\n", indent->str, *value.v_ulong);
+ break;
+ case LTTV_FLOAT:
+ fprintf(fp, "%s: %f\n", indent->str, (double) *value.v_float);
+ break;
+ case LTTV_DOUBLE:
+ fprintf(fp, "%s: %f\n", indent->str, *value.v_double);
+ break;
+ case LTTV_TIME:
+ fprintf(fp, "%s: %lu.%09lu\n", indent->str, value.v_time->tv_sec, value.v_time->tv_nsec);
+ break;
+ case LTTV_POINTER:
+ fprintf(fp, "%s: POINTER\n", indent->str);
+ break;
+ case LTTV_STRING:
+ fprintf(fp, "%s: %s\n", indent->str, *value.v_string);
+ break;
+ case LTTV_GOBJECT:
+ if(LTTV_IS_ATTRIBUTE(*(value.v_gobject))) {
+ subtree = (LttvAttribute*) *(value.v_gobject);
+ print_path_tree(fp, indent, subtree);
+ } else {
+ fprintf(fp, "%s: GOBJECT\n", indent->str);
+ }
+ break;
+ case LTTV_NONE:
+ break;
+ }
+ g_string_truncate(indent, saved_length);
+ }
+}
+
+static void