- if (mess_buffer)
- free(mess_buffer);
-}
-
-void init_mess_buffer()
-{
- if (mess_buffer == NULL) {
- mess_buffer = (char *)malloc(INITIAL_BUF_SIZE);
- 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"),
- __FILE__, __LINE__);
- fprintf(stderr, "\n");
- }
- }
-}
-
-int safe_buf_vappend(const char *s, va_list ap)
-{
- int res = 0;
- int len;
- init_mess_buffer();
- if (mess_buffer) {
- len = strlen(mess_buffer);
- while (1) {
- 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) {
- break;
- }
- else {
- 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(const char *s, ...)
-{
- int res;
- va_list ap;
-
- va_start(ap, s);
- res = safe_buf_vappend(s, ap);
- va_end(ap);
-
- return res;