3 /* ddt_use - use of datatypes structs (public) */
5 /* Authors: Olivier Aumage, Martin Quinson */
6 /* Copyright (C) 2003, 2004 the GRAS posse. */
8 /* This program is free software; you can redistribute it and/or modify it
9 under the terms of the license (GNU LGPL) which comes with this package. */
11 #include "DataDesc/datadesc_private.h"
13 GRAS_LOG_NEW_DEFAULT_SUBCATEGORY(use,DataDesc);
16 * gras_datadesc_type_cmp:
18 * Compares two datadesc types with the same semantic than strcmp.
20 * This comparison does not take the set headers into account (name and ID),
21 * but only the payload (actual type description).
23 int gras_datadesc_type_cmp(const gras_datadesc_t *d1,
24 const gras_datadesc_t *d2) {
26 gras_dd_cat_struct_field_t *field1,*field2;
29 if (!d1 & & d2) return 1;
30 if (!d1 && !d2) return 0;
31 if ( d1 && !d2) return -1;
33 if (d1->size != d2->size ) return d1->size > d2->size ? 1 : -1;
34 if (d1->alignment != d2->alignment) return d1->alignment > d2->alignment ? 1 : -1;
35 if (d1->aligned_size != d2->aligned_size) return d1->aligned_siz e > d2->aligned_size ? 1 : -1;
37 if (d1->category_code != d2->category_code) return d1->category_code > d2->category_code ? 1 : -1;
39 if (d1->pre != d2->pre) return d1->pre > d2->pre ? 1 : -1;
40 if (d1->post != d2->post) return d1->post > d2->post ? 1 : -1;
42 switch (d1->category_code) {
43 case e_gras_datadesc_type_cat_scalar:
44 if (d1->category.scalar_data.encoding != d2->category.scalar_data.encoding)
45 return d1->category.scalar_data.encoding > d2->category.scalar_data.encoding ? 1 : -1 ;
48 case e_gras_datadesc_type_cat_struct:
49 if (d1->category.struct_data.field_count != d2->category.struct_data.field_count)
50 return d1->category.struct_data.field_count > d2->category.struct_data.field_count ? 1 : -1;
52 if (gras_dynar_length(d1->category.struct_data.fields) !=
53 gras_dynar_length(d2->category.struct_data.fields))
54 return gras_dynar_length(d1->category.struct_data.fields) >
55 gras_dynar_length(d2->category.struct_data.fields) ?
58 gras_dynar_foreach(d1->category.struct_data.fields, cpt, field1) {
60 gras_dynar_get(d2->category.struct_data.fields, cpt, field2);
61 ret = gras_datadesc_type_cmp(field1,field2);
68 case e_gras_datadesc_type_cat_union:
69 if (d1->category.union_data.field_count != d2->category.union_data.field_count)
70 return d1->category.union_data.field_count > d2->category.union_data.field_count ? 1 : -1;
72 if (gras_dynar_length(d1->category.union_data.fields) !=
73 gras_dynar_length(d2->category.union_data.fields))
74 return gras_dynar_length(d1->category.union_data.fields) >
75 gras_dynar_length(d2->category.union_data.fields) ?
78 gras_dynar_foreach(d1->category.union_data.fields, cpt, field1) {
80 gras_dynar_get(d2->category.union_data.fields, cpt, field2);
81 ret = gras_datadesc_type_cmp(field1,field2);
89 case e_gras_datadesc_type_cat_ref:
90 if (d1->category.ref_data.discriminant != d2->category.ref_data.discriminant)
91 return d1->category.ref_data.discriminant > d2->category.ref_data.discriminant ? 1 : -1;
93 if (d1->category.ref_data.code != d2->category.ref_data.code)
94 return d1->category.ref_data.code > d2->category.ref_data.code ? 1 : -1;
97 case e_gras_datadesc_type_cat_array:
98 if (d1->category.array_data.code != d2->category.array_data.code)
99 return d1->category.array_data.code > d2->category.array_data.code ? 1 : -1;
101 if (d1->category.array_data.fixed_size != d2->category.array_data.fixed_size)
102 return d1->category.array_data.fixed_size > d2->category.array_data.fixed_size ? 1 : -1;
104 if (d1->category.array_data.dynamic_size != d2->category.array_data.dynamic_size)
105 return d1->category.array_data.dynamic_size > d2->category.array_data.dynamic_size ? 1 : -1;
109 case e_gras_datadesc_type_cat_ignored:
110 /* That's ignored... */
112 /* two stupidly created ddt are equally stupid ;) */
119 gras_error_t gras_datadesc_cpy(gras_datadesc_t *type, void *src, void **dst) {