Some changes to safe_buffer structure.
[gedcom-parse.git] / gedcom / buffer.h
index f51acff6fdef0d2258f070391c198059ce6e6026..8475e8cfcdd3320ac66b5b6a1a9548f6d513e500 100644 (file)
 
 struct safe_buffer {
   char* buffer;
-  size_t bufsize;
+  size_t bufsize;  /* total size */
+  char* buf_end;
+  size_t buflen;   /* used size */
   void (*cleanup_func)(void);
 };
 
 void init_buffer(struct safe_buffer* b);
 void reset_buffer(struct safe_buffer* b);
 void cleanup_buffer(struct safe_buffer* b);
+void grow_buffer(struct safe_buffer* b);
 
 int safe_buf_vappend(struct safe_buffer* b, const char* s, va_list ap);
 int safe_buf_append(struct safe_buffer* b, const char* s, ...);
 char* get_buf_string(struct safe_buffer* b);
 
+#define SAFE_BUF_ADDCHAR(b, ch)                                               \
+  {                                                                           \
+    struct safe_buffer *buf = b;                                              \
+    char c = ch;                                                              \
+    if (buf && buf->buffer == NULL)                                           \
+      init_buffer(buf);                                                       \
+    if (buf && buf->buffer) {                                                 \
+      if (buf->buflen == buf->bufsize)                                        \
+       grow_buffer(buf);                                                     \
+      *buf->buf_end++ = c;                                                    \
+      buf->buflen++;                                                          \
+    }                                                                         \
+  }
+
 #endif /* __BUFFER_H */