faster and safer dbuf functions (#443)

This commit is contained in:
Fabrice Bellard
2025-10-13 13:51:25 +02:00
parent 2a53de04c6
commit 0d4cd2d051
5 changed files with 77 additions and 35 deletions

View File

@@ -264,24 +264,58 @@ typedef struct DynBuf {
void dbuf_init(DynBuf *s);
void dbuf_init2(DynBuf *s, void *opaque, DynBufReallocFunc *realloc_func);
int dbuf_realloc(DynBuf *s, size_t new_size);
int dbuf_write(DynBuf *s, size_t offset, const uint8_t *data, size_t len);
int dbuf_claim(DynBuf *s, size_t len);
int dbuf_put(DynBuf *s, const uint8_t *data, size_t len);
int dbuf_put_self(DynBuf *s, size_t offset, size_t len);
int dbuf_putc(DynBuf *s, uint8_t c);
int dbuf_putstr(DynBuf *s, const char *str);
int __dbuf_putc(DynBuf *s, uint8_t c);
int __dbuf_put_u16(DynBuf *s, uint16_t val);
int __dbuf_put_u32(DynBuf *s, uint32_t val);
int __dbuf_put_u64(DynBuf *s, uint64_t val);
static inline int dbuf_putc(DynBuf *s, uint8_t val)
{
if (unlikely((s->allocated_size - s->size) < 1)) {
return __dbuf_putc(s, val);
} else {
s->buf[s->size++] = val;
return 0;
}
}
static inline int dbuf_put_u16(DynBuf *s, uint16_t val)
{
return dbuf_put(s, (uint8_t *)&val, 2);
if (unlikely((s->allocated_size - s->size) < 2)) {
return __dbuf_put_u16(s, val);
} else {
put_u16(s->buf + s->size, val);
s->size += 2;
return 0;
}
}
static inline int dbuf_put_u32(DynBuf *s, uint32_t val)
{
return dbuf_put(s, (uint8_t *)&val, 4);
if (unlikely((s->allocated_size - s->size) < 4)) {
return __dbuf_put_u32(s, val);
} else {
put_u32(s->buf + s->size, val);
s->size += 4;
return 0;
}
}
static inline int dbuf_put_u64(DynBuf *s, uint64_t val)
{
return dbuf_put(s, (uint8_t *)&val, 8);
if (unlikely((s->allocated_size - s->size) < 8)) {
return __dbuf_put_u64(s, val);
} else {
put_u64(s->buf + s->size, val);
s->size += 8;
return 0;
}
}
int __attribute__((format(printf, 2, 3))) dbuf_printf(DynBuf *s,
const char *fmt, ...);
void dbuf_free(DynBuf *s);