| 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 |