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_get_id_from_name:
17 * Returns: -1 in case of error.
19 * Retrieve the ID of a previously declared datatype from its name.
22 gras_datadesc_get_id_from_name(const char *name) {
24 gras_datadesc_type_t *type;
26 errcode = gras_ddt_get_by_name(name,&type);
27 if (errcode != no_error)
33 * gras_datadesc_type_cmp:
35 * Compares two datadesc types with the same semantic than strcmp.
37 * This comparison does not take the set headers into account (name and ID),
38 * but only the payload (actual type description).
40 int gras_datadesc_type_cmp(const gras_datadesc_type_t *d1,
41 const gras_datadesc_type_t *d2) {
43 gras_dd_cat_field_t *field1,*field2;
44 gras_datadesc_type_t *field_desc_1,*field_desc_2;
47 if (!d1 && d2) return 1;
48 if (!d1 && !d2) return 0;
49 if ( d1 && !d2) return -1;
51 if (d1->size != d2->size ) return d1->size > d2->size ? 1 : -1;
52 if (d1->alignment != d2->alignment) return d1->alignment > d2->alignment ? 1 : -1;
53 if (d1->aligned_size != d2->aligned_size) return d1->aligned_size > d2->aligned_size ? 1 : -1;
55 if (d1->category_code != d2->category_code) return d1->category_code > d2->category_code ? 1 : -1;
57 if (d1->pre != d2->pre) return d1->pre > d2->pre ? 1 : -1;
58 if (d1->post != d2->post) return d1->post > d2->post ? 1 : -1;
60 switch (d1->category_code) {
61 case e_gras_datadesc_type_cat_scalar:
62 if (d1->category.scalar_data.encoding != d2->category.scalar_data.encoding)
63 return d1->category.scalar_data.encoding > d2->category.scalar_data.encoding ? 1 : -1 ;
66 case e_gras_datadesc_type_cat_struct:
67 if (gras_dynar_length(d1->category.struct_data.fields) !=
68 gras_dynar_length(d2->category.struct_data.fields))
69 return gras_dynar_length(d1->category.struct_data.fields) >
70 gras_dynar_length(d2->category.struct_data.fields) ?
73 gras_dynar_foreach(d1->category.struct_data.fields, cpt, field1) {
75 gras_dynar_get(d2->category.struct_data.fields, cpt, field2);
76 gras_ddt_get_by_code(field1->code,&field_desc_1); /* FIXME: errcode ignored */
77 gras_ddt_get_by_code(field2->code,&field_desc_2);
78 ret = gras_datadesc_type_cmp(field_desc_1,field_desc_2);
85 case e_gras_datadesc_type_cat_union:
86 if (d1->category.union_data.field_count != d2->category.union_data.field_count)
87 return d1->category.union_data.field_count > d2->category.union_data.field_count ? 1 : -1;
89 if (gras_dynar_length(d1->category.union_data.fields) !=
90 gras_dynar_length(d2->category.union_data.fields))
91 return gras_dynar_length(d1->category.union_data.fields) >
92 gras_dynar_length(d2->category.union_data.fields) ?
95 gras_dynar_foreach(d1->category.union_data.fields, cpt, field1) {
97 gras_dynar_get(d2->category.union_data.fields, cpt, field2);
98 gras_ddt_get_by_code(field1->code,&field_desc_1); /* FIXME: errcode ignored */
99 gras_ddt_get_by_code(field2->code,&field_desc_2);
100 ret = gras_datadesc_type_cmp(field_desc_1,field_desc_2);
108 case e_gras_datadesc_type_cat_ref:
109 if (d1->category.ref_data.discriminant != d2->category.ref_data.discriminant)
110 return d1->category.ref_data.discriminant > d2->category.ref_data.discriminant ? 1 : -1;
112 if (d1->category.ref_data.code != d2->category.ref_data.code)
113 return d1->category.ref_data.code > d2->category.ref_data.code ? 1 : -1;
116 case e_gras_datadesc_type_cat_array:
117 if (d1->category.array_data.code != d2->category.array_data.code)
118 return d1->category.array_data.code > d2->category.array_data.code ? 1 : -1;
120 if (d1->category.array_data.fixed_size != d2->category.array_data.fixed_size)
121 return d1->category.array_data.fixed_size > d2->category.array_data.fixed_size ? 1 : -1;
123 if (d1->category.array_data.dynamic_size != d2->category.array_data.dynamic_size)
124 return d1->category.array_data.dynamic_size > d2->category.array_data.dynamic_size ? 1 : -1;
128 case e_gras_datadesc_type_cat_ignored:
129 /* That's ignored... */
131 /* two stupidly created ddt are equally stupid ;) */
141 * Copy the data pointed by src and described by type to a new location, and store a pointer to it in dst.
144 gras_error_t gras_datadesc_cpy(gras_datadesc_type_t *type, void *src, void **dst) {
149 * gras_datadesc_send:
151 * Copy the data pointed by src and described by type to the socket
154 gras_error_t gras_datadesc_send(gras_socket_t *sock, gras_datadesc_type_t *type, void *src) {
160 * gras_datadesc_recv:
162 * Get an instance of the datatype described by @type from the @socket, and store a pointer to it in @dst
166 gras_datadesc_recv(gras_socket_t *sock, gras_datadesc_type_t *type, void **dst) {