Added interface.o.
[gedcom-parse.git] / message.c
index abde4b9f0416c8904d608e3617d38d4d3493cea9..122d0882840f76f5d6abfa1c411c2b015985e25e 100644 (file)
--- a/message.c
+++ b/message.c
@@ -1,7 +1,78 @@
+/*  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.                                   *
+
+ (C) 2001 by The Genes Development Team
+ Original author: Peter Verthez (Peter.Verthez@advalvas.be)
+*/
+
 /* $Id$ */
 /* $Name$ */
 
 #include "gedcom.h"
+#include "external.h"
+
+#define INITIAL_BUF_SIZE 256
+char *mess_buffer = NULL;
+size_t bufsize;
+
+Gedcom_msg_handler msg_handler = NULL;
+
+void gedcom_set_message_handler(Gedcom_msg_handler func)
+{
+  msg_handler = func;
+}
+
+void reset_mess_buffer()
+{
+  if (mess_buffer != NULL)
+    mess_buffer[0] = '\0';
+}
+
+void init_mess_buffer()
+{
+  if (mess_buffer == NULL) {
+    mess_buffer = (char *)malloc(INITIAL_BUF_SIZE);
+    mess_buffer[0] = '\0';
+    bufsize = INITIAL_BUF_SIZE;
+  }
+}
+
+int safe_buf_vappend(char *s, va_list ap)
+{
+  int res;
+  int len;
+  init_mess_buffer();
+  len = strlen(mess_buffer);
+  while (1) {
+    char *buf_ptr = mess_buffer + len;
+    int rest_size = bufsize - len;
+    
+    res = vsnprintf(buf_ptr, rest_size, s, ap);
+    
+    if (res > -1 && res < rest_size) {
+      break;
+    }
+    else  {
+      bufsize *= 2;
+      mess_buffer = realloc(mess_buffer, bufsize);
+    }
+  }
+  return res;  
+}
+
+int safe_buf_append(char *s, ...)
+{
+  int res;
+  va_list ap;
+  
+  va_start(ap, s);
+  res = safe_buf_vappend(s, ap);
+  va_end(ap);
+  
+  return res;
+}
 
 int gedcom_message(char* s, ...)
 {
@@ -9,10 +80,12 @@ int gedcom_message(char* s, ...)
   va_list ap;
 
   va_start(ap, s);
-  res = vfprintf(stderr, s, ap);
-  fprintf(stderr, "\n");
+  reset_mess_buffer();
+  res = safe_buf_vappend(s, ap);
   va_end(ap);
-  
+  safe_buf_append("\n");
+  if (msg_handler)
+    (*msg_handler)(MESSAGE, mess_buffer);
   return res;
 }
 
@@ -21,11 +94,14 @@ int gedcom_warning(char* s, ...)
   int res;
   va_list ap;
 
+  reset_mess_buffer();
+  safe_buf_append("Warning on line %d: ", line_no);
   va_start(ap, s);
-  fprintf(stderr, "Warning on line %d: ", line_no);
-  res = vfprintf(stderr, s, ap);
-  fprintf(stderr, "\n");
+  res = safe_buf_vappend(s, ap);
   va_end(ap);
+  safe_buf_append("\n");
+  if (msg_handler)
+    (*msg_handler)(WARNING, mess_buffer);
   
   return res;
 }
@@ -35,11 +111,14 @@ int gedcom_error(char* s, ...)
   int res;
   va_list ap;
 
+  reset_mess_buffer();
+  safe_buf_append("Error on line %d: ", line_no);
   va_start(ap, s);
-  fprintf(stderr, "Error on line %d: ", line_no);
-  res = vfprintf(stderr, s, ap);
-  fprintf(stderr, "\n");
+  res = safe_buf_vappend(s, ap);
   va_end(ap);
+  safe_buf_append("\n");
+  if (msg_handler)
+    (*msg_handler)(ERROR, mess_buffer);
   
   return res;
 }