GCC Code Coverage Report


Directory: ./
File: s21_sprintf_utils.c
Date: 2025-11-01 23:04:41
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 2221 void get_flags(const char **format, FormatSpecifier *fs) {
6 2221 fs->left_justify = 0;
7 2221 fs->show_sign = 0;
8 2221 fs->space_for_positive = 0;
9 2221 fs->zero_padding = 0;
10 2221 fs->alternate_form = 0;
11
2/2
✓ Branch 1 taken 166 times.
✓ Branch 2 taken 2221 times.
2387 while (s21_strchr("-+ #0", **format)) {
12
2/2
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 124 times.
166 if (**format == '-') {
13 42 fs->left_justify = 1;
14
2/2
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 77 times.
124 } else if (**format == '+') {
15 47 fs->show_sign = 1;
16
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 70 times.
77 } else if (**format == ' ') {
17 7 fs->space_for_positive = 1;
18
2/2
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 51 times.
70 } else if (**format == '#') {
19 19 fs->alternate_form = 1;
20
1/2
✓ Branch 0 taken 51 times.
✗ Branch 1 not taken.
51 } else if (**format == '0') {
21 51 fs->zero_padding = 1;
22 }
23 166 (*format)++;
24 }
25 2221 }
26
27 2221 void get_width(const char **format, FormatSpecifier *fs, va_list args) {
28 2221 fs->width = -1;
29
2/2
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 2191 times.
2221 if (**format == '*') {
30 30 fs->width = va_arg(args, int);
31
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 29 times.
30 if (fs->width < 0) {
32 1 fs->width = -1;
33 }
34 30 (*format)++;
35
4/4
✓ Branch 0 taken 2160 times.
✓ Branch 1 taken 31 times.
✓ Branch 2 taken 116 times.
✓ Branch 3 taken 2044 times.
2191 } else if (**format >= '0' && **format <= '9') {
36 116 fs->width = 0;
37
4/4
✓ Branch 0 taken 264 times.
✓ Branch 1 taken 28 times.
✓ Branch 2 taken 176 times.
✓ Branch 3 taken 88 times.
292 while (**format >= '0' && **format <= '9') {
38 176 fs->width = fs->width * 10 + (int)(**format - '0');
39 176 (*format)++;
40 }
41 }
42 2221 }
43
44 2221 void get_precision(const char **format, FormatSpecifier *fs, va_list args) {
45 2221 fs->precision = -1;
46
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2149 times.
2221 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 2221 }
63
64 2221 void get_length(const char **format, FormatSpecifier *fs) {
65
6/6
✓ Branch 0 taken 2211 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2160 times.
✓ Branch 3 taken 51 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 2152 times.
2221 if (**format == 'h' || **format == 'l' || **format == 'L') {
66 69 fs->length = **format;
67 69 (*format)++;
68 } else {
69 2152 fs->length = '\0';
70 }
71 2221 }
72
73 2221 void get_specifier(const char **format, FormatSpecifier *fs) {
74 2221 fs->specifier = **format;
75 2221 (*format)++;
76 2221 }
77
78 1976 long long get_signed_arg(const FormatSpecifier *fs, va_list args) {
79 1976 long long arg = 0;
80
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1968 times.
1976 if (fs->length == 'l') {
81 8 arg = (long long)va_arg(args, long);
82
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1961 times.
1968 } else if (fs->length == 'h') {
83 7 arg = (long long)(short)va_arg(args, int);
84 } else {
85 1961 arg = (long long)va_arg(args, int);
86 }
87 1976 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 2044 void apply_padding_with_zero(char **str, FormatSpecifier *fs, const char *arg) {
103
3/4
✓ Branch 0 taken 41 times.
✓ Branch 1 taken 2003 times.
✓ Branch 2 taken 41 times.
✗ Branch 3 not taken.
2044 if (fs->zero_padding && !fs->left_justify &&
104
4/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 29 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 5 times.
41 (arg[0] == '+' || arg[0] == '-')) {
105 36 *(*str)++ = arg[0];
106 36 fs->width--;
107 36 apply_padding(str, fs, arg + 1);
108 } else {
109 2008 apply_padding(str, fs, arg);
110 }
111 2044 }
112
113 2211 void apply_padding(char **str, const FormatSpecifier *fs, const char *arg) {
114 2211 int len = s21_strlen(arg);
115 2211 int pad_len = fs->width - len;
116 2211 char pad_char = ' ';
117
3/4
✓ Branch 0 taken 51 times.
✓ Branch 1 taken 2160 times.
✓ Branch 2 taken 51 times.
✗ Branch 3 not taken.
2211 if (fs->zero_padding && !fs->left_justify) {
118 51 pad_char = '0';
119 }
120
4/4
✓ Branch 0 taken 2169 times.
✓ Branch 1 taken 42 times.
✓ Branch 2 taken 96 times.
✓ Branch 3 taken 2073 times.
2211 if (!fs->left_justify && pad_len > 0) {
121
2/2
✓ Branch 0 taken 452 times.
✓ Branch 1 taken 96 times.
548 for (int i = 0; i < pad_len; i++) {
122 452 *(*str)++ = pad_char;
123 }
124 }
125 2211 s21_strncpy(*str, arg, len);
126 2211 *str += len;
127
4/4
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 2169 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 5 times.
2211 if (fs->left_justify && pad_len > 0) {
128
2/2
✓ Branch 0 taken 236 times.
✓ Branch 1 taken 37 times.
273 for (int i = 0; i < pad_len; i++) {
129 236 *(*str)++ = pad_char;
130 }
131 }
132 2211 }
133