#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;
mess_buffer[0] = '\0';
}
+void cleanup_mess_buffer()
+{
+ if (mess_buffer)
+ free(mess_buffer);
+}
+
void init_mess_buffer()
{
if (mess_buffer == NULL) {
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\n"),
+ else {
+ fprintf(stderr, _("Could not allocate memory at %s, %d"),
__FILE__, __LINE__);
+ fprintf(stderr, "\n");
+ }
}
}
-int safe_buf_vappend(char *s, va_list ap)
+int safe_buf_vappend(const char *s, va_list ap)
{
int res = 0;
int len;
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) {
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;
return res;
}
-int gedcom_message(char* s, ...)
+int gedcom_message(const char* s, ...)
{
int res;
va_list ap;
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);
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);
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);
}