X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fbuffer.h;h=8475e8cfcdd3320ac66b5b6a1a9548f6d513e500;hb=8d7d7a57b31433fad9bcfb2bb21cfa5cd1090679;hp=f51acff6fdef0d2258f070391c198059ce6e6026;hpb=397773d57e7df450f2061f6471e8e37e8bd73fad;p=gedcom-parse.git diff --git a/gedcom/buffer.h b/gedcom/buffer.h index f51acff..8475e8c 100644 --- a/gedcom/buffer.h +++ b/gedcom/buffer.h @@ -29,16 +29,33 @@ 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 */