X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=lttv%2Flttv%2Fattribute.c;h=80126a5e167eb1c717c856a8888be03f2e54ec96;hb=90e19f82bca635a1ba52b8a50b64e484bd19c14f;hp=7ba8f2c5108362368b225c3dce5c931539d503cf;hpb=6d3ad1b2722e69f425f4d822f893c599c112cbc2;p=lttv.git diff --git a/lttv/lttv/attribute.c b/lttv/lttv/attribute.c index 7ba8f2c5..80126a5e 100644 --- a/lttv/lttv/attribute.c +++ b/lttv/lttv/attribute.c @@ -26,162 +26,163 @@ #include typedef union _AttributeValue { - int dv_int; - unsigned dv_uint; - long dv_long; - unsigned long dv_ulong; - float dv_float; - double dv_double; - LttTime dv_time; - gpointer dv_pointer; - char *dv_string; - GObject *dv_gobject; + int dv_int; + unsigned dv_uint; + long dv_long; + unsigned long dv_ulong; + float dv_float; + double dv_double; + LttTime dv_time; + gpointer dv_pointer; + char *dv_string; + GObject *dv_gobject; } AttributeValue; typedef struct _Attribute { - LttvAttributeName name; - LttvAttributeType type; - AttributeValue value; + LttvAttributeName name; + LttvAttributeType type; + AttributeValue value; gboolean is_named; } Attribute; -static __inline__ LttvAttributeValue address_of_value(LttvAttributeType t, - AttributeValue *v) +static __inline__ LttvAttributeValue +address_of_value(LttvAttributeType t, AttributeValue *v) { - LttvAttributeValue va; - - switch(t) { - case LTTV_INT: va.v_int = &v->dv_int; break; - case LTTV_UINT: va.v_uint = &v->dv_uint; break; - case LTTV_LONG: va.v_long = &v->dv_long; break; - case LTTV_ULONG: va.v_ulong = &v->dv_ulong; break; - case LTTV_FLOAT: va.v_float = &v->dv_float; break; - case LTTV_DOUBLE: va.v_double = &v->dv_double; break; - case LTTV_TIME: va.v_time = &v->dv_time; break; - case LTTV_POINTER: va.v_pointer = &v->dv_pointer; break; - case LTTV_STRING: va.v_string = &v->dv_string; break; - case LTTV_GOBJECT: va.v_gobject = &v->dv_gobject; break; - case LTTV_NONE: break; - } - return va; + LttvAttributeValue va; + + switch(t) { + case LTTV_INT: va.v_int = &v->dv_int; break; + case LTTV_UINT: va.v_uint = &v->dv_uint; break; + case LTTV_LONG: va.v_long = &v->dv_long; break; + case LTTV_ULONG: va.v_ulong = &v->dv_ulong; break; + case LTTV_FLOAT: va.v_float = &v->dv_float; break; + case LTTV_DOUBLE: va.v_double = &v->dv_double; break; + case LTTV_TIME: va.v_time = &v->dv_time; break; + case LTTV_POINTER: va.v_pointer = &v->dv_pointer; break; + case LTTV_STRING: va.v_string = &v->dv_string; break; + case LTTV_GOBJECT: va.v_gobject = &v->dv_gobject; break; + case LTTV_NONE: break; + } + return va; } -AttributeValue init_value(LttvAttributeType t) +AttributeValue +init_value(LttvAttributeType t) { - AttributeValue v; - - switch(t) { - case LTTV_INT: v.dv_int = 0; break; - case LTTV_UINT: v.dv_uint = 0; break; - case LTTV_LONG: v.dv_long = 0; break; - case LTTV_ULONG: v.dv_ulong = 0; break; - case LTTV_FLOAT: v.dv_float = 0; break; - case LTTV_DOUBLE: v.dv_double = 0; break; - case LTTV_TIME: v.dv_time.tv_sec = 0; v.dv_time.tv_nsec = 0; break; - case LTTV_POINTER: v.dv_pointer = NULL; break; - case LTTV_STRING: v.dv_string = NULL; break; - case LTTV_GOBJECT: v.dv_gobject = NULL; break; - case LTTV_NONE: break; - } - return v; + AttributeValue v; + + switch(t) { + case LTTV_INT: v.dv_int = 0; break; + case LTTV_UINT: v.dv_uint = 0; break; + case LTTV_LONG: v.dv_long = 0; break; + case LTTV_ULONG: v.dv_ulong = 0; break; + case LTTV_FLOAT: v.dv_float = 0; break; + case LTTV_DOUBLE: v.dv_double = 0; break; + case LTTV_TIME: v.dv_time.tv_sec = 0; v.dv_time.tv_nsec = 0; break; + case LTTV_POINTER: v.dv_pointer = NULL; break; + case LTTV_STRING: v.dv_string = NULL; break; + case LTTV_GOBJECT: v.dv_gobject = NULL; break; + case LTTV_NONE: break; + } + return v; } unsigned int lttv_attribute_get_number(LttvAttribute *self) { - return self->attributes->len; + return self->attributes->len; } gboolean lttv_attribute_named(LttvAttribute *self, gboolean *homogeneous) { - *homogeneous = FALSE; - return TRUE; + *homogeneous = FALSE; + return TRUE; } LttvAttributeType lttv_attribute_get(LttvAttribute *self, unsigned i, LttvAttributeName *name, - LttvAttributeValue *v, gboolean *is_named) + LttvAttributeValue *v, gboolean *is_named) { - Attribute *a; + Attribute *a; - a = &g_array_index(self->attributes, Attribute, i); - *name = a->name; - *v = address_of_value(a->type, &(a->value)); + a = &g_array_index(self->attributes, Attribute, i); + *name = a->name; + *v = address_of_value(a->type, &(a->value)); *is_named = a->is_named; - return a->type; + return a->type; } LttvAttributeType lttv_attribute_get_by_name(LttvAttribute *self, LttvAttributeName name, - LttvAttributeValue *v) + LttvAttributeValue *v) { - Attribute *a; + Attribute *a; - unsigned i; + unsigned i; - gpointer p; + gpointer p; - p = g_hash_table_lookup(self->names, GUINT_TO_POINTER(name)); - if(p == NULL) return LTTV_NONE; + p = g_hash_table_lookup(self->names, GUINT_TO_POINTER(name)); + if(p == NULL) return LTTV_NONE; - i = GPOINTER_TO_UINT(p); - i--; - a = &g_array_index(self->attributes, Attribute, i); - *v = address_of_value(a->type, &(a->value)); - return a->type; + i = GPOINTER_TO_UINT(p); + i--; + a = &g_array_index(self->attributes, Attribute, i); + *v = address_of_value(a->type, &(a->value)); + return a->type; } LttvAttributeValue lttv_attribute_add(LttvAttribute *self, LttvAttributeName name, - LttvAttributeType t) + LttvAttributeType t) { - unsigned int i; + unsigned int i; - Attribute a, *pa; + Attribute a, *pa; - i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); - if(i != 0) g_error("duplicate entry in attribute table"); + i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); + if(i != 0) g_error("duplicate entry in attribute table"); - a.name = name; + a.name = name; a.is_named = 1; - a.type = t; - a.value = init_value(t); - g_array_append_val(self->attributes, a); - i = self->attributes->len - 1; - pa = &g_array_index(self->attributes, Attribute, i); - g_hash_table_insert(self->names, GUINT_TO_POINTER(name), - GUINT_TO_POINTER(i + 1)); - return address_of_value(t, &(pa->value)); + a.type = t; + a.value = init_value(t); + g_array_append_val(self->attributes, a); + i = self->attributes->len - 1; + pa = &g_array_index(self->attributes, Attribute, i); + g_hash_table_insert(self->names, GUINT_TO_POINTER(name), + GUINT_TO_POINTER(i + 1)); + return address_of_value(t, &(pa->value)); } LttvAttributeValue lttv_attribute_add_unnamed(LttvAttribute *self, LttvAttributeName name, - LttvAttributeType t) + LttvAttributeType t) { - unsigned int i; + unsigned int i; - Attribute a, *pa; + Attribute a, *pa; - i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); - if(i != 0) g_error("duplicate entry in attribute table"); + i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); + if(i != 0) g_error("duplicate entry in attribute table"); - a.name = name; + a.name = name; a.is_named = 0; - a.type = t; - a.value = init_value(t); - g_array_append_val(self->attributes, a); - i = self->attributes->len - 1; - pa = &g_array_index(self->attributes, Attribute, i); - g_hash_table_insert(self->names, GUINT_TO_POINTER(name), - GUINT_TO_POINTER(i + 1)); - return address_of_value(t, &(pa->value)); + a.type = t; + a.value = init_value(t); + g_array_append_val(self->attributes, a); + i = self->attributes->len - 1; + pa = &g_array_index(self->attributes, Attribute, i); + g_hash_table_insert(self->names, GUINT_TO_POINTER(name), + GUINT_TO_POINTER(i + 1)); + return address_of_value(t, &(pa->value)); } @@ -190,37 +191,37 @@ lttv_attribute_add_unnamed(LttvAttribute *self, LttvAttributeName name, void lttv_attribute_remove(LttvAttribute *self, unsigned i) { - Attribute *a; + Attribute *a; - a = &g_array_index(self->attributes, Attribute, i); + a = &g_array_index(self->attributes, Attribute, i); - /* If the element is a gobject, unreference it. */ - if(a->type == LTTV_GOBJECT && a->value.dv_gobject != NULL) - g_object_unref(a->value.dv_gobject); - - /* Remove the array element and its entry in the name index */ + /* If the element is a gobject, unreference it. */ + if(a->type == LTTV_GOBJECT && a->value.dv_gobject != NULL) + g_object_unref(a->value.dv_gobject); - g_hash_table_remove(self->names, GUINT_TO_POINTER(a->name)); - g_array_remove_index_fast(self->attributes, i); + /* Remove the array element and its entry in the name index */ - /* The element used to replace the removed element has its index entry - all wrong now. Reinsert it with its new position. */ + g_hash_table_remove(self->names, GUINT_TO_POINTER(a->name)); + g_array_remove_index_fast(self->attributes, i); - if(likely(self->attributes->len != i)){ - g_hash_table_remove(self->names, GUINT_TO_POINTER(a->name)); - g_hash_table_insert(self->names, GUINT_TO_POINTER(a->name), GUINT_TO_POINTER(i + 1)); - } + /* The element used to replace the removed element has its index entry + all wrong now. Reinsert it with its new position. */ + + if(likely(self->attributes->len != i)){ + g_hash_table_remove(self->names, GUINT_TO_POINTER(a->name)); + g_hash_table_insert(self->names, GUINT_TO_POINTER(a->name), GUINT_TO_POINTER(i + 1)); + } } void lttv_attribute_remove_by_name(LttvAttribute *self, LttvAttributeName name) { - unsigned int i; + unsigned int i; - i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); - if(unlikely(i == 0)) g_error("remove by name non existent attribute"); + i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); + if(unlikely(i == 0)) g_error("remove by name non existent attribute"); - lttv_attribute_remove(self, i - 1); + lttv_attribute_remove(self, i - 1); } /* Create an empty iattribute object and add it as an attribute under the @@ -231,443 +232,444 @@ lttv_attribute_remove_by_name(LttvAttribute *self, LttvAttributeName name) /*CHECK*/LttvAttribute* lttv_attribute_find_subdir(LttvAttribute *self, LttvAttributeName name) { - unsigned int i; - - Attribute a; - - LttvAttribute *new; - - i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); - if(likely(i != 0)) { - a = g_array_index(self->attributes, Attribute, i - 1); - if(likely(a.type == LTTV_GOBJECT && LTTV_IS_IATTRIBUTE(a.value.dv_gobject))) { - return LTTV_ATTRIBUTE(a.value.dv_gobject); - } - else return NULL; - } - new = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL); - *(lttv_attribute_add(self, name, LTTV_GOBJECT).v_gobject) = G_OBJECT(new); - return (LttvAttribute *)new; + unsigned int i; + + Attribute a; + + LttvAttribute *new; + + i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); + if(likely(i != 0)) { + a = g_array_index(self->attributes, Attribute, i - 1); + if(likely(a.type == LTTV_GOBJECT && LTTV_IS_IATTRIBUTE(a.value.dv_gobject))) { + return LTTV_ATTRIBUTE(a.value.dv_gobject); + } + else return NULL; + } + new = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL); + *(lttv_attribute_add(self, name, LTTV_GOBJECT).v_gobject) = G_OBJECT(new); + return (LttvAttribute *)new; } /*CHECK*/LttvAttribute* lttv_attribute_find_subdir_unnamed(LttvAttribute *self, LttvAttributeName name) { - unsigned int i; - - Attribute a; - - LttvAttribute *new; - - i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); - if(likely(i != 0)) { - a = g_array_index(self->attributes, Attribute, i - 1); - if(likely(a.type == LTTV_GOBJECT && LTTV_IS_IATTRIBUTE(a.value.dv_gobject))) { - return LTTV_ATTRIBUTE(a.value.dv_gobject); - } - else return NULL; - } - new = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL); - *(lttv_attribute_add_unnamed(self, name, LTTV_GOBJECT).v_gobject) + unsigned int i; + + Attribute a; + + LttvAttribute *new; + + i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); + if(likely(i != 0)) { + a = g_array_index(self->attributes, Attribute, i - 1); + if(likely(a.type == LTTV_GOBJECT && LTTV_IS_IATTRIBUTE(a.value.dv_gobject))) { + return LTTV_ATTRIBUTE(a.value.dv_gobject); + } + else return NULL; + } + new = g_object_new(LTTV_ATTRIBUTE_TYPE, NULL); + *(lttv_attribute_add_unnamed(self, name, LTTV_GOBJECT).v_gobject) = G_OBJECT(new); - return (LttvAttribute *)new; + return (LttvAttribute *)new; } gboolean lttv_attribute_find(LttvAttribute *self, LttvAttributeName name, - LttvAttributeType t, LttvAttributeValue *v) + LttvAttributeType t, LttvAttributeValue *v) { - unsigned int i; + unsigned int i; - Attribute *a; + Attribute *a; - i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); - if(likely(i != 0)) { - a = &g_array_index(self->attributes, Attribute, i - 1); - if(unlikely(a->type != t)) return FALSE; - *v = address_of_value(t, &(a->value)); - return TRUE; - } + i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); + if(likely(i != 0)) { + a = &g_array_index(self->attributes, Attribute, i - 1); + if(unlikely(a->type != t)) return FALSE; + *v = address_of_value(t, &(a->value)); + return TRUE; + } - *v = lttv_attribute_add(self, name, t); - return TRUE; + *v = lttv_attribute_add(self, name, t); + return TRUE; } gboolean lttv_attribute_find_unnamed(LttvAttribute *self, LttvAttributeName name, - LttvAttributeType t, LttvAttributeValue *v) + LttvAttributeType t, LttvAttributeValue *v) { - unsigned i; + unsigned i; - Attribute *a; + Attribute *a; - i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); - if(likely(i != 0)) { - a = &g_array_index(self->attributes, Attribute, i - 1); - if(unlikely(a->type != t)) return FALSE; - *v = address_of_value(t, &(a->value)); - return TRUE; - } + i = GPOINTER_TO_UINT(g_hash_table_lookup(self->names, GUINT_TO_POINTER(name))); + if(likely(i != 0)) { + a = &g_array_index(self->attributes, Attribute, i - 1); + if(unlikely(a->type != t)) return FALSE; + *v = address_of_value(t, &(a->value)); + return TRUE; + } - *v = lttv_attribute_add_unnamed(self, name, t); - return TRUE; + *v = lttv_attribute_add_unnamed(self, name, t); + return TRUE; } /*void lttv_attribute_recursive_free(LttvAttribute *self) { - int i, nb; + int i, nb; - Attribute *a; + Attribute *a; - nb = self->attributes->len; + nb = self->attributes->len; - for(i = 0 ; i < nb ; i++) { - a = &g_array_index(self->attributes, Attribute, i); - if(a->type == LTTV_GOBJECT && LTTV_IS_ATTRIBUTE(a->value.dv_gobject)) { - lttv_attribute_recursive_free((LttvAttribute *)(a->value.dv_gobject)); - } - } - g_object_unref(self); + for(i = 0 ; i < nb ; i++) { + a = &g_array_index(self->attributes, Attribute, i); + if(a->type == LTTV_GOBJECT && LTTV_IS_ATTRIBUTE(a->value.dv_gobject)) { + lttv_attribute_recursive_free((LttvAttribute *)(a->value.dv_gobject)); + } + } + g_object_unref(self); }*/ -void lttv_attribute_recursive_add(LttvAttribute *dest, LttvAttribute *src) +void +lttv_attribute_recursive_add(LttvAttribute *dest, LttvAttribute *src) { - int i, nb; + int i, nb; - Attribute *a; + Attribute *a; - LttvAttributeValue value; - gboolean retval; + LttvAttributeValue value; + gboolean retval; - nb = src->attributes->len; + nb = src->attributes->len; - for(i = 0 ; i < nb ; i++) { - a = &g_array_index(src->attributes, Attribute, i); - if(a->type == LTTV_GOBJECT && LTTV_IS_ATTRIBUTE(a->value.dv_gobject)) { + for(i = 0 ; i < nb ; i++) { + a = &g_array_index(src->attributes, Attribute, i); + if(a->type == LTTV_GOBJECT && LTTV_IS_ATTRIBUTE(a->value.dv_gobject)) { if(a->is_named) - lttv_attribute_recursive_add( - /*CHECK*/(LttvAttribute *)lttv_attribute_find_subdir(dest, a->name), - (LttvAttribute *)(a->value.dv_gobject)); + lttv_attribute_recursive_add( + /*CHECK*/(LttvAttribute *)lttv_attribute_find_subdir(dest, a->name), + (LttvAttribute *)(a->value.dv_gobject)); else - lttv_attribute_recursive_add( - /*CHECK*/(LttvAttribute *)lttv_attribute_find_subdir_unnamed( + lttv_attribute_recursive_add( + /*CHECK*/(LttvAttribute *)lttv_attribute_find_subdir_unnamed( dest, a->name), (LttvAttribute *)(a->value.dv_gobject)); - } - else { - if(a->is_named) { - retval= lttv_attribute_find(dest, a->name, a->type, &value); - g_assert(retval); - } - else { - retval= lttv_attribute_find_unnamed(dest, a->name, a->type, &value); - g_assert(retval); - } - switch(a->type) { - case LTTV_INT: - *value.v_int += a->value.dv_int; - break; - case LTTV_UINT: - *value.v_uint += a->value.dv_uint; - break; - case LTTV_LONG: - *value.v_long += a->value.dv_long; - break; - case LTTV_ULONG: - *value.v_ulong += a->value.dv_ulong; - break; - case LTTV_FLOAT: - *value.v_float += a->value.dv_float; - break; - case LTTV_DOUBLE: - *value.v_double += a->value.dv_double; - break; - case LTTV_TIME: - *value.v_time = ltt_time_add(*value.v_time, a->value.dv_time); - break; - case LTTV_POINTER: - break; - case LTTV_STRING: - break; - case LTTV_GOBJECT: - break; - case LTTV_NONE: - break; - } - } - } + } + else { + if(a->is_named) { + retval= lttv_attribute_find(dest, a->name, a->type, &value); + g_assert(retval); + } + else { + retval= lttv_attribute_find_unnamed(dest, a->name, a->type, &value); + g_assert(retval); + } + switch(a->type) { + case LTTV_INT: + *value.v_int += a->value.dv_int; + break; + case LTTV_UINT: + *value.v_uint += a->value.dv_uint; + break; + case LTTV_LONG: + *value.v_long += a->value.dv_long; + break; + case LTTV_ULONG: + *value.v_ulong += a->value.dv_ulong; + break; + case LTTV_FLOAT: + *value.v_float += a->value.dv_float; + break; + case LTTV_DOUBLE: + *value.v_double += a->value.dv_double; + break; + case LTTV_TIME: + *value.v_time = ltt_time_add(*value.v_time, a->value.dv_time); + break; + case LTTV_POINTER: + break; + case LTTV_STRING: + break; + case LTTV_GOBJECT: + break; + case LTTV_NONE: + break; + } + } + } } static void print_indent(FILE *fp, int pos) { - int i; + int i; - for(i = 0 ; i < pos ; i++) putc(' ', fp); + for(i = 0 ; i < pos ; i++) putc(' ', fp); } void lttv_attribute_write_xml(LttvAttribute *self, FILE *fp, int pos, int indent) { - int i, nb; - - Attribute *a; - - nb = self->attributes->len; - - fprintf(fp,"\n"); - for(i = 0 ; i < nb ; i++) { - a = &g_array_index(self->attributes, Attribute, i); - print_indent(fp, pos); - fprintf(fp, "name)); - if(a->type == LTTV_GOBJECT && LTTV_IS_ATTRIBUTE(a->value.dv_gobject)) { - fprintf(fp, "TYPE=ATTRS>"); - lttv_attribute_write_xml((LttvAttribute *)(a->value.dv_gobject), fp, - pos + indent, indent); - } - else { - switch(a->type) { - case LTTV_INT: - fprintf(fp, "TYPE=INT VALUE=%d/>\n", a->value.dv_int); - break; - case LTTV_UINT: - fprintf(fp, "TYPE=UINT VALUE=%u/>\n", a->value.dv_uint); - break; - case LTTV_LONG: - fprintf(fp, "TYPE=LONG VALUE=%ld/>\n", a->value.dv_long); - break; - case LTTV_ULONG: - fprintf(fp, "TYPE=ULONG VALUE=%lu/>\n", a->value.dv_ulong); - break; - case LTTV_FLOAT: - fprintf(fp, "TYPE=FLOAT VALUE=%f/>\n", a->value.dv_float); - break; - case LTTV_DOUBLE: - fprintf(fp, "TYPE=DOUBLE VALUE=%f/>\n", a->value.dv_double); - break; - case LTTV_TIME: - fprintf(fp, "TYPE=TIME SEC=%lu NSEC=%lu/>\n", a->value.dv_time.tv_sec, - a->value.dv_time.tv_nsec); - break; - case LTTV_POINTER: - fprintf(fp, "TYPE=POINTER VALUE=%p/>\n", a->value.dv_pointer); - break; - case LTTV_STRING: - fprintf(fp, "TYPE=STRING VALUE=\"%s\"/>\n", a->value.dv_string); - break; - case LTTV_GOBJECT: - fprintf(fp, "TYPE=GOBJECT VALUE=%p/>\n", a->value.dv_gobject); - break; - case LTTV_NONE: - fprintf(fp, "TYPE=NONE/>\n"); - break; - } - } - } - print_indent(fp, pos); - fprintf(fp,"\n"); + int i, nb; + + Attribute *a; + + nb = self->attributes->len; + + fprintf(fp,"\n"); + for(i = 0 ; i < nb ; i++) { + a = &g_array_index(self->attributes, Attribute, i); + print_indent(fp, pos); + fprintf(fp, "name)); + if(a->type == LTTV_GOBJECT && LTTV_IS_ATTRIBUTE(a->value.dv_gobject)) { + fprintf(fp, "TYPE=ATTRS>"); + lttv_attribute_write_xml((LttvAttribute *)(a->value.dv_gobject), fp, + pos + indent, indent); + } + else { + switch(a->type) { + case LTTV_INT: + fprintf(fp, "TYPE=INT VALUE=%d/>\n", a->value.dv_int); + break; + case LTTV_UINT: + fprintf(fp, "TYPE=UINT VALUE=%u/>\n", a->value.dv_uint); + break; + case LTTV_LONG: + fprintf(fp, "TYPE=LONG VALUE=%ld/>\n", a->value.dv_long); + break; + case LTTV_ULONG: + fprintf(fp, "TYPE=ULONG VALUE=%lu/>\n", a->value.dv_ulong); + break; + case LTTV_FLOAT: + fprintf(fp, "TYPE=FLOAT VALUE=%f/>\n", a->value.dv_float); + break; + case LTTV_DOUBLE: + fprintf(fp, "TYPE=DOUBLE VALUE=%f/>\n", a->value.dv_double); + break; + case LTTV_TIME: + fprintf(fp, "TYPE=TIME SEC=%lu NSEC=%lu/>\n", + a->value.dv_time.tv_sec, a->value.dv_time.tv_nsec); + break; + case LTTV_POINTER: + fprintf(fp, "TYPE=POINTER VALUE=%p/>\n", a->value.dv_pointer); + break; + case LTTV_STRING: + fprintf(fp, "TYPE=STRING VALUE=\"%s\"/>\n", a->value.dv_string); + break; + case LTTV_GOBJECT: + fprintf(fp, "TYPE=GOBJECT VALUE=%p/>\n", a->value.dv_gobject); + break; + case LTTV_NONE: + fprintf(fp, "TYPE=NONE/>\n"); + break; + } + } + } + print_indent(fp, pos); + fprintf(fp,"\n"); } void lttv_attribute_read_xml(LttvAttribute *self, FILE *fp) { - int res; - - char buffer[256], type[10]; - - LttvAttributeName name; - - LttvAttributeValue value; - - LttvAttribute *subtree; - - fscanf(fp,""); - while(1) { - res = fscanf(fp, "]", buffer, type); - g_assert(res == 2); - name = g_quark_from_string(buffer); - if(strcmp(type, "ATTRS") == 0) { - fscanf(fp, ">"); - subtree = lttv_attribute_find_subdir(self, name); - lttv_attribute_read_xml(subtree, fp); - } - else if(strcmp(type, "INT") == 0) { - value = lttv_attribute_add(self, name, LTTV_INT); - res = fscanf(fp, " VALUE=%d/>", value.v_int); - g_assert(res == 1); - } - else if(strcmp(type, "UINT") == 0) { - value = lttv_attribute_add(self, name, LTTV_UINT); - res = fscanf(fp, " VALUE=%u/>", value.v_uint); - g_assert(res == 1); - } - else if(strcmp(type, "LONG") == 0) { - value = lttv_attribute_add(self, name, LTTV_LONG); - res = fscanf(fp, " VALUE=%ld/>", value.v_long); - g_assert(res == 1); - } - else if(strcmp(type, "ULONG") == 0) { - value = lttv_attribute_add(self, name, LTTV_ULONG); - res = fscanf(fp, " VALUE=%lu/>", value.v_ulong); - g_assert(res == 1); - } - else if(strcmp(type, "FLOAT") == 0) { - float d; - value = lttv_attribute_add(self, name, LTTV_FLOAT); - res = fscanf(fp, " VALUE=%f/>", &d); - *(value.v_float) = d; - g_assert(res == 1); - } - else if(strcmp(type, "DOUBLE") == 0) { - value = lttv_attribute_add(self, name, LTTV_DOUBLE); - res = fscanf(fp, " VALUE=%lf/>", value.v_double); - g_assert(res == 1); - } - else if(strcmp(type, "TIME") == 0) { - value = lttv_attribute_add(self, name, LTTV_TIME); - res = fscanf(fp, " SEC=%lu NSEC=%lu/>", &(value.v_time->tv_sec), - &(value.v_time->tv_nsec)); - g_assert(res == 2); - } - else if(strcmp(type, "POINTER") == 0) { - value = lttv_attribute_add(self, name, LTTV_POINTER); - res = fscanf(fp, " VALUE=%p/>", value.v_pointer); - g_error("Cannot read a pointer"); - } - else if(strcmp(type, "STRING") == 0) { - value = lttv_attribute_add(self, name, LTTV_STRING); - res = fscanf(fp, " VALUE=\"%256[^\"]\"/>", buffer); - *(value.v_string) = g_strdup(buffer); - g_assert(res == 1); - } - else if(strcmp(type, "GOBJECT") == 0) { - value = lttv_attribute_add(self, name, LTTV_GOBJECT); - res = fscanf(fp, " VALUE=%p/>", value.v_gobject); - g_error("Cannot read a pointer"); - } - else if(strcmp(type, "NONE") == 0) { - value = lttv_attribute_add(self, name, LTTV_NONE); - fscanf(fp, "/>"); - } - else g_error("Unknown type to read"); - } - fscanf(fp,""); + int res; + + char buffer[256], type[10]; + + LttvAttributeName name; + + LttvAttributeValue value; + + LttvAttribute *subtree; + + fscanf(fp,""); + while(1) { + res = fscanf(fp, "]", buffer, type); + g_assert(res == 2); + name = g_quark_from_string(buffer); + if(strcmp(type, "ATTRS") == 0) { + fscanf(fp, ">"); + subtree = lttv_attribute_find_subdir(self, name); + lttv_attribute_read_xml(subtree, fp); + } + else if(strcmp(type, "INT") == 0) { + value = lttv_attribute_add(self, name, LTTV_INT); + res = fscanf(fp, " VALUE=%d/>", value.v_int); + g_assert(res == 1); + } + else if(strcmp(type, "UINT") == 0) { + value = lttv_attribute_add(self, name, LTTV_UINT); + res = fscanf(fp, " VALUE=%u/>", value.v_uint); + g_assert(res == 1); + } + else if(strcmp(type, "LONG") == 0) { + value = lttv_attribute_add(self, name, LTTV_LONG); + res = fscanf(fp, " VALUE=%ld/>", value.v_long); + g_assert(res == 1); + } + else if(strcmp(type, "ULONG") == 0) { + value = lttv_attribute_add(self, name, LTTV_ULONG); + res = fscanf(fp, " VALUE=%lu/>", value.v_ulong); + g_assert(res == 1); + } + else if(strcmp(type, "FLOAT") == 0) { + float d; + value = lttv_attribute_add(self, name, LTTV_FLOAT); + res = fscanf(fp, " VALUE=%f/>", &d); + *(value.v_float) = d; + g_assert(res == 1); + } + else if(strcmp(type, "DOUBLE") == 0) { + value = lttv_attribute_add(self, name, LTTV_DOUBLE); + res = fscanf(fp, " VALUE=%lf/>", value.v_double); + g_assert(res == 1); + } + else if(strcmp(type, "TIME") == 0) { + value = lttv_attribute_add(self, name, LTTV_TIME); + res = fscanf(fp, " SEC=%lu NSEC=%lu/>", &(value.v_time->tv_sec), + &(value.v_time->tv_nsec)); + g_assert(res == 2); + } + else if(strcmp(type, "POINTER") == 0) { + value = lttv_attribute_add(self, name, LTTV_POINTER); + res = fscanf(fp, " VALUE=%p/>", value.v_pointer); + g_error("Cannot read a pointer"); + } + else if(strcmp(type, "STRING") == 0) { + value = lttv_attribute_add(self, name, LTTV_STRING); + res = fscanf(fp, " VALUE=\"%256[^\"]\"/>", buffer); + *(value.v_string) = g_strdup(buffer); + g_assert(res == 1); + } + else if(strcmp(type, "GOBJECT") == 0) { + value = lttv_attribute_add(self, name, LTTV_GOBJECT); + res = fscanf(fp, " VALUE=%p/>", value.v_gobject); + g_error("Cannot read a pointer"); + } + else if(strcmp(type, "NONE") == 0) { + value = lttv_attribute_add(self, name, LTTV_NONE); + fscanf(fp, "/>"); + } + else g_error("Unknown type to read"); + } + fscanf(fp,""); } static LttvAttribute * new_attribute (LttvAttribute *self) { - return g_object_new(LTTV_ATTRIBUTE_TYPE, NULL); + return g_object_new(LTTV_ATTRIBUTE_TYPE, NULL); } static void attribute_interface_init (gpointer g_iface, gpointer iface_data) { - LttvIAttributeClass *klass = (LttvIAttributeClass *)g_iface; + LttvIAttributeClass *klass = (LttvIAttributeClass *)g_iface; - klass->new_attribute = (LttvIAttribute* (*) (LttvIAttribute *self)) - new_attribute; + klass->new_attribute = (LttvIAttribute* (*) (LttvIAttribute *self)) + new_attribute; - klass->get_number = (unsigned int (*) (LttvIAttribute *self)) - lttv_attribute_get_number; + klass->get_number = (unsigned int (*) (LttvIAttribute *self)) + lttv_attribute_get_number; - klass->named = (gboolean (*) (LttvIAttribute *self, gboolean *homogeneous)) - lttv_attribute_named; + klass->named = (gboolean (*) (LttvIAttribute *self, gboolean *homogeneous)) + lttv_attribute_named; - klass->get = (LttvAttributeType (*) (LttvIAttribute *self, unsigned i, - LttvAttributeName *name, LttvAttributeValue *v, gboolean *is_named)) + klass->get = (LttvAttributeType (*) (LttvIAttribute *self, unsigned i, + LttvAttributeName *name, LttvAttributeValue *v, gboolean *is_named)) lttv_attribute_get; - klass->get_by_name = (LttvAttributeType (*) (LttvIAttribute *self, - LttvAttributeName name, LttvAttributeValue *v)) - lttv_attribute_get_by_name; + klass->get_by_name = (LttvAttributeType (*) (LttvIAttribute *self, + LttvAttributeName name, LttvAttributeValue *v)) + lttv_attribute_get_by_name; - klass->add = (LttvAttributeValue (*) (LttvIAttribute *self, - LttvAttributeName name, LttvAttributeType t)) lttv_attribute_add; + klass->add = (LttvAttributeValue (*) (LttvIAttribute *self, + LttvAttributeName name, LttvAttributeType t)) lttv_attribute_add; - klass->add_unnamed = (LttvAttributeValue (*) (LttvIAttribute *self, - LttvAttributeName name, LttvAttributeType t)) lttv_attribute_add_unnamed; + klass->add_unnamed = (LttvAttributeValue (*) (LttvIAttribute *self, + LttvAttributeName name, LttvAttributeType t)) lttv_attribute_add_unnamed; - klass->remove = (void (*) (LttvIAttribute *self, unsigned i)) - lttv_attribute_remove; + klass->remove = (void (*) (LttvIAttribute *self, unsigned i)) + lttv_attribute_remove; - klass->remove_by_name = (void (*) (LttvIAttribute *self, - LttvAttributeName name)) lttv_attribute_remove_by_name; + klass->remove_by_name = (void (*) (LttvIAttribute *self, + LttvAttributeName name)) lttv_attribute_remove_by_name; - klass->find_subdir = (LttvIAttribute* (*) (LttvIAttribute *self, - LttvAttributeName name)) lttv_attribute_find_subdir; + klass->find_subdir = (LttvIAttribute* (*) (LttvIAttribute *self, + LttvAttributeName name)) lttv_attribute_find_subdir; - klass->find_subdir = (LttvIAttribute* (*) (LttvIAttribute *self, - LttvAttributeName name)) lttv_attribute_find_subdir_unnamed; + klass->find_subdir = (LttvIAttribute* (*) (LttvIAttribute *self, + LttvAttributeName name)) lttv_attribute_find_subdir_unnamed; } static void attribute_instance_init (GTypeInstance *instance, gpointer g_class) { - LttvAttribute *self = (LttvAttribute *)instance; - self->names = g_hash_table_new(g_direct_hash, - g_direct_equal); - self->attributes = g_array_new(FALSE, FALSE, sizeof(Attribute)); + LttvAttribute *self = (LttvAttribute *)instance; + self->names = g_hash_table_new(g_direct_hash, + g_direct_equal); + self->attributes = g_array_new(FALSE, FALSE, sizeof(Attribute)); } static void attribute_finalize (LttvAttribute *self) { - guint i; - g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "attribute_finalize()"); - - for(i=0;iattributes->len;i++) { - lttv_attribute_remove(self, i); - } - - g_hash_table_destroy(self->names); - g_array_free(self->attributes, TRUE); + guint i; + g_log(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "attribute_finalize()"); + + for(i=0;iattributes->len;i++) { + lttv_attribute_remove(self, i); + } + + g_hash_table_destroy(self->names); + g_array_free(self->attributes, TRUE); } static void attribute_class_init (LttvAttributeClass *klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS(klass); - - gobject_class->finalize = (void (*)(GObject *self))attribute_finalize; + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->finalize = (void (*)(GObject *self))attribute_finalize; } GType lttv_attribute_get_type (void) { - static GType type = 0; - if (type == 0) { - static const GTypeInfo info = { - sizeof (LttvAttributeClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) attribute_class_init, /* class_init */ - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (LttvAttribute), - 0, /* n_preallocs */ - (GInstanceInitFunc) attribute_instance_init, /* instance_init */ - NULL /* value handling */ - }; - - static const GInterfaceInfo iattribute_info = { - (GInterfaceInitFunc) attribute_interface_init, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - - type = g_type_register_static (G_TYPE_OBJECT, "LttvAttributeType", &info, - 0); - g_type_add_interface_static (type, LTTV_IATTRIBUTE_TYPE, &iattribute_info); - } - return type; + static GType type = 0; + if (type == 0) { + static const GTypeInfo info = { + sizeof (LttvAttributeClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) attribute_class_init, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (LttvAttribute), + 0, /* n_preallocs */ + (GInstanceInitFunc) attribute_instance_init, /* instance_init */ + NULL /* value handling */ + }; + + static const GInterfaceInfo iattribute_info = { + (GInterfaceInitFunc) attribute_interface_init, /* interface_init */ + NULL, /* interface_finalize */ + NULL /* interface_data */ + }; + + type = g_type_register_static (G_TYPE_OBJECT, "LttvAttributeType", &info, + 0); + g_type_add_interface_static (type, LTTV_IATTRIBUTE_TYPE, &iattribute_info); + } + return type; }