Changeset 4151 for zzuf/trunk


Ignore:
Timestamp:
Dec 20, 2009, 1:24:50 PM (11 years ago)
Author:
Sam Hocevar
Message:

Buffer debug output to reduce the number of write() calls and allow to
output information that was logged before the library was initialised.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/src/libzzuf/debug.c

    r4112 r4151  
    2525#endif
    2626#include <stdio.h>
     27#include <string.h>
    2728#if defined HAVE_UNISTD_H
    2829#   include <unistd.h>
     
    4344 * either in base 10 or in hexadecimal.
    4445 */
    45 #define WRITE_INT(fd, i, base) \
     46#define WRITE_INT(i, base) \
    4647    do \
    4748    { \
    4849        char buf[128], *b = buf + 127; \
    4950        if(i <= 0) \
    50             write(fd, (i = -i) ? "-" : "0", 1); /* XXX: hack here */ \
     51            append((i = -i) ? "-" : "0", 1); /* XXX: hack here */ \
    5152        while(i) \
    5253        { \
     
    5455            i /= base; \
    5556        } \
    56         write(fd, b + 1, (int)(buf + 127 - b)); \
     57        append(b + 1, (int)(buf + 127 - b)); \
    5758    } while(0)
     59
     60/* Temporary buffer for deferred output */
     61char debugbuffer[BUFSIZ];
     62size_t debugcount = 1;
    5863
    5964void _zz_debug(char const *format, ...)
     
    8691 *  - fprintf(stderr, "\n");
    8792 */
     93static inline void append(void const *data, size_t count)
     94{
     95    if (debugcount + count <= sizeof(debugbuffer))
     96    {
     97        memcpy(debugbuffer + debugcount, data, count);
     98        debugcount += count;
     99    }
     100}
     101
    88102static void mydebug(char const *format, va_list args)
    89103{
     
    92106    int saved_errno;
    93107
    94     if(_zz_debugfd < 0)
    95         return;
    96 
    97108    saved_errno = errno;
    98109
    99     write(_zz_debugfd, "** zzuf debug ** ", 17);
     110    /* If there is spare data and the debug fd is open, we send the data */
     111    if (debugcount && _zz_debugfd >= 0)
     112    {
     113        write(_zz_debugfd, debugbuffer, debugcount);
     114        debugcount = 0;
     115    }
     116
     117    append("** zzuf debug ** ", 17);
    100118    for(f = format; *f; f++)
    101119    {
    102120        if(*f != '%')
    103121        {
    104             write(_zz_debugfd, f, 1);
     122            append(f, 1);
    105123            continue;
    106124        }
     
    114132            char i = (char)(unsigned char)va_arg(args, int);
    115133            if(i >= 0x20 && i < 0x7f)
    116                 write(_zz_debugfd, &i, 1);
     134                append(&i, 1);
    117135            else if(i == '\n')
    118                 write(_zz_debugfd, "\\n", 2);
     136                append("\\n", 2);
    119137            else if(i == '\t')
    120                 write(_zz_debugfd, "\\t", 2);
     138                append("\\t", 2);
    121139            else if(i == '\r')
    122                 write(_zz_debugfd, "\\r", 2);
     140                append("\\r", 2);
    123141            else
    124142            {
    125                 write(_zz_debugfd, "\\x", 2);
    126                 write(_zz_debugfd, hex2char + ((i & 0xf0) >> 4), 1);
    127                 write(_zz_debugfd, hex2char + (i & 0x0f), 1);
     143                append("\\x", 2);
     144                append(hex2char + ((i & 0xf0) >> 4), 1);
     145                append(hex2char + (i & 0x0f), 1);
    128146            }
    129147        }
     
    131149        {
    132150            int i = va_arg(args, int);
    133             WRITE_INT(_zz_debugfd, i, 10);
     151            WRITE_INT(i, 10);
    134152        }
    135153        else if(*f == 'x')
    136154        {
    137155            int i = va_arg(args, int);
    138             WRITE_INT(_zz_debugfd, i, 16);
     156            WRITE_INT(i, 16);
    139157        }
    140158        else if(f[0] == 'l' && (f[1] == 'i' || f[1] == 'd'))
    141159        {
    142160            long int i = va_arg(args, long int);
    143             WRITE_INT(_zz_debugfd, i, 10);
     161            WRITE_INT(i, 10);
    144162            f++;
    145163        }
     
    147165        {
    148166            long long int i = va_arg(args, long long int);
    149             WRITE_INT(_zz_debugfd, i, 10);
     167            WRITE_INT(i, 10);
    150168            f += 2;
    151169        }
     
    154172            double g = va_arg(args, double), h = 0.0000001;
    155173            int i = (int)g;
    156             WRITE_INT(_zz_debugfd, i, 10);
     174            WRITE_INT(i, 10);
    157175            for(i = 0; i < 7; i++)
    158176            {
     
    162180                    break;
    163181                if(i == 0)
    164                     write(_zz_debugfd, ".", 1);
    165                 write(_zz_debugfd, hex2char + (int)g, 1);
     182                    append(".", 1);
     183                append(hex2char + (int)g, 1);
    166184            }
    167185        }
     
    170188            uintptr_t i = va_arg(args, uintptr_t);
    171189            if(!i)
    172                 write(_zz_debugfd, "NULL", 5);
     190                append("NULL", 5);
    173191            else
    174192            {
    175                 write(_zz_debugfd, "0x", 2);
    176                 WRITE_INT(_zz_debugfd, i, 16);
     193                append("0x", 2);
     194                WRITE_INT(i, 16);
    177195            }
    178196        }
     
    181199            char *s = va_arg(args, char *);
    182200            if(!s)
    183                 write(_zz_debugfd, "(nil)", 5);
     201                append("(nil)", 5);
    184202            else
    185203            {
     
    187205                while(s[l])
    188206                    l++;
    189                 write(_zz_debugfd, s, l);
     207                append(s, l);
    190208            }
    191209        }
     
    193211        {
    194212            int i = va_arg(args, int);
    195             write(_zz_debugfd, hex2char + ((i & 0xf0) >> 4), 1);
    196             write(_zz_debugfd, hex2char + (i & 0x0f), 1);
     213            append(hex2char + ((i & 0xf0) >> 4), 1);
     214            append(hex2char + (i & 0x0f), 1);
    197215            f += 2;
    198216        }
    199217        else
    200218        {
    201             write(_zz_debugfd, f - 1, 2);
    202         }
    203     }
    204     write(_zz_debugfd, "\n", 1);
     219            append(f - 1, 2);
     220        }
     221    }
     222    append("\n", 1);
     223
     224    /* If the debug fd is open, we send the data */
     225    if (_zz_debugfd >= 0)
     226    {
     227        write(_zz_debugfd, debugbuffer, debugcount);
     228        debugcount = 0;
     229    }
     230
    205231    errno = saved_errno;
    206232}
     233
Note: See TracChangeset for help on using the changeset viewer.