File: c_buffer.c

package info (click to toggle)
ruby-liquid-c 4.2.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 504 kB
  • sloc: ansic: 3,866; ruby: 1,151; makefile: 7
file content (42 lines) | stat: -rw-r--r-- 1,317 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "c_buffer.h"

static void c_buffer_expand_for_write(c_buffer_t *buffer, size_t write_size)
{
    size_t capacity = c_buffer_capacity(buffer);
    size_t size = c_buffer_size(buffer);
    size_t required_capacity = size + write_size;

    if (capacity < 1)
        capacity = 1;
    do {
        capacity *= 2;
    } while (capacity < required_capacity);
    buffer->data = xrealloc(buffer->data, capacity);
    buffer->data_end = buffer->data + size;
    buffer->capacity_end = buffer->data + capacity;
}

void c_buffer_zero_pad_for_alignment(c_buffer_t *buffer, size_t alignment)
{
    size_t unaligned_bytes = c_buffer_size(buffer) % alignment;
    if (unaligned_bytes) {
        size_t pad_size = alignment - unaligned_bytes;
        uint8_t *padding = c_buffer_extend_for_write(buffer, pad_size);
        memset(padding, 0, pad_size);
    }
}

void c_buffer_reserve_for_write(c_buffer_t *buffer, size_t write_size)
{
    uint8_t *write_end = buffer->data_end + write_size;
    if (write_end > buffer->capacity_end) {
        c_buffer_expand_for_write(buffer, write_size);
    }
}

void c_buffer_write(c_buffer_t *buffer, void *write_data, size_t write_size)
{
    c_buffer_reserve_for_write(buffer, write_size);
    memcpy(buffer->data_end, write_data, write_size);
    buffer->data_end += write_size;
}