101 int result = vsnprintf(NULL, 0, format, arguments);
147 pm_buffer_append_byte(buffer, (uint8_t) value);
151 pm_buffer_append_byte(buffer, (uint8_t) (n | 128));
154 pm_buffer_append_byte(buffer, (uint8_t) n);
163 uint32_t unsigned_int = ((uint32_t)(value) << 1) ^ ((uint32_t)(value >> 31));
164 pm_buffer_append_varuint(buffer, unsigned_int);
180pm_buffer_append_unicode_codepoint(
pm_buffer_t *buffer, uint32_t value) {
182 pm_buffer_append_byte(buffer, (uint8_t) value);
184 }
else if (value <= 0x7FF) {
186 (uint8_t) (0xC0 | ((value >> 6) & 0x3F)),
187 (uint8_t) (0x80 | (value & 0x3F))
190 pm_buffer_append_bytes(buffer, bytes, 2);
192 }
else if (value <= 0xFFFF) {
194 (uint8_t) (0xE0 | ((value >> 12) & 0x3F)),
195 (uint8_t) (0x80 | ((value >> 6) & 0x3F)),
196 (uint8_t) (0x80 | (value & 0x3F))
199 pm_buffer_append_bytes(buffer, bytes, 3);
201 }
else if (value <= 0x10FFFF) {
203 (uint8_t) (0xF0 | ((value >> 18) & 0x3F)),
204 (uint8_t) (0x80 | ((value >> 12) & 0x3F)),
205 (uint8_t) (0x80 | ((value >> 6) & 0x3F)),
206 (uint8_t) (0x80 | (value & 0x3F))
209 pm_buffer_append_bytes(buffer, bytes, 4);
221 for (
size_t index = 0; index < length; index++) {
222 const uint8_t
byte = source[index];
224 if ((
byte <= 0x06) || (
byte >= 0x0E &&
byte <= 0x1F) || (
byte >= 0x7F)) {
225 if (escaping == PM_BUFFER_ESCAPING_RUBY) {
226 pm_buffer_append_format(buffer,
"\\x%02X",
byte);
228 pm_buffer_append_format(buffer,
"\\u%04X",
byte);
233 if (escaping == PM_BUFFER_ESCAPING_RUBY) {
234 pm_buffer_append_string(buffer,
"\\a", 2);
236 pm_buffer_append_format(buffer,
"\\u%04X",
byte);
240 pm_buffer_append_string(buffer,
"\\b", 2);
243 pm_buffer_append_string(buffer,
"\\t", 2);
246 pm_buffer_append_string(buffer,
"\\n", 2);
249 if (escaping == PM_BUFFER_ESCAPING_RUBY) {
250 pm_buffer_append_string(buffer,
"\\v", 2);
252 pm_buffer_append_format(buffer,
"\\u%04X",
byte);
256 pm_buffer_append_string(buffer,
"\\f", 2);
259 pm_buffer_append_string(buffer,
"\\r", 2);
262 pm_buffer_append_string(buffer,
"\\\"", 2);
265 if (escaping == PM_BUFFER_ESCAPING_RUBY && index + 1 < length) {
266 const uint8_t next_byte = source[index + 1];
267 if (next_byte ==
'{' || next_byte ==
'@' || next_byte ==
'$') {
268 pm_buffer_append_byte(buffer,
'\\');
272 pm_buffer_append_byte(buffer,
'#');
276 pm_buffer_append_string(buffer,
"\\\\", 2);
279 pm_buffer_append_byte(buffer,
byte);
340pm_buffer_insert(
pm_buffer_t *buffer,
size_t index,
const char *value,
size_t length) {
341 assert(index <= buffer->length);
343 if (index == buffer->
length) {
344 pm_buffer_append_string(buffer, value, length);
346 pm_buffer_append_zeroes(buffer, length);
347 memmove(buffer->
value + index + length, buffer->
value + index, buffer->
length - length - index);
348 memcpy(buffer->
value + index, value, length);