]> git.sur5r.net Git - openldap/blob - libraries/liblber/bprint.c
Cyrus SASL uses screwy terms.
[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 #include "lber-int.h"
16
17 /*
18  * ber errno
19  */
20 BER_ERRNO_FN ber_int_errno_fn;
21
22 int * ber_errno_addr(void)
23 {
24         static int ber_int_errno = LBER_ERROR_NONE;
25
26         if( ber_int_errno_fn ) {
27                 return (*ber_int_errno_fn)();
28         }
29
30         return &ber_int_errno;
31 }
32
33 /*
34  * Print stuff
35  */
36 static void
37 ber_error_print( char *data )
38 {
39         assert( data != NULL );
40
41         fputs( data, stderr );
42         fflush( stderr );
43 }
44
45 BER_LOG_PRINT_FN ber_pvt_log_print = ber_error_print;
46
47 /*
48  * lber log 
49  */
50
51 static int ber_log_check( int errlvl, int loglvl )
52 {
53         return errlvl & loglvl ? 1 : 0;
54 }
55
56 int ber_pvt_log_printf( int errlvl, int loglvl, const char *fmt, ... )
57 {
58         char buf[ 1024 ];
59         va_list ap;
60
61         assert( fmt != NULL );
62
63         if ( !ber_log_check( errlvl, loglvl )) {
64                 return 0;
65         }
66
67         va_start( ap, fmt );
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         ber_len_t 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         ber_len_t 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         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         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 ber_log_sos_dump(
215         int errlvl,
216         int loglvl,
217         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         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 != NULL ) {
240                 sprintf( buf, "ber_sos_dump: clen %ld first 0x%lx ptr 0x%lx\n",
241                     (long) sos->sos_clen,
242                         (long) sos->sos_first,
243                         (long) sos->sos_ptr );
244                 (*ber_pvt_log_print)( buf );
245
246                 sprintf( buf, "              current len %ld contents:\n",
247                     (long) (sos->sos_ptr - sos->sos_first) );
248                 (*ber_pvt_log_print)( buf );
249
250                 ber_bprint( sos->sos_first, sos->sos_ptr - sos->sos_first );
251
252                 sos = sos->sos_next;
253         }
254
255         (*ber_pvt_log_print)( "*** end dump ***\n" );
256 }