SOL_API const char * sol_network_link_addr_to_str(const struct sol_network_link_addr *addr, struct sol_buffer *buf) { #if MODULE_GNRC_IPV6_NETIF const char *r; SOL_NULL_CHECK(addr, NULL); SOL_NULL_CHECK(buf, NULL); if (addr->family != SOL_NETWORK_FAMILY_INET6) return NULL; if (buf->capacity - buf->used < IPV6_ADDR_MAX_STR_LEN) { int err; err = sol_buffer_expand(buf, IPV6_ADDR_MAX_STR_LEN); SOL_INT_CHECK(err, < 0, NULL); }
SOL_API char * sol_util_strerror(int errnum, struct sol_buffer *buf) { char *ret; int err; SOL_NULL_CHECK(buf, NULL); #define CHUNK_SIZE (512) #ifdef HAVE_XSI_STRERROR_R /* XSI-compliant strerror_r returns int */ while (1) { errno = 0; ret = sol_buffer_at_end(buf); err = strerror_r(errnum, ret, buf->capacity - buf->used); if (err == ERANGE || (err < 0 && errno == ERANGE)) { err = sol_buffer_expand(buf, CHUNK_SIZE); SOL_INT_CHECK(err, < 0, NULL); } else if (err != 0)
SOL_API char * sol_json_escape_string(const char *str, struct sol_buffer *buf) { char *out, *r_str; size_t i, escaped_len; int r; SOL_NULL_CHECK(str, NULL); SOL_NULL_CHECK(buf, NULL); escaped_len = sol_json_calculate_escaped_string_len(str); r = sol_buffer_expand(buf, escaped_len); SOL_INT_CHECK(r, < 0, NULL); r_str = out = sol_buffer_at_end(buf); for (i = 0; *str && i < escaped_len; str++, i++) { if (memchr(sol_json_escapable_chars, *str, sizeof(sol_json_escapable_chars))) { *out++ = '\\'; switch (*str) { case '"': *out++ = '"'; break; case '\\': *out++ = '\\'; break; case '/': *out++ = '/'; break; case '\b': *out++ = 'b'; break; case '\f': *out++ = 'f'; break; case '\n': *out++ = 'n'; break; case '\r': *out++ = 'r'; break; case '\t': *out++ = 't'; break; } } else { *out++ = *str; } } *out++ = '\0'; buf->used += escaped_len - 1; return r_str; }