1 /*
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright © 2024, Synopsys Inc.
5 * Copyright © 2024, Solid Sands B.V.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above
15 *    copyright notice, this list of conditions and the following
16 *    disclaimer in the documentation and/or other materials provided
17 *    with the distribution.
18 *
19 * 3. Neither the name of the copyright holder nor the names of its
20 *    contributors may be used to endorse or promote products derived
21 *    from this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
34 * OF THE POSSIBILITY OF SUCH DAMAGE.
35 */
36 
37 #include <stdio.h>
38 #include <string.h>
39 
40 #define EXPECTED "123456789\n"
41 
main(void)42 int main(void) {
43 
44 #if defined(__PICOLIBC__) && defined(TINY_STDIO) && !defined(_PRINTF_PERCENT_N)
45     printf("printf: %%n unsupported\n");
46     return 77;
47 #else
48     int res;
49     char result[128];
50     int a, b, c, d;
51 
52     /* res should be equal to 10:
53     * "" reaching the 1st '%n' ---------------- counting 0 -> a
54     * "12345" between the 1st and 2nd '%n' ---- counting 5 -> b
55     * "6789" between the 2nd and 3rd '%n'  ---- counting 9 -> c
56     * "\n" between the 3rd and 4th '%n' ------- counting 10 -> d */
57 
58     res = snprintf(result, sizeof(result),
59                    "%n12345%n6789%n\n%n", &a, &b, &c, &d);
60 
61     if(res != 10 || a != 0 || b != 5 || c != 9 || d != 10) {
62         printf("Test Failed: Failed to count characters correctly\n");
63         return 1;
64     }
65 
66     if (strcmp(result, EXPECTED) != 0) {
67         printf("Test failed: Incorrect result got \"%s\" != expected \"%s\"\n",
68                result, EXPECTED);
69         return 1;
70     }
71 
72     printf("Test Passed: Characters' count is correct\n");
73 
74     return 0;
75 #endif
76 }
77