source: zzuf/trunk/src/debug.c @ 1718

Last change on this file since 1718 was 1718, checked in by Sam Hocevar, 14 years ago
  • Carry DEBUG_FILENO in the ZZUF_DEBUG environment variable.
  • Property svn:keywords set to Id
File size: 4.1 KB
Line 
1/*
2 *  zzuf - general purpose fuzzer
3 *  Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
4 *                All Rights Reserved
5 *
6 *  $Id: debug.c 1718 2007-01-25 22:34:28Z sam $
7 *
8 *  This program is free software. It comes without any warranty, to
9 *  the extent permitted by applicable law. You can redistribute it
10 *  and/or modify it under the terms of the Do What The Fuck You Want
11 *  To Public License, Version 2, as published by Sam Hocevar. See
12 *  http://sam.zoy.org/wtfpl/COPYING for more details.
13 */
14
15/*
16 *  debug.c: debugging support
17 */
18
19#include "config.h"
20
21/* Do we want our debug() call to be safe wrt. signals? */
22#define SAFE_FUNCTION
23
24#if defined HAVE_STDINT_H
25#   include <stdint.h>
26#elif defined HAVE_INTTYPES_H
27#   include <inttypes.h>
28#endif
29#include <stdio.h>
30#include <unistd.h>
31#include <errno.h>
32#include <stdarg.h>
33
34#include "debug.h"
35#include "libzzuf.h"
36
37extern int _zz_debugfd;
38
39#define WRITE_INT(fd, i, base) \
40    do \
41    { \
42        char buf[128], *b = buf + 127; \
43        if(i <= 0) \
44            write(fd, (i = -i) ? "-" : "0", 1); /* XXX: hack here */ \
45        while(i) \
46        { \
47            *b-- = hex2char[i % base]; \
48            i /= base; \
49        } \
50        write(fd, b + 1, buf + 127 - b); \
51    } while(0)
52
53void _zz_debug(char const *format, ...)
54{
55#ifdef SAFE_FUNCTION
56    static char const *hex2char = "0123456789abcdef";
57    char const *f;
58#endif
59    va_list args;
60    int saved_errno;
61
62    if(_zz_debugfd < 0)
63        return;
64
65    saved_errno = errno;
66    va_start(args, format);
67#ifdef SAFE_FUNCTION
68    write(_zz_debugfd, "** zzuf debug ** ", 17);
69    for(f = format; *f; f++)
70    {
71        if(*f != '%')
72        {
73            write(_zz_debugfd, f, 1);
74            continue;
75        }
76
77        f++;
78        if(!*f)
79            break;
80
81        if(*f == 'c')
82        {
83            char i = (char)(unsigned char)va_arg(args, int);
84            if(i >= 0x20 && i < 0x7f)
85                write(_zz_debugfd, &i, 1);
86            else if(i == '\n')
87                write(_zz_debugfd, "\\n", 2);
88            else if(i == '\t')
89                write(_zz_debugfd, "\\t", 2);
90            else if(i == '\r')
91                write(_zz_debugfd, "\\r", 2);
92            else
93            {
94                write(_zz_debugfd, "\\x", 2);
95                write(_zz_debugfd, hex2char + ((i & 0xf0) >> 4), 1);
96                write(_zz_debugfd, hex2char + (i & 0x0f), 1);
97            }
98        }
99        else if(*f == 'i')
100        {
101            int i = va_arg(args, int);
102            WRITE_INT(_zz_debugfd, i, 10);
103        }
104        else if(*f == 'x')
105        {
106            int i = va_arg(args, int);
107            WRITE_INT(_zz_debugfd, i, 16);
108        }
109        else if(f[0] == 'l' && f[1] == 'i')
110        {
111            long int i = va_arg(args, long int);
112            WRITE_INT(_zz_debugfd, i, 10);
113            f++;
114        }
115        else if(f[0] == 'l' && f[1] == 'l' && f[2] == 'i')
116        {
117            long long int i = va_arg(args, long long int);
118            WRITE_INT(_zz_debugfd, i, 10);
119            f += 2;
120        }
121        else if(f[0] == 'p')
122        {
123            uintptr_t i = va_arg(args, uintptr_t);
124            if(!i)
125                write(_zz_debugfd, "NULL", 5);
126            else
127            {
128                write(_zz_debugfd, "0x", 2);
129                WRITE_INT(_zz_debugfd, i, 16);
130            }
131        }
132        else if(f[0] == 's')
133        {
134            char *s = va_arg(args, char *);
135            if(!s)
136                write(_zz_debugfd, "(nil)", 5);
137            else
138            {
139                int l = 0;
140                while(s[l])
141                    l++;
142                write(_zz_debugfd, s, l);
143            }
144        }
145        else if(f[0] == '0' && f[1] == '2' && f[2] == 'x')
146        {
147            int i = va_arg(args, int);
148            write(_zz_debugfd, hex2char + ((i & 0xf0) >> 4), 1);
149            write(_zz_debugfd, hex2char + (i & 0x0f), 1);
150            f += 2;
151        }
152        else
153        {
154            write(_zz_debugfd, f - 1, 2);
155        }
156    }
157    write(_zz_debugfd, "\n", 1);
158#else
159    fprintf(stderr, "** zzuf debug ** ");
160    vfprintf(stderr, format, args);
161    fprintf(stderr, "\n");
162#endif
163    va_end(args);
164    errno = saved_errno;
165}
166
Note: See TracBrowser for help on using the repository browser.