SquashStatus squash_file_printf (SquashFile* file, const char* format, ...) { SquashStatus res = SQUASH_OK; va_list ap; int size; char buf[256]; char* heap_buf = NULL; va_start (ap, format); #if defined(_WIN32) size = _vscprintf (format, ap); #else size = vsnprintf (buf, sizeof (buf), format, ap); if (size >= (int) sizeof (buf)) #endif { heap_buf = malloc (size); if (SQUASH_UNLIKELY(heap_buf == NULL)) res = squash_error (SQUASH_MEMORY); const int written = vsnprintf (heap_buf, size, format, ap); if (SQUASH_UNLIKELY(written != size - 1)) res = squash_error (SQUASH_FAILED); } va_end (ap); if (SQUASH_LIKELY(res == SQUASH_OK)) res = squash_file_write (file, size, (uint8_t*) ((heap_buf == NULL) ? buf : heap_buf)); free (heap_buf); return res; }
static #endif SquashStatus squash_file_vwprintf (SquashFile* file, const wchar_t* format, va_list ap) { SquashStatus res = SQUASH_OK; int size; wchar_t* buf = NULL; assert (file != NULL); assert (format != NULL); size = _vscwprintf (format, ap); if (HEDLEY_UNLIKELY(size < 0)) return squash_error (SQUASH_FAILED); buf = calloc (size + 1, sizeof (wchar_t)); if (HEDLEY_UNLIKELY(buf == NULL)) return squash_error (SQUASH_MEMORY); #if !defined(_WIN32) const int written = vswprintf (buf, size + 1, format, ap); #else const int written = _vsnwprintf (buf, size + 1, format, ap); #endif if (HEDLEY_UNLIKELY(written != size)) { res = squash_error (SQUASH_FAILED); } else { size_t data_size; char* data; bool conv_success = squash_charset_convert (&data_size, &data, "UTF-8", size * sizeof(wchar_t), (char*) buf, squash_charset_get_wide ()); if (HEDLEY_LIKELY(conv_success)) res = squash_file_write (file, data_size, (uint8_t*) data); else res = squash_error (SQUASH_FAILED); } squash_free (buf); return res; }
SquashStatus squash_file_vprintf (SquashFile* file, const char* format, va_list ap) { SquashStatus res = SQUASH_OK; int size; char* heap_buf = NULL; assert (file != NULL); assert (format != NULL); #if defined(_WIN32) size = _vscprintf (format, ap); if (HEDLEY_UNLIKELY(size < 0)) return squash_error (SQUASH_FAILED); #else char buf[256]; size = vsnprintf (buf, sizeof (buf), format, ap); if (HEDLEY_UNLIKELY(size < 0)) return squash_error (SQUASH_FAILED); else if (size >= (int) sizeof (buf)) #endif { heap_buf = squash_malloc (size + 1); if (HEDLEY_UNLIKELY(heap_buf == NULL)) return squash_error (SQUASH_MEMORY); const int written = vsnprintf (heap_buf, size + 1, format, ap); if (HEDLEY_UNLIKELY(written != size)) res = squash_error (SQUASH_FAILED); } if (HEDLEY_LIKELY(res == SQUASH_OK)) { res = squash_file_write (file, size, #if !defined(_WIN32) (heap_buf == NULL) ? (uint8_t*) buf : #endif (uint8_t*) heap_buf); } squash_free (heap_buf); return res; }