#include "astr.h" #include #include char * astr_alloc_formatted(char const *format, ...) { va_list arguments; va_start(arguments, format); char *s = astr_alloc_formatted_from_va_list(format, arguments); va_end(arguments); return s; } char * astr_alloc_formatted_from_va_list(char const *format, va_list arguments) { if (!format) { errno = EINVAL; return NULL; } char *s; va_list arguments_copy; va_copy(arguments_copy, arguments); int chars_printed = vasprintf(&s, format, arguments_copy); if (chars_printed < 0) return NULL; return s; } size_t astr_formatted_length(char const *format, ...) { va_list arguments; va_start(arguments, format); size_t length = astr_formatted_length_from_va_list(format, arguments); va_end(arguments); return length; } size_t astr_formatted_length_from_va_list(char const *format, va_list arguments) { if (!format) { errno = EINVAL; return 0; } va_list arguments_copy; va_copy(arguments_copy, arguments); int length = vsnprintf(NULL, 0, format, arguments_copy); if (length < 0) return 0; return length; } int astr_realloc_append_formatted(char **s, char const *format, ...) { va_list arguments; va_start(arguments, format); int result = astr_realloc_append_formatted_from_va_list(s, format, arguments); va_end(arguments); return result; } int astr_realloc_append_formatted_from_va_list(char **s, char const *format, va_list arguments) { if (!s || !format) { errno = EINVAL; return -1; } size_t length_to_append = astr_formatted_length_from_va_list(format, arguments); if (!length_to_append) return 0; size_t original_length = *s ? strlen(*s) : 0; size_t new_size = original_length + length_to_append + sizeof('\0'); char *resized_s = realloc(*s, new_size); if (!resized_s) return -1; *s = resized_s; char *end_of_s = *s + original_length; va_list arguments_copy; va_copy(arguments_copy, arguments); vsprintf(end_of_s, format, arguments_copy); return 0; } extern char * astr_alloc_empty(void); extern int astr_cmp(char const *s1, char const *s2); extern bool astr_empty(char const *s); extern bool astr_eq(char const *s1, char const *s2);