diff options
author | Kevin Newton <[email protected]> | 2023-10-24 10:04:48 -0400 |
---|---|---|
committer | Kevin Newton <[email protected]> | 2023-10-26 15:19:35 -0400 |
commit | e9aa2398b9d8eb04a0013fa5420214382ea3457a (patch) | |
tree | efa75fb8ba8c2e35185ea2d7967982456ff88f78 /prism/util/pm_buffer.c | |
parent | 9792be3610c62e0413bbdd878c64bbafbba3ffbd (diff) |
[ruby/prism] Get general prettyprint structure working
https://github.com/ruby/prism/commit/7c9cf63d4c
Diffstat (limited to 'prism/util/pm_buffer.c')
-rw-r--r-- | prism/util/pm_buffer.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/prism/util/pm_buffer.c b/prism/util/pm_buffer.c index 55f6b0f7f3..9547df203a 100644 --- a/prism/util/pm_buffer.c +++ b/prism/util/pm_buffer.c @@ -40,9 +40,13 @@ pm_buffer_append_length(pm_buffer_t *buffer, size_t length) { size_t next_length = buffer->length + length; if (next_length > buffer->capacity) { - do { + if (buffer->capacity == 0) { + buffer->capacity = 1; + } + + while (next_length > buffer->capacity) { buffer->capacity *= 2; - } while (next_length > buffer->capacity); + } buffer->value = realloc(buffer->value, buffer->capacity); } @@ -53,20 +57,22 @@ pm_buffer_append_length(pm_buffer_t *buffer, size_t length) { // Append a generic pointer to memory to the buffer. static inline void pm_buffer_append(pm_buffer_t *buffer, const void *source, size_t length) { + size_t cursor = buffer->length; pm_buffer_append_length(buffer, length); - memcpy(buffer->value + (buffer->length - length), source, length); + memcpy(buffer->value + cursor, source, length); } // Append the given amount of space as zeroes to the buffer. void pm_buffer_append_zeroes(pm_buffer_t *buffer, size_t length) { + size_t cursor = buffer->length; pm_buffer_append_length(buffer, length); - memset(buffer->value + (buffer->length - length), 0, length); + memset(buffer->value + cursor, 0, length); } // Append a string to the buffer. void -pm_buffer_append_str(pm_buffer_t *buffer, const char *value, size_t length) { +pm_buffer_append_string(pm_buffer_t *buffer, const char *value, size_t length) { pm_buffer_append(buffer, value, length); } @@ -78,27 +84,35 @@ pm_buffer_append_bytes(pm_buffer_t *buffer, const uint8_t *value, size_t length) // Append a single byte to the buffer. void -pm_buffer_append_u8(pm_buffer_t *buffer, uint8_t value) { +pm_buffer_append_byte(pm_buffer_t *buffer, uint8_t value) { const void *source = &value; pm_buffer_append(buffer, source, sizeof(uint8_t)); } -// Append a 32-bit unsigned integer to the buffer. +// Append a 32-bit unsigned integer to the buffer as a variable-length integer. void -pm_buffer_append_u32(pm_buffer_t *buffer, uint32_t value) { +pm_buffer_append_varint(pm_buffer_t *buffer, uint32_t value) { if (value < 128) { - pm_buffer_append_u8(buffer, (uint8_t) value); + pm_buffer_append_byte(buffer, (uint8_t) value); } else { uint32_t n = value; while (n >= 128) { - pm_buffer_append_u8(buffer, (uint8_t) (n | 128)); + pm_buffer_append_byte(buffer, (uint8_t) (n | 128)); n >>= 7; } - pm_buffer_append_u8(buffer, (uint8_t) n); + pm_buffer_append_byte(buffer, (uint8_t) n); + } +} + +// Concatenate one buffer onto another. +void +pm_buffer_concat(pm_buffer_t *destination, const pm_buffer_t *source) { + if (source->length > 0) { + pm_buffer_append(destination, source->value, source->length); } } -// Free the memory associated with the buffer. +// Free the internal memory associated with the buffer. void pm_buffer_free(pm_buffer_t *buffer) { free(buffer->value); |