]> git.sur5r.net Git - openldap/blob - libraries/liblber/bprint.c
Rework ac/socket.h for HAVE_WINSOCK:
[openldap] / libraries / liblber / bprint.c
1 /*
2  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
4  */
5
6 #include "portable.h"
7
8 #include <stdio.h>
9
10 #include <ac/ctype.h>
11 #include <ac/stdarg.h>
12 #include <ac/string.h>
13
14 #include "lber-int.h"
15
16 /*
17  * Print stuff
18  */
19 static void
20 lber_error_print( char *data )
21 {
22         fputs( data, stderr );
23         fflush( stderr );
24 }
25
26 BER_LOG_PRINT_FN lber_pvt_log_print = lber_error_print;
27
28 /*
29  * lber log 
30  */
31
32 static int lber_log_check( int errlvl, int loglvl )
33 {
34         return errlvl & loglvl ? 1 : 0;
35 }
36
37 int lber_pvt_log_printf
38 #ifdef HAVE_STDARG
39         (int errlvl, int loglvl, char *fmt, ...)
40 #else
41         ( va_alist )
42 va_dcl
43 #endif
44 {
45         char buf[ 1024 ];
46         va_list ap;
47
48 #ifdef HAVE_STDARG
49         va_start( ap, fmt );
50 #else
51         int errlvl, loglvl;
52         char *fmt;
53
54         va_start( ap );
55
56         errlvl = va_arg( ap, int );
57         loglvl = va_arg( ap, int );
58         fmt = va_arg( ap, char * );
59 #endif
60
61         if ( !lber_log_check( errlvl, loglvl )) {
62                 return 0;
63         }
64
65 #ifdef HAVE_VSNPRINTF
66         buf[sizeof(buf) - 1] = '\0';
67         vsnprintf( buf, sizeof(buf)-1, fmt, ap );
68 #elif HAVE_VSPRINTF
69         vsprintf( buf, fmt, ap ); /* hope it's not too long */
70 #else
71         /* use doprnt() */
72         chokeme = "choke me! I don't have a doprnt manual handy!";
73 #endif
74
75         va_end(ap);
76
77         (*lber_pvt_log_print)( buf );
78         return 1;
79 }
80
81 static int lber_log_puts(int errlvl, int loglvl, char *buf)
82 {
83         if ( !lber_log_check( errlvl, loglvl )) {
84                 return 0;
85         }
86
87         (*lber_pvt_log_print)( buf );
88         return 1;
89 }
90
91 /*
92  * Print arbitrary stuff, for debugging.
93  */
94
95 int
96 lber_log_bprint(int errlvl, int loglvl, char *data, int len )
97 {
98         if ( !lber_log_check( errlvl, loglvl )) {
99                 return 0;
100         }
101
102         ber_bprint(data, len);
103         return 1;
104 }
105
106 void
107 ber_bprint(char *data, int len )
108 {
109     static const char   hexdig[] = "0123456789abcdef";
110 #define BPLEN   48
111     char        out[ BPLEN ];
112     char        buf[ BPLEN + sizeof("\t%s\n") ];
113     int         i = 0;
114
115     memset( out, 0, BPLEN );
116     for ( ;; ) {
117         if ( len < 1 ) {
118             sprintf( buf, "\t%s\n", ( i == 0 ) ? "(end)" : out );
119                 (*lber_pvt_log_print)( buf );
120             break;
121         }
122
123 #ifndef LDAP_HEX
124         if ( isgraph( (unsigned char)*data )) {
125             out[ i ] = ' ';
126             out[ i+1 ] = *data;
127         } else {
128 #endif
129             out[ i ] = hexdig[ ( *data & 0xf0 ) >> 4 ];
130             out[ i+1 ] = hexdig[ *data & 0x0f ];
131 #ifndef LDAP_HEX
132         }
133 #endif
134         i += 2;
135         len--;
136         data++;
137
138         if ( i > BPLEN - 2 ) {
139                 char data[128 + BPLEN];
140             sprintf( data, "\t%s\n", out );
141                 (*lber_pvt_log_print)(data);
142             memset( out, 0, BPLEN );
143             i = 0;
144             continue;
145         }
146         out[ i++ ] = ' ';
147     }
148 }
149
150 int
151 lber_log_dump( int errlvl, int loglvl, BerElement *ber, int inout )
152 {
153         if ( !lber_log_check( errlvl, loglvl )) {
154                 return 0;
155         }
156
157         ber_dump(ber, inout);
158         return 1;
159 }
160
161 void
162 ber_dump( BerElement *ber, int inout )
163 {
164         char buf[132];
165
166         sprintf( buf, "ber_dump: buf 0x%lx, ptr 0x%lx, end 0x%lx\n",
167             (long) ber->ber_buf,
168                 (long) ber->ber_ptr,
169                 (long) ber->ber_end );
170
171         (*lber_pvt_log_print)( buf );
172
173         if ( inout == 1 ) {
174                 sprintf( buf, "          current len %ld, contents:\n",
175                     (long) (ber->ber_end - ber->ber_ptr) );
176                 ber_bprint( ber->ber_ptr, ber->ber_end - ber->ber_ptr );
177
178         } else {
179                 sprintf( buf, "          current len %ld, contents:\n",
180                     (long) (ber->ber_ptr - ber->ber_buf) );
181
182                 ber_bprint( ber->ber_buf, ber->ber_ptr - ber->ber_buf );
183         }
184 }
185
186 int
187 lber_log_sos_dump( int errlvl, int loglvl, Seqorset *sos )
188 {
189         if ( !lber_log_check( errlvl, loglvl )) {
190                 return 0;
191         }
192
193         ber_sos_dump( sos );
194         return 1;
195 }
196
197 void
198 ber_sos_dump( Seqorset *sos )
199 {
200         char buf[132];
201
202         (*lber_pvt_log_print)( "*** sos dump ***\n" );
203
204         while ( sos != NULLSEQORSET ) {
205                 sprintf( buf, "ber_sos_dump: clen %ld first 0x%lx ptr 0x%lx\n",
206                     (long) sos->sos_clen, (long) sos->sos_first, (long) sos->sos_ptr );
207                 (*lber_pvt_log_print)( buf );
208
209                 sprintf( buf, "              current len %ld contents:\n",
210                     (long) (sos->sos_ptr - sos->sos_first) );
211                 (*lber_pvt_log_print)( buf );
212
213                 ber_bprint( sos->sos_first, sos->sos_ptr - sos->sos_first );
214
215                 sos = sos->sos_next;
216         }
217
218         (*lber_pvt_log_print)( "*** end dump ***\n" );
219 }
220