Blame src/mw_debug.c

Packit Service 37472d
Packit Service 37472d
/*
Packit Service 37472d
  Meanwhile - Unofficial Lotus Sametime Community Client Library
Packit Service 37472d
  Copyright (C) 2004  Christopher (siege) O'Brien
Packit Service 37472d
  
Packit Service 37472d
  This library is free software; you can redistribute it and/or
Packit Service 37472d
  modify it under the terms of the GNU Library General Public
Packit Service 37472d
  License as published by the Free Software Foundation; either
Packit Service 37472d
  version 2 of the License, or (at your option) any later version.
Packit Service 37472d
  
Packit Service 37472d
  This library is distributed in the hope that it will be useful,
Packit Service 37472d
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 37472d
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 37472d
  Library General Public License for more details.
Packit Service 37472d
  
Packit Service 37472d
  You should have received a copy of the GNU Library General Public
Packit Service 37472d
  License along with this library; if not, write to the Free
Packit Service 37472d
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit Service 37472d
*/
Packit Service 37472d
Packit Service 37472d
Packit Service 1bfe49
#include <glib.h>
Packit Service 37472d
Packit Service 37472d
#include "mw_debug.h"
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
#define FRMT1            "%02x"
Packit Service 37472d
#define FRMT2            FRMT1 FRMT1 " "
Packit Service 37472d
#define FRMT4            FRMT2 FRMT2
Packit Service 37472d
#define FRMT8            FRMT4 FRMT4
Packit Service 37472d
#define FRMT16           FRMT8 FRMT8
Packit Service 37472d
Packit Service 37472d
#define ADVANCE(b, n, c)  {b += c; n -= c;}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
/** writes hex pairs of buf to str */
Packit Service 37472d
static void pretty_print(GString *str, const guchar *buf, gsize len) {
Packit Service 37472d
  while(len >= 16) {
Packit Service 37472d
    /* write a complete line */
Packit Service 37472d
    g_string_append_printf(str, FRMT16,
Packit Service 37472d
			   buf[0],  buf[1],  buf[2],  buf[3],
Packit Service 37472d
			   buf[4],  buf[5],  buf[6],  buf[7],
Packit Service 37472d
			   buf[8],  buf[9],  buf[10], buf[11],
Packit Service 37472d
			   buf[12], buf[13], buf[14], buf[15]);
Packit Service 37472d
    ADVANCE(buf, len, 16);
Packit Service 37472d
    
Packit Service 37472d
    /* append \n to each line but the last */
Packit Service 37472d
    if(len) g_string_append(str, "\n");
Packit Service 37472d
  }
Packit Service 37472d
Packit Service 37472d
  /* write an incomplete line */
Packit Service 37472d
  if(len >= 8) {
Packit Service 37472d
    g_string_append_printf(str, FRMT8,
Packit Service 37472d
			   buf[0], buf[1], buf[2], buf[3],
Packit Service 37472d
			   buf[4], buf[5], buf[6], buf[7]);
Packit Service 37472d
    ADVANCE(buf, len, 8);
Packit Service 37472d
  }
Packit Service 37472d
  
Packit Service 37472d
  if(len >= 4) {
Packit Service 37472d
    g_string_append_printf(str, FRMT4,
Packit Service 37472d
			   buf[0], buf[1], buf[2], buf[3]);
Packit Service 37472d
    ADVANCE(buf, len, 4);
Packit Service 37472d
  }
Packit Service 37472d
Packit Service 37472d
  if(len >= 2) {
Packit Service 37472d
    g_string_append_printf(str, FRMT2, buf[0], buf[1]);
Packit Service 37472d
    ADVANCE(buf, len, 2);
Packit Service 37472d
  }
Packit Service 37472d
Packit Service 37472d
  if(len >= 1) {
Packit Service 37472d
    g_string_append_printf(str, FRMT1, buf[0]);
Packit Service 37472d
    ADVANCE(buf, len, 1);
Packit Service 37472d
  }
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mw_debug_datav(const guchar *buf, gsize len,
Packit Service 37472d
		    const char *msg, va_list args) {
Packit Service 37472d
  GString *str;
Packit Service 37472d
Packit Service 37472d
  g_return_if_fail(buf != NULL || len == 0);
Packit Service 37472d
Packit Service 37472d
  str = g_string_new(NULL);
Packit Service 37472d
Packit Service 37472d
  if(msg) {
Packit Service 37472d
    char *txt = g_strdup_vprintf(msg, args);
Packit Service 37472d
    g_string_append_printf(str, "%s\n", txt);
Packit Service 37472d
    g_free(txt);
Packit Service 37472d
  }
Packit Service 37472d
  pretty_print(str, buf, len);
Packit Service 37472d
Packit Service 37472d
  g_debug(str->str);
Packit Service 37472d
  g_string_free(str, TRUE);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mw_debug_data(const guchar *buf, gsize len,
Packit Service 37472d
		   const char *msg, ...) {
Packit Service 37472d
  va_list args;
Packit Service 37472d
  
Packit Service 37472d
  g_return_if_fail(buf != NULL || len == 0);
Packit Service 37472d
Packit Service 37472d
  va_start(args, msg);
Packit Service 37472d
  mw_debug_datav(buf, len, msg, args);
Packit Service 37472d
  va_end(args);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mw_debug_opaquev(struct mwOpaque *o, const char *txt, va_list args) {
Packit Service 37472d
  g_return_if_fail(o != NULL);
Packit Service 37472d
  mw_debug_datav(o->data, o->len, txt, args);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mw_debug_opaque(struct mwOpaque *o, const char *txt, ...) {
Packit Service 37472d
  va_list args;
Packit Service 37472d
Packit Service 37472d
  g_return_if_fail(o != NULL);
Packit Service 37472d
Packit Service 37472d
  va_start(args, txt);
Packit Service 37472d
  mw_debug_opaquev(o, txt, args);
Packit Service 37472d
  va_end(args);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mw_mailme_datav(const guchar *buf, gsize len,
Packit Service 37472d
		     const char *info, va_list args) {
Packit Service 37472d
Packit Service 37472d
#if MW_MAILME
Packit Service 37472d
  GString *str;
Packit Service 37472d
  char *txt;
Packit Service 37472d
Packit Service 37472d
  str = g_string_new(MW_MAILME_MESSAGE "\n"
Packit Service 37472d
		     "  Please send mail to: " MW_MAILME_ADDRESS "\n"
Packit Service 37472d
		     MW_MAILME_CUT_START "\n");
Packit Service 37472d
  str = g_string_new(NULL);
Packit Service 37472d
Packit Service 37472d
  txt = g_strdup_vprintf(info, args);
Packit Service 37472d
  g_string_append_printf(str, "%s\n", txt);
Packit Service 37472d
  g_free(txt);
Packit Service 37472d
Packit Service 37472d
  if(buf && len) pretty_print(str, buf, len);
Packit Service 37472d
Packit Service 37472d
  g_string_append(str, MW_MAILME_CUT_STOP);
Packit Service 37472d
Packit Service 37472d
  g_debug(str->str);
Packit Service 37472d
  g_string_free(str, TRUE);
Packit Service 37472d
Packit Service 37472d
#else
Packit Service 37472d
  mw_debug_datav(buf, len, info, args);
Packit Service 37472d
Packit Service 37472d
#endif
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mw_mailme_data(const guchar *buf, gsize len,
Packit Service 37472d
		    const char *info, ...) {
Packit Service 37472d
  va_list args;
Packit Service 37472d
  va_start(args, info);
Packit Service 37472d
  mw_mailme_datav(buf, len, info, args);
Packit Service 37472d
  va_end(args);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mw_mailme_opaquev(struct mwOpaque *o, const char *info, va_list args) {
Packit Service 37472d
  mw_mailme_datav(o->data, o->len, info, args);
Packit Service 37472d
}
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
Packit Service 37472d
void mw_mailme_opaque(struct mwOpaque *o, const char *info, ...) {
Packit Service 37472d
  va_list args;
Packit Service 37472d
  va_start(args, info);
Packit Service 37472d
  mw_mailme_opaquev(o, info, args);
Packit Service 37472d
  va_end(args);
Packit Service 37472d
}