SOL_API const char * sol_network_link_addr_to_str(const struct sol_network_link_addr *addr, struct sol_buffer *buf) { char *p; int i; bool sep = false, skipping = false, treated_zeroes = false; SOL_NULL_CHECK(addr, NULL); SOL_NULL_CHECK(buf, NULL); if (sol_bluetooth_is_family(addr->family)) return sol_bluetooth_addr_to_str(addr, buf); if (addr->family != SOL_NETWORK_FAMILY_INET6) return NULL; if (buf->capacity - buf->used < SOL_NETWORK_INET_ADDR_STR_LEN) return NULL; p = sol_buffer_at_end(buf); for (i = 0; i < 16; i += 2) { uint16_t part; part = ((uint16_t)addr->addr.in6[i] << 8) | addr->addr.in6[i + 1]; if (part && skipping) { skipping = false; treated_zeroes = true; sep = true; } if (!part && !treated_zeroes) { if (!skipping) { skipping = true; sep = true; } } if (sep) { sol_buffer_append_char(buf, ':'); if (skipping) sep = false; } if (skipping) continue; sol_buffer_append_printf(buf, "%" PRIx16, part); sep = true; } if (skipping) sol_buffer_append_char(buf, ':'); return p; }
SOL_API int sol_buffer_insert_char(struct sol_buffer *buf, size_t pos, const char c) { char *p; size_t new_size; int err; SOL_NULL_CHECK(buf, -EINVAL); SOL_INT_CHECK(pos, > buf->used, -EINVAL); if (pos == buf->used) return sol_buffer_append_char(buf, c); err = sol_util_size_add(buf->used, 1, &new_size); if (err < 0) return err; err = sol_buffer_ensure(buf, new_size); if (err < 0) return err; p = sol_buffer_at(buf, pos); memmove(p + 1, p, buf->used - pos); *p = c; buf->used++; if (nul_byte_size(buf)) return sol_buffer_ensure_nul_byte(buf); return 0; }
/* * If index is between [' and '] we need to unescape the ' char and to remove * the [' and '] separator. */ static int json_path_parse_object_key(const struct sol_str_slice slice, struct sol_buffer *buffer) { const char *end, *p, *p2; struct sol_str_slice key; int r; if (slice.data[0] != '[') { sol_buffer_init_flags(buffer, (char *)slice.data, slice.len, SOL_BUFFER_FLAGS_MEMORY_NOT_OWNED | SOL_BUFFER_FLAGS_NO_NUL_BYTE); buffer->used = buffer->capacity; return 0; } //remove [' and '] key = SOL_STR_SLICE_STR(slice.data + 2, slice.len - 4); //unescape '\'' if necessary sol_buffer_init_flags(buffer, NULL, 0, SOL_BUFFER_FLAGS_NO_NUL_BYTE); end = key.data + key.len; for (p = key.data; p < end; p = p2 + 1) { p2 = memchr(p, '\'', end - p); if (!p2) break; //Append string preceding ' r = sol_buffer_append_slice(buffer, SOL_STR_SLICE_STR(p, p2 - p - 1)); SOL_INT_CHECK(r, < 0, r); r = sol_buffer_append_char(buffer, '\''); SOL_INT_CHECK(r, < 0, r); } if (!buffer->data) { sol_buffer_init_flags(buffer, (char *)key.data, key.len, SOL_BUFFER_FLAGS_MEMORY_NOT_OWNED | SOL_BUFFER_FLAGS_NO_NUL_BYTE); buffer->used = buffer->capacity; return 0; } //Append the string leftover r = sol_buffer_append_slice(buffer, SOL_STR_SLICE_STR(p, end - p)); SOL_INT_CHECK(r, < 0, r); return 0; }