100 int result = vsnprintf(NULL, 0, format, arguments);
146 pm_buffer_append_byte(buffer, (uint8_t) value);
150 pm_buffer_append_byte(buffer, (uint8_t) (n | 128));
153 pm_buffer_append_byte(buffer, (uint8_t) n);
162 uint32_t unsigned_int = ((uint32_t)(value) << 1) ^ ((uint32_t)(value >> 31));
163 pm_buffer_append_varuint(buffer, unsigned_int);
179pm_buffer_append_unicode_codepoint(
pm_buffer_t *buffer, uint32_t value) {
181 pm_buffer_append_byte(buffer, (uint8_t) value);
183 }
else if (value <= 0x7FF) {
185 (uint8_t) (0xC0 | ((value >> 6) & 0x3F)),
186 (uint8_t) (0x80 | (value & 0x3F))
189 pm_buffer_append_bytes(buffer, bytes, 2);
191 }
else if (value <= 0xFFFF) {
193 (uint8_t) (0xE0 | ((value >> 12) & 0x3F)),
194 (uint8_t) (0x80 | ((value >> 6) & 0x3F)),
195 (uint8_t) (0x80 | (value & 0x3F))
198 pm_buffer_append_bytes(buffer, bytes, 3);
200 }
else if (value <= 0x10FFFF) {
202 (uint8_t) (0xF0 | ((value >> 18) & 0x3F)),
203 (uint8_t) (0x80 | ((value >> 12) & 0x3F)),
204 (uint8_t) (0x80 | ((value >> 6) & 0x3F)),
205 (uint8_t) (0x80 | (value & 0x3F))
208 pm_buffer_append_bytes(buffer, bytes, 4);
220 for (
size_t index = 0; index < length; index++) {
221 const uint8_t
byte = source[index];
223 if ((
byte <= 0x06) || (
byte >= 0x0E &&
byte <= 0x1F) || (
byte >= 0x7F)) {
224 if (escaping == PM_BUFFER_ESCAPING_RUBY) {
225 pm_buffer_append_format(buffer,
"\\x%02X",
byte);
227 pm_buffer_append_format(buffer,
"\\u%04X",
byte);
232 if (escaping == PM_BUFFER_ESCAPING_RUBY) {
233 pm_buffer_append_string(buffer,
"\\a", 2);
235 pm_buffer_append_format(buffer,
"\\u%04X",
byte);
239 pm_buffer_append_string(buffer,
"\\b", 2);
242 pm_buffer_append_string(buffer,
"\\t", 2);
245 pm_buffer_append_string(buffer,
"\\n", 2);
248 if (escaping == PM_BUFFER_ESCAPING_RUBY) {
249 pm_buffer_append_string(buffer,
"\\v", 2);
251 pm_buffer_append_format(buffer,
"\\u%04X",
byte);
255 pm_buffer_append_string(buffer,
"\\f", 2);
258 pm_buffer_append_string(buffer,
"\\r", 2);
261 pm_buffer_append_string(buffer,
"\\\"", 2);
264 if (escaping == PM_BUFFER_ESCAPING_RUBY && index + 1 < length) {
265 const uint8_t next_byte = source[index + 1];
266 if (next_byte ==
'{' || next_byte ==
'@' || next_byte ==
'$') {
267 pm_buffer_append_byte(buffer,
'\\');
271 pm_buffer_append_byte(buffer,
'#');
275 pm_buffer_append_string(buffer,
"\\\\", 2);
278 pm_buffer_append_byte(buffer,
byte);
339pm_buffer_insert(
pm_buffer_t *buffer,
size_t index,
const char *value,
size_t length) {
340 assert(index <= buffer->length);
342 if (index == buffer->
length) {
343 pm_buffer_append_string(buffer, value, length);
345 pm_buffer_append_zeroes(buffer, length);
346 memmove(buffer->
value + index + length, buffer->
value + index, buffer->
length - length - index);
347 memcpy(buffer->
value + index, value, length);