-void vg_success( const char *fmt, ... ) { VG_LOG_WRITE( stdout, (KGRN "success" KWHT "| " KGRN) ); }
-void vg_info( const char *fmt, ... ) { VG_LOG_WRITE( stdout, (KNRM " info" KWHT "| " KNRM) ); }
-void vg_warn( const char *fmt, ... ) { VG_LOG_WRITE( stdout, (KYEL " warn" KWHT "| " KYEL) ); }
-void vg_error( const char *fmt, ... ) { VG_LOG_WRITE( stderr, (KRED " error" KWHT "| " KRED) ); }
+static void vg_log_write( FILE *file, const char *prefix, const char *fmt, va_list args )
+{
+ char buffer[512];
+ int i, j;
+
+ for( i = 0; i < vg_list_size( buffer ); i ++ )
+ {
+ if( prefix[i] )
+ buffer[i] = prefix[i];
+ else
+ break;
+ }
+
+ j = i + vsnprintf( buffer + i, vg_list_size( buffer ) - i -2, fmt, args );
+ strcpy( buffer + j, KNRM );
+
+ fputs( buffer, file );
+
+ if( vg_log_callback )
+ vg_log_callback( buffer );
+}
+
+static void vg_success( const char *fmt, ... )
+ { va_list args; va_start( args, fmt ); vg_log_write( stdout, (KGRN "success" KWHT "| " KGRN), fmt, args ); va_end( args ); }
+static void vg_info( const char *fmt, ... )
+ { va_list args; va_start( args, fmt ); vg_log_write( stdout, (KNRM " info" KWHT "| " KNRM), fmt, args ); va_end( args ); }
+static void vg_warn( const char *fmt, ... )
+ { va_list args; va_start( args, fmt ); vg_log_write( stdout, (KYEL " warn" KWHT "| " KYEL), fmt, args ); va_end( args ); }
+static void vg_error( const char *fmt, ... )
+ { va_list args; va_start( args, fmt ); vg_log_write( stderr, (KRED " error" KWHT "| " KRED), fmt, args ); va_end( args ); }