]> git.sur5r.net Git - openldap/blob - libraries/liblber/bprint.c
First cut at ber_set_option(NULL,LBER_OPT_MEMORY_FN, myrealloc) where
[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 ber_error_print( char *data )
21 {
22         assert( data != NULL );
23
24         fputs( data, stderr );
25         fflush( stderr );
26 }
27
28 BER_LOG_PRINT_FN ber_pvt_log_print = ber_error_print;
29
30 /*
31  * lber log 
32  */
33
34 static int ber_log_check( int errlvl, int loglvl )
35 {
36         return errlvl & loglvl ? 1 : 0;
37 }
38
39 int ber_pvt_log_printf
40 #ifdef HAVE_STDARG
41         (int errlvl, int loglvl, const char *fmt, ...)
42 #else
43         ( va_alist )
44 va_dcl
45 #endif
46 {
47         char buf[ 1024 ];
48         va_list ap;
49
50 #ifdef HAVE_STDARG
51         va_start( ap, fmt );
52 #else
53         int errlvl, loglvl;
54         char *fmt;
55
56         va_start( ap );
57
58         errlvl = va_arg( ap, int );
59         loglvl = va_arg( ap, int );
60         fmt = va_arg( ap, char * );
61 #endif
62
63         assert( fmt != NULL );
64
65         if ( !ber_log_check( errlvl, loglvl )) {
66                 return 0;
67         }
68
69 #ifdef HAVE_VSNPRINTF
70         buf[sizeof(buf) - 1] = '\0';
71         vsnprintf( buf, sizeof(buf)-1, fmt, ap );
72 #elif HAVE_VSPRINTF
73         vsprintf( buf, fmt, ap ); /* hope it's not too long */
74 #else
75         /* use doprnt() */
76 #error "vsprintf() required."
77 #endif
78
79         va_end(ap);
80
81         (*ber_pvt_log_print)( buf );
82         return 1;
83 }
84
85 static int ber_log_puts(int errlvl, int loglvl, char *buf)
86 {
87         assert( buf != NULL );
88
89         if ( !ber_log_check( errlvl, loglvl )) {
90                 return 0;
91         }
92
93         (*ber_pvt_log_print)( buf );
94         return 1;
95 }
96
97 /*
98  * Print arbitrary stuff, for debugging.
99  */
100
101 int
102 ber_log_bprint(int errlvl,
103         int loglvl,
104         const char *data,
105         int len )
106 {
107         assert( data != NULL );
108
109         if ( !ber_log_check( errlvl, loglvl )) {
110                 return 0;
111         }
112
113         ber_bprint(data, len);
114         return 1;
115 }
116
117 void
118 ber_bprint(
119         LDAP_CONST char *data,
120         int len )
121 {
122     static const char   hexdig[] = "0123456789abcdef";
123 #define BPLEN   48
124     char        out[ BPLEN ];
125     char        buf[ BPLEN + sizeof("\t%s\n") ];
126     int         i = 0;
127
128         assert( data != NULL );
129
130     memset( out, 0, BPLEN );
131     for ( ;; ) {
132         if ( len < 1 ) {
133             sprintf( buf, "\t%s\n", ( i == 0 ) ? "(end)" : out );
134                 (*ber_pvt_log_print)( buf );
135             break;
136         }
137
138 #ifndef LDAP_HEX
139         if ( isgraph( (unsigned char)*data )) {
140             out[ i ] = ' ';
141             out[ i+1 ] = *data;
142         } else {
143 #endif
144             out[ i ] = hexdig[ ( *data & 0xf0U ) >> 4 ];
145             out[ i+1 ] = hexdig[ *data & 0x0fU ];
146 #ifndef LDAP_HEX
147         }
148 #endif
149         i += 2;
150         len--;
151         data++;
152
153         if ( i > BPLEN - 2 ) {
154                 char data[128 + BPLEN];
155             sprintf( data, "\t%s\n", out );
156                 (*ber_pvt_log_print)(data);
157             memset( out, 0, BPLEN );
158             i = 0;
159             continue;
160         }
161         out[ i++ ] = ' ';
162     }
163 }
164
165 int
166 ber_log_dump(
167         int errlvl,
168         int loglvl,
169         const BerElement *ber,
170         int inout )
171 {
172         assert( ber != NULL );
173         assert( BER_VALID( ber ) );
174
175         if ( !ber_log_check( errlvl, loglvl )) {
176                 return 0;
177         }
178
179         ber_dump(ber, inout);
180         return 1;
181 }
182
183 void
184 ber_dump(
185         LDAP_CONST BerElement *ber,
186         int inout )
187 {
188         char buf[132];
189
190         assert( ber != NULL );
191         assert( BER_VALID( ber ) );
192
193         sprintf( buf, "ber_dump: buf 0x%lx, ptr 0x%lx, end 0x%lx\n",
194             (long) ber->ber_buf,
195                 (long) ber->ber_ptr,
196                 (long) ber->ber_end );
197
198         (*ber_pvt_log_print)( buf );
199
200         if ( inout == 1 ) {
201                 sprintf( buf, "          current len %ld, contents:\n",
202                     (long) (ber->ber_end - ber->ber_ptr) );
203                 ber_bprint( ber->ber_ptr, ber->ber_end - ber->ber_ptr );
204
205         } else {
206                 sprintf( buf, "          current len %ld, contents:\n",
207                     (long) (ber->ber_ptr - ber->ber_buf) );
208
209                 ber_bprint( ber->ber_buf, ber->ber_ptr - ber->ber_buf );
210         }
211 }
212
213 int
214 lber_log_sos_dump(
215         int errlvl,
216         int loglvl,
217         const Seqorset *sos )
218 {
219         assert( sos != NULL );
220
221         if ( !ber_log_check( errlvl, loglvl )) {
222                 return 0;
223         }
224
225         ber_sos_dump( sos );
226         return 1;
227 }
228
229 void
230 ber_sos_dump(
231         LDAP_CONST Seqorset *sos )
232 {
233         char buf[132];
234
235         assert( sos != NULL );
236
237         (*ber_pvt_log_print)( "*** sos dump ***\n" );
238
239         while ( sos != NULLSEQORSET ) {
240                 sprintf( buf, "ber_sos_dump: clen %ld first 0x%lx ptr 0x%lx\n",
241                     (long) sos->sos_clen, (long) sos->sos_first, (long) sos->sos_ptr );
242                 (*ber_pvt_log_print)( buf );
243
244                 sprintf( buf, "              current len %ld contents:\n",
245                     (long) (sos->sos_ptr - sos->sos_first) );
246                 (*ber_pvt_log_print)( buf );
247
248                 ber_bprint( sos->sos_first, sos->sos_ptr - sos->sos_first );
249
250                 sos = sos->sos_next;
251         }
252
253         (*ber_pvt_log_print)( "*** end dump ***\n" );
254 }