| 214 | } |
| 215 | |
| 216 | static int yaml_buf_reserve(yaml_buf_t *buf, size_t extra) { |
| 217 | if (extra > YAML_OUTPUT_MAX || buf->len > YAML_OUTPUT_MAX - extra) { |
| 218 | return YAML_ERROR; |
| 219 | } |
| 220 | size_t needed = buf->len + extra; |
| 221 | if (needed == SIZE_MAX) { |
| 222 | return YAML_ERROR; |
| 223 | } |
| 224 | needed++; |
| 225 | if (needed <= buf->cap) { |
| 226 | return 0; |
| 227 | } |
| 228 | |
| 229 | size_t cap = buf->cap ? buf->cap : YAML_BUFFER_INITIAL_CAPACITY; |
| 230 | while (cap < needed) { |
| 231 | if (cap > YAML_OUTPUT_MAX / YAML_GROWTH_FACTOR) { |
| 232 | cap = YAML_OUTPUT_MAX + YAML_UNIT; |
| 233 | break; |
| 234 | } |
| 235 | cap *= YAML_GROWTH_FACTOR; |
| 236 | } |
| 237 | if (cap < needed || cap > YAML_OUTPUT_MAX + YAML_UNIT) { |
| 238 | return YAML_ERROR; |
| 239 | } |
| 240 | char *grown = (char *)realloc(buf->data, cap); |
| 241 | if (!grown) { |
| 242 | return YAML_ERROR; |
| 243 | } |
| 244 | buf->data = grown; |
| 245 | buf->cap = cap; |
| 246 | return 0; |
| 247 | } |
| 248 | |
| 249 | static int yaml_buf_append(yaml_buf_t *buf, const char *data, size_t len) { |
| 250 | if (len == 0U) { |