If you NEED to build the message from multiple calls, you need to build it in memory. To do that, you should use the following interface:
declare a string (where you are allowed to declare C variables) as follows:
dbg_decl_str(name, len); |
print in it with:
dsprintf(name, "<message>", ...); |
obtain a pointer to the string with: dbg_str(name)
reset the string (if you want to reuse it with):
dbg_reset_str(name); |
Example (modified from the code):
void some_func(tabs) { INT32 i; LPINT16 p = (LPINT16)tabs; dbg_decl_str(listbox, 256); /* declare the string */ for (i = 0; i < descr->nb_tabs; i++) { descr->tabs[i] = *p++<<1; if(TRACING(listbox)) /* write in it only if dsprintf(listbox, "%hd ", descr->tabs[i]); /* we are gonna output it */ } TRACE(listbox, "Listbox %04x: settabstops %s", wnd->hwndSelf, dbg_str(listbox)); /* output the whole thing */ } |
If you need to use it two times in the same scope do like this:
void some_func(tabs) { INT32 i; LPINT16 p = (LPINT16)tabs; dbg_decl_str(listbox, 256); /* declare the string */ for (i = 0; i < descr->nb_tabs; i++) { descr->tabs[i] = *p++<<1; if(TRACING(listbox)) /* write in it only if dsprintf(listbox, "%hd ", descr->tabs[i]); /* we are gonna output it */ } TRACE(listbox, "Listbox %04x: settabstops %s\n", wnd->hwndSelf, dbg_str(listbox)); /* output the whole thing */ dbg_reset_str(listbox); /* !!!reset the string!!! */ for (i = 0; i < descr->extrainfo_nr; i++) { descr->extrainfo = *p+1; if(TRACING(listbox)) /* write in it only if dsprintf(listbox,"%3d ",descr->extrainfo); /* we are gonna output it */ } TRACE(listbox, "Listbox %04x: extrainfo %s\n", wnd->hwndSelf, dbg_str(listbox)); /* output the whole thing */ } |
Important: As I already stated, I do not think this will be the ultimate interface for building in-memory debugging messages. In fact, I do have better ideas which I hope to have time to implement for the next release. For this reason, please try not to use it. However, if you need to output a line in more than one dprintf_xxx calls, then USE THIS INTERFACE. DO NOT use other methods. This way, I will easily translate everything to the new interface (when it will become available). So, if you need to use it, then follow the following guidelines:
wrap calls to dsprintf with a
if(YYY(xxx)) dsprintf(xxx,...);Of course, if the call to dsprintf is made from within a function which you know is called only if YYY(xxx) is true, for example if you call it only like this:
if(YYY(xxx)) print_some_debug_info();then you need not (and should not) wrap calls to dsprintf with the before mentioned if.
name the string EXACTLY like the debugging channel on which is going to be output. Please see the above example.