Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix format strings to match their arguments.
[simgrid.git] / src / xbt / datadesc / datadesc.c
1 /* datadesc - data description in order to send/recv it in XBT             */
2
3 /* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team.
4  * All rights reserved.                                                     */
5
6 /* This program is free software; you can redistribute it and/or modify it
7  * under the terms of the license (GNU LGPL) which comes with this package. */
8
9 #include "datadesc_private.h"
10 #include "portable.h"
11
12 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ddt, xbt, "Data description");
13 /* FIXME: make this host-dependent using a trick such as UserData*/
14 /*@null@*/ xbt_set_t xbt_datadesc_set_local = NULL;
15
16
17 /* callback for array size when sending strings */
18 static int _strlen_cb( /*@unused@ */ xbt_datadesc_type_t type, /*@unused@ */
19                       xbt_cbps_t vars, void *data)
20 {
21
22   return 1 + (int) strlen(data);
23 }
24
25
26 /**
27  * xbt_datadesc_init:
28  *
29  * Initialize the datadesc module.
30  * FIXME: We assume that when neither signed nor unsigned is given,
31  *    that means signed. To be checked by configure.
32  **/
33 void xbt_datadesc_preinit(void)
34 {
35   xbt_datadesc_type_t ddt;     /* What to add */
36
37   /* only initialize once */
38   if (xbt_datadesc_set_local != NULL)
39     return;
40
41   XBT_VERB("Initializing DataDesc");
42
43   xbt_datadesc_set_local = xbt_set_new();
44
45
46   /* all known datatypes */
47
48   ddt = xbt_datadesc_scalar("signed char",
49                              xbt_ddt_scalar_char,
50                              e_xbt_dd_scalar_encoding_sint);
51   ddt = xbt_datadesc_scalar("char",
52                              xbt_ddt_scalar_char,
53                              e_xbt_dd_scalar_encoding_sint);
54   ddt = xbt_datadesc_scalar("unsigned char",
55                              xbt_ddt_scalar_char,
56                              e_xbt_dd_scalar_encoding_uint);
57
58   ddt = xbt_datadesc_scalar("signed short int",
59                              xbt_ddt_scalar_short,
60                              e_xbt_dd_scalar_encoding_sint);
61   ddt = xbt_datadesc_scalar("short int",
62                              xbt_ddt_scalar_short,
63                              e_xbt_dd_scalar_encoding_sint);
64   ddt = xbt_datadesc_scalar("short",
65                              xbt_ddt_scalar_short,
66                              e_xbt_dd_scalar_encoding_sint);
67   ddt = xbt_datadesc_scalar("unsigned short int",
68                              xbt_ddt_scalar_short,
69                              e_xbt_dd_scalar_encoding_uint);
70
71   ddt = xbt_datadesc_scalar("signed int",
72                              xbt_ddt_scalar_int,
73                              e_xbt_dd_scalar_encoding_sint);
74   ddt = xbt_datadesc_scalar("int",
75                              xbt_ddt_scalar_int,
76                              e_xbt_dd_scalar_encoding_sint);
77   ddt = xbt_datadesc_scalar("unsigned int",
78                              xbt_ddt_scalar_int,
79                              e_xbt_dd_scalar_encoding_uint);
80
81   ddt = xbt_datadesc_scalar("signed long int",
82                              xbt_ddt_scalar_long,
83                              e_xbt_dd_scalar_encoding_sint);
84   ddt = xbt_datadesc_scalar("long int",
85                              xbt_ddt_scalar_long,
86                              e_xbt_dd_scalar_encoding_sint);
87   ddt = xbt_datadesc_scalar("long",
88                              xbt_ddt_scalar_long,
89                              e_xbt_dd_scalar_encoding_sint);
90   ddt = xbt_datadesc_scalar("unsigned long int",
91                              xbt_ddt_scalar_long,
92                              e_xbt_dd_scalar_encoding_uint);
93
94   ddt = xbt_datadesc_scalar("signed long long int",
95                              xbt_ddt_scalar_long_long,
96                              e_xbt_dd_scalar_encoding_sint);
97   ddt = xbt_datadesc_scalar("long long int",
98                              xbt_ddt_scalar_long_long,
99                              e_xbt_dd_scalar_encoding_sint);
100   ddt = xbt_datadesc_scalar("unsigned long long int",
101                              xbt_ddt_scalar_long_long,
102                              e_xbt_dd_scalar_encoding_uint);
103
104   ddt = xbt_datadesc_scalar("data pointer",
105                              xbt_ddt_scalar_pdata,
106                              e_xbt_dd_scalar_encoding_uint);
107   ddt = xbt_datadesc_scalar("function pointer",
108                              xbt_ddt_scalar_pfunc,
109                              e_xbt_dd_scalar_encoding_uint);
110
111   ddt = xbt_datadesc_scalar("float",
112                              xbt_ddt_scalar_float,
113                              e_xbt_dd_scalar_encoding_float);
114   ddt = xbt_datadesc_scalar("double",
115                              xbt_ddt_scalar_double,
116                              e_xbt_dd_scalar_encoding_float);
117
118   ddt = xbt_datadesc_array_dyn("char[]",
119                                 xbt_datadesc_by_name("char"), _strlen_cb);
120   xbt_datadesc_ref("string", ddt);
121   xbt_datadesc_ref("xbt_string_t", ddt);
122
123   /* specific datatype: the exception type (for RPC) */
124   ddt = xbt_datadesc_struct("ex_t");
125   xbt_datadesc_struct_append(ddt, "msg", xbt_datadesc_by_name("string"));
126   xbt_datadesc_struct_append(ddt, "category",
127                               xbt_datadesc_by_name("int"));
128   xbt_datadesc_struct_append(ddt, "value", xbt_datadesc_by_name("int"));
129
130   xbt_datadesc_struct_append(ddt, "remote",
131                               xbt_datadesc_by_name("short int"));
132
133   xbt_datadesc_struct_append(ddt, "host",
134                               xbt_datadesc_by_name("string"));
135   xbt_datadesc_struct_append(ddt, "procname",
136                               xbt_datadesc_by_name("string"));
137   xbt_datadesc_struct_append(ddt, "pid",
138                               xbt_datadesc_by_name("long int"));
139   xbt_datadesc_struct_append(ddt, "file",
140                               xbt_datadesc_by_name("string"));
141   xbt_datadesc_struct_append(ddt, "line", xbt_datadesc_by_name("int"));
142   xbt_datadesc_struct_append(ddt, "func",
143                               xbt_datadesc_by_name("string"));
144   xbt_datadesc_struct_append(ddt, "used", xbt_datadesc_by_name("int"));
145   xbt_datadesc_cb_field_push(ddt, "used");
146   xbt_datadesc_struct_append(ddt, "bt_strings",
147                               xbt_datadesc_ref_pop_arr
148                               (xbt_datadesc_by_name("string")));
149
150   xbt_datadesc_struct_close(ddt);
151
152   /* specific datatype: xbt_peer_t */
153   ddt = xbt_datadesc_struct("s_xbt_peer_t");
154   xbt_datadesc_struct_append(ddt, "name",
155                               xbt_datadesc_by_name("string"));
156   xbt_datadesc_struct_append(ddt, "port", xbt_datadesc_by_name("int"));
157   xbt_datadesc_struct_close(ddt);
158
159   ddt = xbt_datadesc_ref("xbt_peer_t", ddt);
160
161   /* Dict containing the constant value (for the parsing macro) */
162   xbt_dd_constants = xbt_dict_new_homogeneous(xbt_free_f);
163
164 }
165
166 /**
167  * xbt_datadesc_exit:
168  *
169  * Finalize the datadesc module
170  **/
171 void xbt_datadesc_postexit(void)
172 {
173   XBT_VERB("Exiting DataDesc");
174   xbt_set_free(&xbt_datadesc_set_local);
175   xbt_dict_free(&xbt_dd_constants);
176   XBT_DEBUG("Exited DataDesc");
177 }
178
179 /** This is mainly to debug */
180 const char *xbt_datadesc_get_name(xbt_datadesc_type_t ddt)
181 {
182   return ddt ? (const char *) ddt->name : "(null)";
183 }
184
185 /** This is mainly to debug */
186 int xbt_datadesc_get_id(xbt_datadesc_type_t ddt)
187 {
188   return ddt->code;
189 }
190
191 /**
192  * xbt_datadesc_size:
193  *
194  * Returns the size occuped by data of this type (on the current arch).
195  *
196  */
197 int xbt_datadesc_size(xbt_datadesc_type_t type)
198 {
199   return type ? type->size[GRAS_THISARCH] : 0;
200 }
201
202 /**
203  * xbt_datadesc_type_dump:
204  *
205  * For debugging purpose
206  */
207 void xbt_datadesc_type_dump(const xbt_datadesc_type_t ddt)
208 {
209   unsigned int cpt;
210
211   printf("DataDesc dump:");
212   if (!ddt) {
213     printf("(null)\n");
214     return;
215   }
216   printf("%s (ID:%d)\n", ddt->name, ddt->code);
217   printf("  category: %s\n", xbt_datadesc_cat_names[ddt->category_code]);
218
219   printf("  size[");
220   for (cpt = 0; cpt < xbt_arch_count; cpt++) {
221     printf("%s%s%ld%s",
222            cpt > 0 ? ", " : "",
223            cpt == GRAS_THISARCH ? ">" : "",
224            ddt->size[cpt], cpt == GRAS_THISARCH ? "<" : "");
225   }
226   printf("]\n");
227
228   printf("  alignment[");
229   for (cpt = 0; cpt < xbt_arch_count; cpt++) {
230     printf("%s%s%lu%s",
231            cpt > 0 ? ", " : "",
232            cpt == GRAS_THISARCH ? ">" : "",
233            ddt->alignment[cpt], cpt == GRAS_THISARCH ? "<" : "");
234   }
235   printf("]\n");
236
237   printf("  aligned_size[");
238   for (cpt = 0; cpt < xbt_arch_count; cpt++) {
239     printf("%s%s%lu%s",
240            cpt > 0 ? ", " : "",
241            cpt == GRAS_THISARCH ? ">" : "",
242            ddt->aligned_size[cpt], cpt == GRAS_THISARCH ? "<" : "");
243   }
244   printf("]\n");
245   if (ddt->category_code == e_xbt_datadesc_type_cat_struct) {
246     xbt_dd_cat_struct_t struct_data;
247     xbt_dd_cat_field_t field;
248
249     struct_data = ddt->category.struct_data;
250     xbt_dynar_foreach(struct_data.fields, cpt, field) {
251       printf(">>> Dump field #%u (%s) (offset=%ld)\n",
252              cpt, field->name, field->offset[GRAS_THISARCH]);
253       xbt_datadesc_type_dump(field->type);
254       printf("<<< end dump field #%u (%s)\n", cpt, field->name);
255     }
256   }
257   fflush(stdout);
258 }