]> git.sur5r.net Git - openldap/blob - libraries/liblber/bprint.c
Vienna Bulk Commit
[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 & 0xf0 ) >> 4 ];
145             out[ i+1 ] = hexdig[ *data & 0x0f ];
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
174         if ( !ber_log_check( errlvl, loglvl )) {
175                 return 0;
176         }
177
178         ber_dump(ber, inout);
179         return 1;
180 }
181
182 void
183 ber_dump(
184         LDAP_CONST BerElement *ber,
185         int inout )
186 {
187         char buf[132];
188
189         assert( ber != NULL );
190
191         sprintf( buf, "ber_dump: buf 0x%lx, ptr 0x%lx, end 0x%lx\n",
192             (long) ber->ber_buf,
193                 (long) ber->ber_ptr,
194                 (long) ber->ber_end );
195
196         (*ber_pvt_log_print)( buf );
197
198         if ( inout == 1 ) {
199                 sprintf( buf, "          current len %ld, contents:\n",
200                     (long) (ber->ber_end - ber->ber_ptr) );
201                 ber_bprint( ber->ber_ptr, ber->ber_end - ber->ber_ptr );
202
203         } else {
204                 sprintf( buf, "          current len %ld, contents:\n",
205                     (long) (ber->ber_ptr - ber->ber_buf) );
206
207                 ber_bprint( ber->ber_buf, ber->ber_ptr - ber->ber_buf );
208         }
209 }
210
211 int
212 lber_log_sos_dump(
213         int errlvl,
214         int loglvl,
215         const Seqorset *sos )
216 {
217         assert( sos != NULL );
218
219         if ( !ber_log_check( errlvl, loglvl )) {
220                 return 0;
221         }
222
223         ber_sos_dump( sos );
224         return 1;
225 }
226
227 void
228 ber_sos_dump(
229         LDAP_CONST Seqorset *sos )
230 {
231         char buf[132];
232
233         assert( sos != NULL );
234
235         (*ber_pvt_log_print)( "*** sos dump ***\n" );
236
237         while ( sos != NULLSEQORSET ) {
238                 sprintf( buf, "ber_sos_dump: clen %ld first 0x%lx ptr 0x%lx\n",
239                     (long) sos->sos_clen, (long) sos->sos_first, (long) sos->sos_ptr );
240                 (*ber_pvt_log_print)( buf );
241
242                 sprintf( buf, "              current len %ld contents:\n",
243                     (long) (sos->sos_ptr - sos->sos_first) );
244                 (*ber_pvt_log_print)( buf );
245
246                 ber_bprint( sos->sos_first, sos->sos_ptr - sos->sos_first );
247
248                 sos = sos->sos_next;
249         }
250
251         (*ber_pvt_log_print)( "*** end dump ***\n" );
252 }