1 /* dumpvalue() service, which prints to Standard Output the value of
4 We've put this in a separate module in hopes that it eventually can be
5 used for debugging purposes in other places.
14 #include "config.h" /* information about this build environment */
15 #include "casprintf.h"
16 #include "mallocvar.h"
18 #include "xmlrpc-c/base.h"
20 #include "dumpvalue.h"
25 dumpInt(const char * const prefix,
26 xmlrpc_value * const valueP) {
31 xmlrpc_env_init(&env);
33 xmlrpc_parse_value(&env, valueP, "i", &value);
35 if (env.fault_occurred)
36 printf("Unable to parse integer xmlrpc_value %lx. %s\n",
37 (unsigned long)valueP, env.fault_string);
39 printf("%sInteger: %d\n", prefix, value);
41 xmlrpc_env_clean(&env);
47 dumpBool(const char * const prefix,
48 xmlrpc_value * const valueP) {
53 xmlrpc_env_init(&env);
55 xmlrpc_parse_value(&env, valueP, "b", &value);
57 if (env.fault_occurred)
58 printf("Unable to parse boolean xmlrpc_value %lx. %s\n",
59 (unsigned long)valueP, env.fault_string);
61 printf("%sBoolean: %s\n", prefix, value ? "TRUE" : "FALSE");
63 xmlrpc_env_clean(&env);
70 dumpDouble(const char * const prefix,
71 xmlrpc_value * const valueP) {
76 xmlrpc_env_init(&env);
78 xmlrpc_parse_value(&env, valueP, "d", &value);
80 if (env.fault_occurred)
81 printf("Unable to parse floating point number xmlrpc_value %lx. %s\n",
82 (unsigned long)valueP, env.fault_string);
84 printf("%sFloating Point: %f\n", prefix, value);
86 xmlrpc_env_clean(&env);
92 dumpDatetime(const char * const prefix,
93 xmlrpc_value * const valueP) {
95 printf("%sDon't know how to print datetime value %lx.\n",
96 prefix, (unsigned long) valueP);
102 dumpString(const char * const prefix,
103 xmlrpc_value * const valueP) {
108 xmlrpc_env_init(&env);
110 xmlrpc_parse_value(&env, valueP, "s", &value);
112 if (env.fault_occurred)
113 printf("Unable to parse string xmlrpc_value %lx. %s\n",
114 (unsigned long)valueP, env.fault_string);
116 printf("%sString: '%s'\n", prefix, value);
118 xmlrpc_env_clean(&env);
124 dumpBase64(const char * const prefix,
125 xmlrpc_value * const valueP) {
128 const unsigned char * value;
131 xmlrpc_env_init(&env);
133 xmlrpc_parse_value(&env, valueP, "6", &value, &length);
135 if (env.fault_occurred)
136 printf("Unable to parse base64 bit string xmlrpc_value %lx. %s\n",
137 (unsigned long)valueP, env.fault_string);
141 printf("%sBit string: ", prefix);
142 for (i = 0; i < length; ++i)
143 printf("%02x", value[i]);
145 xmlrpc_env_clean(&env);
151 dumpArray(const char * const prefix,
152 xmlrpc_value * const arrayP) {
155 unsigned int arraySize;
157 xmlrpc_env_init(&env);
159 XMLRPC_ASSERT_ARRAY_OK(arrayP);
161 arraySize = xmlrpc_array_size(&env, arrayP);
162 if (env.fault_occurred)
163 printf("Unable to get array size. %s\n", env.fault_string);
165 int const spaceCount = strlen(prefix);
168 const char * blankPrefix;
170 printf("%sArray of %u items:\n", prefix, arraySize);
172 casprintf(&blankPrefix, "%*s", spaceCount, "");
174 for (i = 0; i < arraySize; ++i) {
175 xmlrpc_value * valueP;
177 xmlrpc_array_read_item(&env, arrayP, i, &valueP);
179 if (env.fault_occurred)
180 printf("Unable to get array item %u\n", i);
182 const char * prefix2;
184 casprintf(&prefix2, "%s Index %2u ", blankPrefix, i);
185 dumpValue(prefix2, valueP);
188 xmlrpc_DECREF(valueP);
191 strfree(blankPrefix);
193 xmlrpc_env_clean(&env);
199 dumpStructMember(const char * const prefix,
200 xmlrpc_value * const structP,
201 unsigned int const index) {
206 xmlrpc_value * valueP;
208 xmlrpc_env_init(&env);
210 xmlrpc_struct_read_member(&env, structP, index, &keyP, &valueP);
212 if (env.fault_occurred)
213 printf("Unable to get struct member %u\n", index);
215 int const blankCount = strlen(prefix);
216 const char * prefix2;
217 const char * blankPrefix;
219 casprintf(&prefix2, "%s Key: ", prefix);
220 dumpValue(prefix2, keyP);
223 casprintf(&blankPrefix, "%*s", blankCount, "");
225 casprintf(&prefix2, "%s Value: ", blankPrefix);
226 dumpValue(prefix2, valueP);
229 strfree(blankPrefix);
232 xmlrpc_DECREF(valueP);
234 xmlrpc_env_clean(&env);
240 dumpStruct(const char * const prefix,
241 xmlrpc_value * const structP) {
244 unsigned int structSize;
246 xmlrpc_env_init(&env);
248 structSize = xmlrpc_struct_size(&env, structP);
249 if (env.fault_occurred)
250 printf("Unable to get struct size. %s\n", env.fault_string);
254 printf("%sStruct of %u members:\n", prefix, structSize);
256 for (i = 0; i < structSize; ++i) {
257 const char * prefix1;
260 prefix1 = strdup(prefix);
262 int const blankCount = strlen(prefix);
263 casprintf(&prefix1, "%*s", blankCount, "");
265 dumpStructMember(prefix1, structP, i);
270 xmlrpc_env_clean(&env);
276 dumpCPtr(const char * const prefix,
277 xmlrpc_value * const valueP) {
282 xmlrpc_env_init(&env);
284 xmlrpc_parse_value(&env, valueP, "p", &value);
286 if (env.fault_occurred)
287 printf("Unable to parse C pointer xmlrpc_value %lx. %s\n",
288 (unsigned long)valueP, env.fault_string);
290 printf("%sC pointer: '%p'\n", prefix, value);
292 xmlrpc_env_clean(&env);
298 dumpNil(const char * const prefix,
299 xmlrpc_value * const valueP) {
303 xmlrpc_env_init(&env);
305 xmlrpc_parse_value(&env, valueP, "n");
307 if (env.fault_occurred)
308 printf("Unable to parse nil value xmlrpc_value %lx. %s\n",
309 (unsigned long)valueP, env.fault_string);
311 printf("%sNil\n", prefix);
313 xmlrpc_env_clean(&env);
319 dumpUnknown(const char * const prefix,
320 xmlrpc_value * const valueP) {
322 printf("%sDon't recognize value type %u of xmlrpc_value %lx.\n",
323 prefix, xmlrpc_value_type(valueP), (unsigned long)valueP);
324 printf("%sCan't print it.\n", prefix);
330 dumpValue(const char * const prefix,
331 xmlrpc_value * const valueP) {
333 switch (xmlrpc_value_type(valueP)) {
334 case XMLRPC_TYPE_INT:
335 dumpInt(prefix, valueP);
337 case XMLRPC_TYPE_BOOL:
338 dumpBool(prefix, valueP);
340 case XMLRPC_TYPE_DOUBLE:
341 dumpDouble(prefix, valueP);
343 case XMLRPC_TYPE_DATETIME:
344 dumpDatetime(prefix, valueP);
346 case XMLRPC_TYPE_STRING:
347 dumpString(prefix, valueP);
349 case XMLRPC_TYPE_BASE64:
350 dumpBase64(prefix, valueP);
352 case XMLRPC_TYPE_ARRAY:
353 dumpArray(prefix, valueP);
355 case XMLRPC_TYPE_STRUCT:
356 dumpStruct(prefix, valueP);
358 case XMLRPC_TYPE_C_PTR:
359 dumpCPtr(prefix, valueP);
361 case XMLRPC_TYPE_NIL:
362 dumpNil(prefix, valueP);
365 dumpUnknown(prefix, valueP);