summaryrefslogtreecommitdiff
path: root/prism/util/pm_buffer.c
diff options
context:
space:
mode:
authorKevin Newton <[email protected]>2023-10-24 10:04:48 -0400
committerKevin Newton <[email protected]>2023-10-26 15:19:35 -0400
commite9aa2398b9d8eb04a0013fa5420214382ea3457a (patch)
treeefa75fb8ba8c2e35185ea2d7967982456ff88f78 /prism/util/pm_buffer.c
parent9792be3610c62e0413bbdd878c64bbafbba3ffbd (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.c38
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);