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