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