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

Last change on this file since 1728 was 1728, checked in by Sam Hocevar, 16 years ago
  • Check for <unistd.h>, too. MSVC doesn't have it.
  • 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 1728 2007-02-01 16:08:33Z 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#if defined HAVE_UNISTD_H
31#   include <unistd.h>
32#endif
33#include <errno.h>
34#include <stdarg.h>
35
36#include "debug.h"
37#include "libzzuf.h"
38
39extern int _zz_debugfd;
40
41#define WRITE_INT(fd, i, base) \
42    do \
43    { \
44        char buf[128], *b = buf + 127; \
45        if(i <= 0) \
46            write(fd, (i = -i) ? "-" : "0", 1); /* XXX: hack here */ \
47        while(i) \
48        { \
49            *b-- = hex2char[i % base]; \
50            i /= base; \
51        } \
52        write(fd, b + 1, buf + 127 - b); \
53    } while(0)
54
55void _zz_debug(char const *format, ...)
56{
57#ifdef SAFE_FUNCTION
58    static char const *hex2char = "0123456789abcdef";
59    char const *f;
60#endif
61    va_list args;
62    int saved_errno;
63
64    if(_zz_debugfd < 0)
65        return;
66
67    saved_errno = errno;
68    va_start(args, format);
69#ifdef SAFE_FUNCTION
70    write(_zz_debugfd, "** zzuf debug ** ", 17);
71    for(f = format; *f; f++)
72    {
73        if(*f != '%')
74        {
75            write(_zz_debugfd, f, 1);
76            continue;
77        }
78
79        f++;
80        if(!*f)
81            break;
82
83        if(*f == 'c')
84        {
85            char i = (char)(unsigned char)va_arg(args, int);
86            if(i >= 0x20 && i < 0x7f)
87                write(_zz_debugfd, &i, 1);
88            else if(i == '\n')
89                write(_zz_debugfd, "\\n", 2);
90            else if(i == '\t')
91                write(_zz_debugfd, "\\t", 2);
92            else if(i == '\r')
93                write(_zz_debugfd, "\\r", 2);
94            else
95            {
96                write(_zz_debugfd, "\\x", 2);
97                write(_zz_debugfd, hex2char + ((i & 0xf0) >> 4), 1);
98                write(_zz_debugfd, hex2char + (i & 0x0f), 1);
99            }
100        }
101        else if(*f == 'i')
102        {
103            int i = va_arg(args, int);
104            WRITE_INT(_zz_debugfd, i, 10);
105        }
106        else if(*f == 'x')
107        {
108            int i = va_arg(args, int);
109            WRITE_INT(_zz_debugfd, i, 16);
110        }
111        else if(f[0] == 'l' && f[1] == 'i')
112        {
113            long int i = va_arg(args, long int);
114            WRITE_INT(_zz_debugfd, i, 10);
115            f++;
116        }
117        else if(f[0] == 'l' && f[1] == 'l' && f[2] == 'i')
118        {
119            long long int i = va_arg(args, long long int);
120            WRITE_INT(_zz_debugfd, i, 10);
121            f += 2;
122        }
123        else if(f[0] == 'p')
124        {
125            uintptr_t i = va_arg(args, uintptr_t);
126            if(!i)
127                write(_zz_debugfd, "NULL", 5);
128            else
129            {
130                write(_zz_debugfd, "0x", 2);
131                WRITE_INT(_zz_debugfd, i, 16);
132            }
133        }
134        else if(f[0] == 's')
135        {
136            char *s = va_arg(args, char *);
137            if(!s)
138                write(_zz_debugfd, "(nil)", 5);
139            else
140            {
141                int l = 0;
142                while(s[l])
143                    l++;
144                write(_zz_debugfd, s, l);
145            }
146        }
147        else if(f[0] == '0' && f[1] == '2' && f[2] == 'x')
148        {
149            int i = va_arg(args, int);
150            write(_zz_debugfd, hex2char + ((i & 0xf0) >> 4), 1);
151            write(_zz_debugfd, hex2char + (i & 0x0f), 1);
152            f += 2;
153        }
154        else
155        {
156            write(_zz_debugfd, f - 1, 2);
157        }
158    }
159    write(_zz_debugfd, "\n", 1);
160#else
161    fprintf(stderr, "** zzuf debug ** ");
162    vfprintf(stderr, format, args);
163    fprintf(stderr, "\n");
164#endif
165    va_end(args);
166    errno = saved_errno;
167}
168
Note: See TracBrowser for help on using the repository browser.