GCC Code Coverage Report


Directory: ./
File: s21_sprintf_utils.c
Date: 2025-07-13 17:59:14
Exec Total Coverage
Lines: 94 95 98.9%
Branches: 67 72 93.1%

Line Branch Exec Source
1 #include <stdlib.h>
2
3 #include "s21_sprintf.h"
4
5 2213 void get_flags(const char **format, FormatSpecifier *fs) {
6 2213 fs->left_justify = 0;
7 2213 fs->show_sign = 0;
8 2213 fs->space_for_positive = 0;
9 2213 fs->zero_padding = 0;
10 2213 fs->alternate_form = 0;
11
2/2
✓ Branch 1 taken 161 times.
✓ Branch 2 taken 2213 times.
2374 while (s21_strchr("-+ #0", **format)) {
12
2/2
✓ Branch 0 taken 41 times.
✓ Branch 1 taken 120 times.
161 if (**format == '-') {
13 41 fs->left_justify = 1;
14
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 75 times.
120 } else if (**format == '+') {
15 45 fs->show_sign = 1;
16
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 69 times.
75 } else if (**format == ' ') {
17 6 fs->space_for_positive = 1;
18
2/2
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 50 times.
69 } else if (**format == '#') {
19 19 fs->alternate_form = 1;
20
1/2
✓ Branch 0 taken 50 times.
✗ Branch 1 not taken.
50 } else if (**format == '0') {
21 50 fs->zero_padding = 1;
22 }
23 161 (*format)++;
24 }
25 2213 }
26
27 2213 void get_width(const char **format, FormatSpecifier *fs, va_list args) {
28 2213 fs->width = -1;
29
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 2185 times.
2213 if (**format == '*') {
30 28 fs->width = va_arg(args, int);
31
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 27 times.
28 if (fs->width < 0) {
32 1 fs->width = -1;
33 }
34 28 (*format)++;
35
4/4
✓ Branch 0 taken 2154 times.
✓ Branch 1 taken 31 times.
✓ Branch 2 taken 114 times.
✓ Branch 3 taken 2040 times.
2185 } else if (**format >= '0' && **format <= '9') {
36 114 fs->width = 0;
37
4/4
✓ Branch 0 taken 258 times.
✓ Branch 1 taken 28 times.
✓ Branch 2 taken 172 times.
✓ Branch 3 taken 86 times.
286 while (**format >= '0' && **format <= '9') {
38 172 fs->width = fs->width * 10 + (int)(**format - '0');
39 172 (*format)++;
40 }
41 }
42 2213 }
43
44 2213 void get_precision(const char **format, FormatSpecifier *fs, va_list args) {
45 2213 fs->precision = -1;
46
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2141 times.
2213 if (**format == '.') {
47 72 (*format)++;
48
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 50 times.
72 if (**format == '*') {
49 22 fs->precision = va_arg(args, int);
50
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 21 times.
22 if (fs->precision < 0) {
51 1 fs->precision = -1;
52 }
53 22 (*format)++;
54 } else {
55 50 fs->precision = 0;
56
3/4
✓ Branch 0 taken 110 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 60 times.
✓ Branch 3 taken 50 times.
110 while (**format >= '0' && **format <= '9') {
57 60 fs->precision = fs->precision * 10 + (int)(**format - '0');
58 60 (*format)++;
59 }
60 }
61 }
62 2213 }
63
64 2213 void get_length(const char **format, FormatSpecifier *fs) {
65
6/6
✓ Branch 0 taken 2204 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 2153 times.
✓ Branch 3 taken 51 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 2145 times.
2213 if (**format == 'h' || **format == 'l' || **format == 'L') {
66 68 fs->length = **format;
67 68 (*format)++;
68 } else {
69 2145 fs->length = '\0';
70 }
71 2213 }
72
73 2213 void get_specifier(const char **format, FormatSpecifier *fs) {
74 2213 fs->specifier = **format;
75 2213 (*format)++;
76 2213 }
77
78 1972 long long get_signed_arg(const FormatSpecifier *fs, va_list args) {
79 1972 long long arg = 0;
80
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1964 times.
1972 if (fs->length == 'l') {
81 8 arg = (long long)va_arg(args, long);
82
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 1958 times.
1964 } else if (fs->length == 'h') {
83 6 arg = (long long)(short)va_arg(args, int);
84 } else {
85 1958 arg = (long long)va_arg(args, int);
86 }
87 1972 return arg;
88 }
89
90 36 unsigned long get_unsigned_arg(const FormatSpecifier *fs, va_list args) {
91 36 unsigned long arg = 0;
92
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 21 times.
36 if (fs->length == 'l') {
93 15 arg = (unsigned long)va_arg(args, unsigned long);
94
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
21 } else if (fs->length == 'h') {
95 arg = (unsigned long)(unsigned short)va_arg(args, unsigned int);
96 } else {
97 21 arg = (unsigned long)va_arg(args, unsigned int);
98 }
99 36 return arg;
100 }
101
102 2040 void apply_padding_with_zero(char **str, FormatSpecifier *fs, const char *arg) {
103
3/4
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 2000 times.
✓ Branch 2 taken 40 times.
✗ Branch 3 not taken.
2040 if (fs->zero_padding && !fs->left_justify &&
104
4/4
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 29 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 4 times.
40 (arg[0] == '+' || arg[0] == '-')) {
105 36 *(*str)++ = arg[0];
106 36 fs->width--;
107 36 apply_padding(str, fs, arg + 1);
108 } else {
109 2004 apply_padding(str, fs, arg);
110 }
111 2040 }
112
113 2205 void apply_padding(char **str, const FormatSpecifier *fs, const char *arg) {
114 2205 int len = s21_strlen(arg);
115 2205 int pad_len = fs->width - len;
116 2205 char pad_char = ' ';
117
3/4
✓ Branch 0 taken 50 times.
✓ Branch 1 taken 2155 times.
✓ Branch 2 taken 50 times.
✗ Branch 3 not taken.
2205 if (fs->zero_padding && !fs->left_justify) {
118 50 pad_char = '0';
119 }
120
4/4
✓ Branch 0 taken 2164 times.
✓ Branch 1 taken 41 times.
✓ Branch 2 taken 93 times.
✓ Branch 3 taken 2071 times.
2205 if (!fs->left_justify && pad_len > 0) {
121
2/2
✓ Branch 0 taken 439 times.
✓ Branch 1 taken 93 times.
532 for (int i = 0; i < pad_len; i++) {
122 439 *(*str)++ = pad_char;
123 }
124 }
125 2205 s21_strncpy(*str, arg, len);
126 2205 *str += len;
127
4/4
✓ Branch 0 taken 41 times.
✓ Branch 1 taken 2164 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 5 times.
2205 if (fs->left_justify && pad_len > 0) {
128
2/2
✓ Branch 0 taken 226 times.
✓ Branch 1 taken 36 times.
262 for (int i = 0; i < pad_len; i++) {
129 226 *(*str)++ = pad_char;
130 }
131 }
132 2205 }
133