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

Last change on this file since 2326 was 2326, checked in by Sam Hocevar, 12 years ago
  • Cosmetic: remove trailing spaces from the source code.
  • Property svn:keywords set to Id
File size: 4.7 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 2326 2008-05-16 22:01:18Z 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#if defined HAVE_STDINT_H
22#   include <stdint.h>
23#elif defined HAVE_INTTYPES_H
24#   include <inttypes.h>
25#endif
26#include <stdio.h>
27#if defined HAVE_UNISTD_H
28#   include <unistd.h>
29#endif
30#if defined HAVE_IO_H
31#   include <io.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, (int)(buf + 127 - b)); \
53    } while(0)
54
55void _zz_debug(char const *format, ...)
56{
57    static char const *hex2char = "0123456789abcdef";
58    char const *f;
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
68#if 0
69    /* This function's code is equivalent to the following *printf calls,
70     * except it only uses signal-safe functions */
71    fprintf(stderr, "** zzuf debug ** ");
72    vfprintf(stderr, format, args);
73    fprintf(stderr, "\n");
74#endif
75
76    write(_zz_debugfd, "** zzuf debug ** ", 17);
77    for(f = format; *f; f++)
78    {
79        if(*f != '%')
80        {
81            write(_zz_debugfd, f, 1);
82            continue;
83        }
84
85        f++;
86        if(!*f)
87            break;
88
89        if(*f == 'c')
90        {
91            char i = (char)(unsigned char)va_arg(args, int);
92            if(i >= 0x20 && i < 0x7f)
93                write(_zz_debugfd, &i, 1);
94            else if(i == '\n')
95                write(_zz_debugfd, "\\n", 2);
96            else if(i == '\t')
97                write(_zz_debugfd, "\\t", 2);
98            else if(i == '\r')
99                write(_zz_debugfd, "\\r", 2);
100            else
101            {
102                write(_zz_debugfd, "\\x", 2);
103                write(_zz_debugfd, hex2char + ((i & 0xf0) >> 4), 1);
104                write(_zz_debugfd, hex2char + (i & 0x0f), 1);
105            }
106        }
107        else if(*f == 'i' || *f == 'd')
108        {
109            int i = va_arg(args, int);
110            WRITE_INT(_zz_debugfd, i, 10);
111        }
112        else if(*f == 'x')
113        {
114            int i = va_arg(args, int);
115            WRITE_INT(_zz_debugfd, i, 16);
116        }
117        else if(f[0] == 'l' && (f[1] == 'i' || f[1] == 'd'))
118        {
119            long int i = va_arg(args, long int);
120            WRITE_INT(_zz_debugfd, i, 10);
121            f++;
122        }
123        else if(f[0] == 'l' && f[1] == 'l' && (f[2] == 'i' || f[1] == 'd'))
124        {
125            long long int i = va_arg(args, long long int);
126            WRITE_INT(_zz_debugfd, i, 10);
127            f += 2;
128        }
129        else if(f[0] == 'g')
130        {
131            double g = va_arg(args, double), h = 0.0000001;
132            int i = g;
133            WRITE_INT(_zz_debugfd, i, 10);
134            for(i = 0; i < 7; i++)
135            {
136                g = (g - (int)g) * 10;
137                h *= 10;
138                if(g < h)
139                    break;
140                if(i == 0)
141                    write(_zz_debugfd, ".", 1);
142                write(_zz_debugfd, hex2char + (int)g, 1);
143            }
144        }
145        else if(f[0] == 'p')
146        {
147            uintptr_t i = va_arg(args, uintptr_t);
148            if(!i)
149                write(_zz_debugfd, "NULL", 5);
150            else
151            {
152                write(_zz_debugfd, "0x", 2);
153                WRITE_INT(_zz_debugfd, i, 16);
154            }
155        }
156        else if(f[0] == 's')
157        {
158            char *s = va_arg(args, char *);
159            if(!s)
160                write(_zz_debugfd, "(nil)", 5);
161            else
162            {
163                int l = 0;
164                while(s[l])
165                    l++;
166                write(_zz_debugfd, s, l);
167            }
168        }
169        else if(f[0] == '0' && f[1] == '2' && f[2] == 'x')
170        {
171            int i = va_arg(args, int);
172            write(_zz_debugfd, hex2char + ((i & 0xf0) >> 4), 1);
173            write(_zz_debugfd, hex2char + (i & 0x0f), 1);
174            f += 2;
175        }
176        else
177        {
178            write(_zz_debugfd, f - 1, 2);
179        }
180    }
181    write(_zz_debugfd, "\n", 1);
182    va_end(args);
183    errno = saved_errno;
184}
Note: See TracBrowser for help on using the repository browser.