3 MPDM - Minimum Profit Data Manager
4 Copyright (C) 2003/2010 Angel Ortega <angel@triptico.com>
6 mpdm_d.c - Debugging utilities
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 as published by the Free Software Foundation; either version 2
11 of the License, or (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 http://www.triptico.com
37 static wchar_t *dump_1(const mpdm_t v
, int l
, wchar_t * ptr
, int *size
);
38 wchar_t * (*mpdm_dump_1
) (const mpdm_t v
, int l
, wchar_t *ptr
, int *size
) = NULL
;
42 static wchar_t *dump_1(const mpdm_t v
, int l
, wchar_t *ptr
, int *size
)
43 /* dumps one value to the ptr dynamic string with 'l' indenting level */
51 for (n
= 0; n
< l
; n
++)
52 ptr
= mpdm_pokews(ptr
, size
, L
" ");
58 if (v
->flags
& MPDM_DELETED
)
59 strcpy(tmp
, "**DELETED**");
61 sprintf(tmp
, "%d,%c%c%c%c:", v
->ref
,
62 v
->flags
& MPDM_FILE
? 'F' :
63 (v
->flags
& MPDM_STRING
? 'S' :
64 (v
->flags
& MPDM_EXEC
? 'X' : '-')),
65 v
->flags
& MPDM_HASH
? 'H' :
66 (v
->flags
& MPDM_MULTIPLE
? 'M' : '-'),
67 v
->flags
& MPDM_REGEX
? 'r' :
68 (v
->flags
& MPDM_FREE
? 'A' : '-'),
69 v
->flags
& MPDM_IVAL
? 'I' :
70 (v
->flags
& MPDM_RVAL
? 'R' : '-')
73 wptr
= mpdm_mbstowcs(tmp
, &s
, -1);
74 ptr
= mpdm_poke(ptr
, size
, wptr
, s
, sizeof(wchar_t));
77 /* if it's a multiple value, add also the number
79 if (v
->flags
& MPDM_MULTIPLE
) {
80 sprintf(tmp
, "[%d] ", mpdm_size(v
));
81 wptr
= mpdm_mbstowcs(tmp
, &s
, -1);
82 ptr
= mpdm_poke(ptr
, size
, wptr
, s
, sizeof(wchar_t));
87 /* add the visual representation of the value */
88 ptr
= mpdm_pokev(ptr
, size
, v
);
89 ptr
= mpdm_pokewsn(ptr
, size
, L
"\n", 1);
92 /* if it's a hash, iterate it */
93 if (v
->flags
& MPDM_HASH
) {
97 while (mpdm_iterator(v
, &c
, &k
, &w
)) {
98 ptr
= dump_1(k
, l
+ 1, ptr
, size
);
99 ptr
= dump_1(w
, l
+ 2, ptr
, size
);
103 if (v
->flags
& MPDM_MULTIPLE
) {
104 for (n
= 0; n
< mpdm_size(v
); n
++)
105 ptr
= dump_1(mpdm_aget(v
, n
), l
+ 1, ptr
, size
);
115 static wchar_t *do_dump(mpdm_t v
, int *size
)
119 /* if no dumper plugin is defined, fall back to default */
120 if (mpdm_dump_1
== NULL
)
121 mpdm_dump_1
= dump_1
;
124 ptr
= mpdm_dump_1(v
, 0, NULL
, size
);
125 ptr
= mpdm_pokewsn(ptr
, size
, L
"", 1);
132 * mpdm_dumper - Returns a visual representation of a complex value.
135 * Returns a visual representation of a complex value.
137 mpdm_t
mpdm_dumper(const mpdm_t v
)
142 ptr
= do_dump(v
, &size
);
144 return MPDM_ENS(ptr
, size
- 1);
149 * mpdm_dump - Dumps a value to stdin.
152 * Dumps a value to stdin. The value can be complex. This function
153 * is for debugging purposes only.
155 void mpdm_dump(const mpdm_t v
)
162 ptr
= do_dump(v
, &size
);
163 mpdm_write_wcs(stdout
, ptr
);
171 * mpdm_dump_unref - Dumps all unreferenced values.
173 * Dumps all unreferenced values.
175 void mpdm_dump_unref(void)
178 int count
, unref
, del
;
180 /* loop all values */
185 printf("** Unreferenced values:\n");
189 if (v
->flags
& MPDM_DELETED
)
200 printf("** Total unreferenced/deleted: %d/%d\n", unref
, del
);