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 |