1 /*
2
3 MPDM - Minimum Profit Data Manager
4 mpdm_d.c - Debugging utilities
5
6 ttcdt <dev@triptico.com> et al.
7
8 This software is released into the public domain.
9 NO WARRANTY. See file LICENSE for details.
10
11 */
12
13 #include "config.h"
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <wchar.h>
19
20 #include "mpdm.h"
21
22 /** data **/
23
24 static wchar_t *dump_1(const mpdm_t v, int l, wchar_t *ptr, int *size);
25 wchar_t *(*mpdm_dump_1) (const mpdm_t v, int l, wchar_t *ptr, int *size) = NULL;
26
27 /** code **/
28
dump_1(const mpdm_t v,int l,wchar_t * ptr,int * size)29 static wchar_t *dump_1(const mpdm_t v, int l, wchar_t *ptr, int *size)
30 /* dumps one value to the ptr dynamic string with 'l' indenting level */
31 {
32 int n;
33 wchar_t *wptr;
34
35 mpdm_ref(v);
36
37 /* indent */
38 for (n = 0; n < l; n++)
39 ptr = mpdm_pokews(ptr, size, L" ");
40
41 if (v != NULL) {
42 char tmp[256];
43 int s;
44 int c = 0;
45 mpdm_t w, i;
46
47 /* add data type */
48 ptr = mpdm_pokews(ptr, size, mpdm_type_wcs(v));
49
50 sprintf(tmp, "(%d,%d):", v->ref - 1, (int) v->size);
51
52 /* add refcount, size and flags */
53 wptr = mpdm_mbstowcs(tmp, &s, -1);
54 ptr = mpdm_pokews(ptr, size, wptr);
55 free(wptr);
56
57 /* add the visual representation of the value */
58 mpdm_type_t t = mpdm_type(v);
59
60 if (t == MPDM_TYPE_ARRAY) {
61 ptr = mpdm_pokews(ptr, size, L"\n");
62 while (mpdm_iterator(v, &c, &w, NULL)) {
63 ptr = dump_1(w, l + 1, ptr, size);
64 }
65 }
66 else
67 if (t == MPDM_TYPE_OBJECT) {
68 ptr = mpdm_pokews(ptr, size, L"\n");
69 while (mpdm_iterator(v, &c, &w, &i)) {
70 ptr = dump_1(i, l + 1, ptr, size);
71 ptr = dump_1(w, l + 2, ptr, size);
72 }
73 }
74 else
75 if (t == MPDM_TYPE_STRING || t == MPDM_TYPE_INTEGER ||
76 t == MPDM_TYPE_REAL) {
77 ptr = mpdm_pokews(ptr, size, mpdm_string(v));
78 ptr = mpdm_pokews(ptr, size, L"\n");
79 }
80 }
81 else
82 ptr = mpdm_pokews(ptr, size, L"[NULL]\n");
83
84 mpdm_unrefnd(v);
85
86 return ptr;
87 }
88
89
mpdm_dumper_wcs(mpdm_t v,int * size)90 wchar_t *mpdm_dumper_wcs(mpdm_t v, int *size)
91 {
92 wchar_t *ptr;
93
94 /* if no dumper plugin is defined, fall back to default */
95 if (mpdm_dump_1 == NULL)
96 mpdm_dump_1 = dump_1;
97
98 *size = 0;
99 ptr = mpdm_dump_1(v, 0, NULL, size);
100
101 return ptr;
102 }
103
104
105 /**
106 * mpdm_dumper - Returns a visual representation of a complex value.
107 * @v: The value
108 *
109 * Returns a visual representation of a complex value.
110 */
mpdm_dumper(const mpdm_t v)111 mpdm_t mpdm_dumper(const mpdm_t v)
112 {
113 int size = 0;
114 wchar_t *ptr;
115
116 ptr = mpdm_dumper_wcs(v, &size);
117
118 return MPDM_ENS(ptr, size);
119 }
120
121
122 /**
123 * mpdm_dump - Dumps a value to stdin.
124 * @v: The value
125 *
126 * Dumps a value to stdin. The value can be complex. This function
127 * is for debugging purposes only.
128 */
mpdm_dump(const mpdm_t v)129 void mpdm_dump(const mpdm_t v)
130 {
131 int size = 0;
132 wchar_t *ptr;
133
134 ptr = mpdm_dumper_wcs(v, &size);
135 mpdm_write_wcs(stdout, ptr);
136 free(ptr);
137 }
138