* @param fmt printf-style format string
* @param ap Arguments to be formatted
* @retval num Characters written
+ * @retval 0 Error
*/
static int buffer_printf(struct Buffer *buf, const char *fmt, va_list ap)
{
- if (!buf)
- return 0;
+ if (!buf || !fmt)
+ return 0; /* LCOV_EXCL_LINE */
- va_list ap_retry;
- int len, blen, doff;
+ if (!buf->data || !buf->dptr || (buf->dsize < 128))
+ mutt_buffer_increase_size(buf, 128);
- va_copy(ap_retry, ap);
+ int doff = buf->dptr - buf->data;
+ int blen = buf->dsize - doff;
- if (!buf->dptr)
- buf->dptr = buf->data;
+ va_list ap_retry;
+ va_copy(ap_retry, ap);
- doff = buf->dptr - buf->data;
- blen = buf->dsize - doff;
- /* solaris 9 vsnprintf barfs when blen is 0 */
- if (blen == 0)
- {
- blen = 128;
- mutt_buffer_increase_size(buf, buf->dsize + blen);
- }
- len = vsnprintf(buf->dptr, blen, fmt, ap);
+ int len = vsnprintf(buf->dptr, blen, fmt, ap);
if (len >= blen)
{
blen = ++len - blen;
* @param fmt printf-style format string
* @param ... Arguments to be formatted
* @retval num Characters written
+ * @retval -1 Error
*/
int mutt_buffer_printf(struct Buffer *buf, const char *fmt, ...)
{
struct Buffer buf = { 0 };
TEST_CHECK(mutt_buffer_printf(&buf, NULL) != 0);
}
+
+ TEST_CASE("printf to an empty Buffer");
+
+ {
+ TEST_CASE("Empty");
+ struct Buffer *buf = mutt_buffer_new();
+ TEST_CHECK(mutt_buffer_printf(buf, "") == 0);
+ TEST_CHECK(strlen(mutt_b2s(buf)) == 0);
+ mutt_buffer_free(&buf);
+ }
+
+ {
+ TEST_CASE("Static");
+ const char *str = "apple";
+ struct Buffer *buf = mutt_buffer_new();
+ TEST_CHECK(mutt_buffer_printf(buf, str) == 5);
+ TEST_CHECK(strcmp(mutt_b2s(buf), str) == 0);
+ mutt_buffer_free(&buf);
+ }
+
+ {
+ TEST_CASE("Varargs");
+ const char *str = "apple";
+ const char *result = "app 1234567 3.1416";
+ struct Buffer *buf = mutt_buffer_new();
+ TEST_CHECK(mutt_buffer_printf(buf, "%.3s %ld %3.4f", str, 1234567, 3.141592654) == 18);
+ TEST_CHECK(strcmp(mutt_b2s(buf), result) == 0);
+ mutt_buffer_free(&buf);
+ }
+
+ TEST_CASE("printf to a non-empty Buffer");
+
+ {
+ TEST_CASE("Empty");
+ const char *str = "test";
+ struct Buffer *buf = mutt_buffer_from(str);
+ TEST_CHECK(mutt_buffer_printf(buf, "") == 0);
+ TEST_CHECK(strcmp(mutt_b2s(buf), "") == 0);
+ mutt_buffer_free(&buf);
+ }
+
+ {
+ TEST_CASE("Static");
+ const char *str = "apple";
+ struct Buffer *buf = mutt_buffer_from("test");
+ TEST_CHECK(mutt_buffer_printf(buf, str) == 5);
+ TEST_CHECK(strcmp(mutt_b2s(buf), str) == 0);
+ mutt_buffer_free(&buf);
+ }
+
+ {
+ TEST_CASE("Static big");
+ const char *str =
+ "apple banana cherry damson elderberry fig guava hawthorn ilama "
+ "jackfruit kumquat lemon mango nectarine olive papaya quince raspberry "
+ "strawberry tangerine ugli vanilla wolfberry xigua yew ziziphus";
+ struct Buffer *buf = mutt_buffer_from("test");
+ TEST_CHECK(mutt_buffer_printf(buf, str) == 195);
+ TEST_CHECK(strcmp(mutt_b2s(buf), str) == 0);
+ mutt_buffer_free(&buf);
+ }
+
+ {
+ TEST_CASE("Varargs");
+ const char *str = "apple";
+ const char *result = "app 1234567 3.1416";
+ struct Buffer *buf = mutt_buffer_from("test");
+ TEST_CHECK(mutt_buffer_printf(buf, "%.3s %ld %3.4f", str, 1234567, 3.141592654) == 18);
+ TEST_CHECK(strcmp(mutt_b2s(buf), result) == 0);
+ mutt_buffer_free(&buf);
+ }
}