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