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