
                              Wine Documentation                               
Prev                       Chapter 8. Debug Logging                        Next
-------------------------------------------------------------------------------

In-memory messages

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:

 1. declare a string (where you are allowed to declare C variables) as follows:
    dbg_decl_str(name, len);                                           
                                                                       
    where name is the name of the string (you should use the channel name on
    which you are going to output it)
   
 2. print in it with:
    dsprintf(name, "<message>", ...);                                  
                                                                       
    which is just like a sprintf function but instead of a C string as first
    parameter it takes the name you used to declare it.
   
 3. obtain a pointer to the string with: dbg_str(name)
   
 4. 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.
       

-------------------------------------------------------------------------------
Prev                                 Home                                  Next
Are we debugging?                     Up                   Resource identifiers
