
/*--------------------------------------------------------------------*/
/*--- For sending error/informative messages.                      ---*/
/*---                                                 vg_message.c ---*/
/*--------------------------------------------------------------------*/

/*
   This file is part of Valgrind, an x86 protected-mode emulator 
   designed for debugging and profiling binaries on x86-Unixes.

   Copyright (C) 2000-2002 Julian Seward 
      jseward@acm.org
      Julian_Seward@muraroa.demon.co.uk

   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307, USA.

   The GNU General Public License is contained in the file LICENSE.
*/


#include "vg_include.h"


static char vg_mbuf[M_VG_MSGBUF];
static int vg_n_mbuf;

static void add_to_buf ( Char c )
{
  if (vg_n_mbuf >= (M_VG_MSGBUF-1)) return;
  vg_mbuf[vg_n_mbuf++] = c;
  vg_mbuf[vg_n_mbuf]   = 0;
}


/* Publically visible from here onwards. */

void
VG_(add_to_msg) ( Char *format, ... )
{
   va_list vargs;
   va_start(vargs,format);
   VG_(vprintf) ( add_to_buf, format, vargs );
   va_end(vargs);
}

/* Send a simple single-part message. */
void VG_(message) ( VgMsgKind kind, Char* format, ... )
{
   va_list vargs;
   va_start(vargs,format);
   VG_(start_msg) ( kind );
   VG_(vprintf) ( add_to_buf, format, vargs );
   va_end(vargs);
   VG_(end_msg)();
}

void VG_(start_msg) ( VgMsgKind kind )
{
   Char c;
   vg_n_mbuf = 0;
   vg_mbuf[vg_n_mbuf] = 0;
   switch (kind) {
      case Vg_UserMsg:       c = '='; break;
      case Vg_DebugMsg:      c = '-'; break;
      case Vg_DebugExtraMsg: c = '+'; break;
      default:               c = '?'; break;
   }
   VG_(add_to_msg)( "%c%c%d%c%c ", 
                    c,c, VG_(getpid)(), c,c );
}


void VG_(end_msg) ( void )
{
   if (VG_(clo_logfile_fd) >= 0) {
      add_to_buf('\n');
      VG_(write)(VG_(clo_logfile_fd), vg_mbuf, VG_(strlen)(vg_mbuf));
   }
}


void VG_(startup_logging) ( void )
{
}

void VG_(shutdown_logging) ( void )
{
}

/*--------------------------------------------------------------------*/
/*--- end                                             vg_message.c ---*/
/*--------------------------------------------------------------------*/
