Put generated lex and yacc files also in distribution.
[gedcom-parse.git] / gedcom / message.c
index c3a5abf1ab642502f9639edda1997d9cfb9cf082..5f0bdc38ab9dbfde2263e095bb0675865c9d9093 100644 (file)
 #include "gedcom_internal.h"
 #include "gedcom.h"
 
+#if HAVE_VSNPRINTF
 #define INITIAL_BUF_SIZE 256
+#else
+/* Risk on overflowing buffer, so make size big */
+#define INITIAL_BUF_SIZE 65536
+#endif
+
 char *mess_buffer = NULL;
 size_t bufsize;
 
@@ -41,6 +47,12 @@ void reset_mess_buffer()
     mess_buffer[0] = '\0';
 }
 
+void cleanup_mess_buffer()
+{
+  if (mess_buffer)
+    free(mess_buffer);
+}
+
 void init_mess_buffer()
 {
   if (mess_buffer == NULL) {
@@ -48,6 +60,8 @@ void init_mess_buffer()
     if (mess_buffer) {
       mess_buffer[0] = '\0';
       bufsize = INITIAL_BUF_SIZE;
+      if (atexit(cleanup_mess_buffer) != 0)
+       gedcom_warning(_("Could not register buffer cleanup function"));
     }
     else {
       fprintf(stderr, _("Could not allocate memory at %s, %d"),
@@ -57,7 +71,7 @@ void init_mess_buffer()
   }
 }
 
-int safe_buf_vappend(char *s, va_list ap)
+int safe_buf_vappend(const char *s, va_list ap)
 {
   int res = 0;
   int len;
@@ -68,6 +82,7 @@ int safe_buf_vappend(char *s, va_list ap)
       char *buf_ptr = mess_buffer + len;
       int rest_size = bufsize - len;
       
+#if HAVE_VSNPRINTF
       res = vsnprintf(buf_ptr, rest_size, s, ap);
       
       if (res > -1 && res < rest_size) {
@@ -77,12 +92,21 @@ int safe_buf_vappend(char *s, va_list ap)
        bufsize *= 2;
        mess_buffer = realloc(mess_buffer, bufsize);
       }
+#else /* not HAVE_VSNPRINTF */
+#  if HAVE_VSPRINTF
+#     warning "Using VSPRINTF. Buffer overflow could happen!"
+      vsprintf(buf_ptr, s, ap);
+      break;
+#  else /* not HAVE_VPRINTF */
+#     error "Your standard library has neither vsnprintf nor vsprintf defined. One of them is required!"
+#  endif
+#endif
     }
   }
   return res;
 }
 
-int safe_buf_append(char *s, ...)
+int safe_buf_append(const char *s, ...)
 {
   int res;
   va_list ap;
@@ -94,7 +118,7 @@ int safe_buf_append(char *s, ...)
   return res;
 }
 
-int gedcom_message(char* s, ...)
+int gedcom_message(const char* s, ...)
 {
   int res;
   va_list ap;
@@ -108,13 +132,16 @@ int gedcom_message(char* s, ...)
   return res;
 }
 
-int gedcom_warning(char* s, ...)
+int gedcom_warning(const char* s, ...)
 {
   int res;
   va_list ap;
 
   reset_mess_buffer();
-  safe_buf_append(_("Warning on line %d: "), line_no);
+  if (line_no != 0) 
+    safe_buf_append(_("Warning on line %d: "), line_no);
+  else
+    safe_buf_append(_("Warning: "));
   va_start(ap, s);
   res = safe_buf_vappend(s, ap);
   va_end(ap);
@@ -124,13 +151,16 @@ int gedcom_warning(char* s, ...)
   return res;
 }
 
-int gedcom_error(char* s, ...)
+int gedcom_error(const char* s, ...)
 {
   int res;
   va_list ap;
 
   reset_mess_buffer();
-  safe_buf_append(_("Error on line %d: "), line_no);
+  if (line_no != 0)
+    safe_buf_append(_("Error on line %d: "), line_no);
+  else
+    safe_buf_append(_("Error: "));
   va_start(ap, s);
   res = safe_buf_vappend(s, ap);
   va_end(ap);
@@ -140,7 +170,7 @@ int gedcom_error(char* s, ...)
   return res;
 }
 
-void gedcom_mem_error(char *filename, int line)
+void gedcom_mem_error(const char *filename, int line)
 {
   gedcom_error(_("Could not allocate memory at %s, %d"), filename, line);
 }