1a8e1175bSopenharmony_ci/* BEGIN_HEADER */
2a8e1175bSopenharmony_ci
3a8e1175bSopenharmony_ci/* The printf test functions take a format argument from the test data
4a8e1175bSopenharmony_ci * for several reasons:
5a8e1175bSopenharmony_ci * - For some tests, it makes sense to vary the format.
6a8e1175bSopenharmony_ci * - For all tests, it means we're testing the actual printf function
7a8e1175bSopenharmony_ci *   that parses the format at runtime, and not a compiler optimization.
8a8e1175bSopenharmony_ci *   (It may be useful to add tests that allow compiler optimizations.
9a8e1175bSopenharmony_ci *   There aren't any yet at the time of writing.)
10a8e1175bSopenharmony_ci */
11a8e1175bSopenharmony_ci
12a8e1175bSopenharmony_ci#include "mbedtls/platform.h"
13a8e1175bSopenharmony_ci
14a8e1175bSopenharmony_ci#include <stdio.h>
15a8e1175bSopenharmony_ci#include <stdlib.h>
16a8e1175bSopenharmony_ci#include <string.h>
17a8e1175bSopenharmony_ci
18a8e1175bSopenharmony_ci#define NEWLINE_CHAR '\n'
19a8e1175bSopenharmony_ci#define SPACE_CHAR ' '
20a8e1175bSopenharmony_ci#define DOUBLE_QUOTE_CHAR '"'
21a8e1175bSopenharmony_ci#define COLON_CHAR ':'
22a8e1175bSopenharmony_ci#define QUESTION_CHAR '?'
23a8e1175bSopenharmony_ci#define BACKSLASH_CHAR '\\'
24a8e1175bSopenharmony_ci#define LOWERCASE_N_CHAR 'n'
25a8e1175bSopenharmony_ci/* END_HEADER */
26a8e1175bSopenharmony_ci
27a8e1175bSopenharmony_ci/* BEGIN_CASE */
28a8e1175bSopenharmony_civoid printf_int(char *format, /* any format expecting one int argument, e.g. "%d" */
29a8e1175bSopenharmony_ci                int x, char *result)
30a8e1175bSopenharmony_ci{
31a8e1175bSopenharmony_ci    char *output = NULL;
32a8e1175bSopenharmony_ci    const size_t n = strlen(result);
33a8e1175bSopenharmony_ci
34a8e1175bSopenharmony_ci    /* Nominal case: buffer just large enough */
35a8e1175bSopenharmony_ci    TEST_CALLOC(output, n + 1);
36a8e1175bSopenharmony_ci    TEST_EQUAL(n, mbedtls_snprintf(output, n + 1, format, x));
37a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(result, n + 1, output, n + 1);
38a8e1175bSopenharmony_ci    mbedtls_free(output);
39a8e1175bSopenharmony_ci    output = NULL;
40a8e1175bSopenharmony_ci
41a8e1175bSopenharmony_ciexit:
42a8e1175bSopenharmony_ci    mbedtls_free(output);
43a8e1175bSopenharmony_ci}
44a8e1175bSopenharmony_ci/* END_CASE */
45a8e1175bSopenharmony_ci
46a8e1175bSopenharmony_ci/* BEGIN_CASE */
47a8e1175bSopenharmony_civoid printf_long_max(const char *format, /* "%lx" or longer type */
48a8e1175bSopenharmony_ci                     long value)
49a8e1175bSopenharmony_ci{
50a8e1175bSopenharmony_ci    char *expected = NULL;
51a8e1175bSopenharmony_ci    char *output = NULL;
52a8e1175bSopenharmony_ci    /* 2 hex digits per byte */
53a8e1175bSopenharmony_ci    const size_t n = sizeof(value) * 2;
54a8e1175bSopenharmony_ci
55a8e1175bSopenharmony_ci    /* We assume that long has no padding bits! */
56a8e1175bSopenharmony_ci    TEST_CALLOC(expected, n + 1);
57a8e1175bSopenharmony_ci    expected[0] = '7';
58a8e1175bSopenharmony_ci    memset(expected + 1, 'f', sizeof(value) * 2 - 1);
59a8e1175bSopenharmony_ci
60a8e1175bSopenharmony_ci    TEST_CALLOC(output, n + 1);
61a8e1175bSopenharmony_ci    TEST_EQUAL(n, mbedtls_snprintf(output, n + 1, format, value));
62a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(expected, n + 1, output, n + 1);
63a8e1175bSopenharmony_ci    mbedtls_free(output);
64a8e1175bSopenharmony_ci    output = NULL;
65a8e1175bSopenharmony_ci
66a8e1175bSopenharmony_ciexit:
67a8e1175bSopenharmony_ci    mbedtls_free(output);
68a8e1175bSopenharmony_ci    mbedtls_free(expected);
69a8e1175bSopenharmony_ci}
70a8e1175bSopenharmony_ci/* END_CASE */
71a8e1175bSopenharmony_ci
72a8e1175bSopenharmony_ci/* BEGIN_CASE */
73a8e1175bSopenharmony_civoid printf_char2(char *format, /* "%c%c" */
74a8e1175bSopenharmony_ci                  int arg1, int arg2, char *result)
75a8e1175bSopenharmony_ci{
76a8e1175bSopenharmony_ci    char *output = NULL;
77a8e1175bSopenharmony_ci    const size_t n = strlen(result);
78a8e1175bSopenharmony_ci
79a8e1175bSopenharmony_ci    /* Nominal case: buffer just large enough */
80a8e1175bSopenharmony_ci    TEST_CALLOC(output, n + 1);
81a8e1175bSopenharmony_ci    TEST_EQUAL(n, mbedtls_snprintf(output, n + 1, format, arg1, arg2));
82a8e1175bSopenharmony_ci    TEST_MEMORY_COMPARE(result, n + 1, output, n + 1);
83a8e1175bSopenharmony_ci    mbedtls_free(output);
84a8e1175bSopenharmony_ci    output = NULL;
85a8e1175bSopenharmony_ci
86a8e1175bSopenharmony_ciexit:
87a8e1175bSopenharmony_ci    mbedtls_free(output);
88a8e1175bSopenharmony_ci}
89a8e1175bSopenharmony_ci/* END_CASE */
90