+
+#include <ac/ctype.h>
+#include <ac/stdarg.h>
+#include <ac/string.h>
+
+#include "lber-int.h"
+
+/*
+ * Print stuff
+ */
+static void
+lber_error_print( char *data )
+{
+ fputs( data, stderr );
+ fflush( stderr );
+}
+
+BER_LOG_PRINT_FN lber_pvt_log_print = lber_error_print;
+
+/*
+ * lber log
+ */
+
+static int lber_log_check( int errlvl, int loglvl )
+{
+ return errlvl & loglvl ? 1 : 0;
+}
+
+int lber_pvt_log_printf
+#ifdef HAVE_STDARG
+ (int errlvl, int loglvl, char *fmt, ...)
+#else
+ ( va_alist )
+va_dcl
+#endif
+{
+ char buf[ 1024 ];
+ va_list ap;
+
+#ifdef HAVE_STDARG
+ va_start( ap, fmt );
+#else
+ int errlvl, loglvl;
+ char *fmt;
+
+ va_start( ap );
+
+ errlvl = va_arg( ap, int );
+ loglvl = va_arg( ap, int );
+ fmt = va_arg( ap, char * );
+#endif
+
+ if ( !lber_log_check( errlvl, loglvl )) {
+ return 0;
+ }
+
+#ifdef HAVE_VSNPRINTF
+ buf[sizeof(buf) - 1] = '\0';
+ vsnprintf( buf, sizeof(buf)-1, fmt, ap );
+#elif HAVE_VSPRINTF
+ vsprintf( buf, fmt, ap ); /* hope it's not too long */
+#else
+ /* use doprnt() */
+ chokeme = "choke me! I don't have a doprnt manual handy!";
+#endif
+
+ va_end(ap);
+
+ (*lber_pvt_log_print)( buf );
+ return 1;
+}
+
+static int lber_log_puts(int errlvl, int loglvl, char *buf)
+{
+ if ( !lber_log_check( errlvl, loglvl )) {
+ return 0;
+ }
+
+ (*lber_pvt_log_print)( buf );
+ return 1;
+}