GCC Code Coverage Report


Directory: ./
File: s21_sscanf_converters.c
Date: 2025-07-13 17:59:14
Exec Total Coverage
Lines: 107 107 100.0%
Branches: 112 112 100.0%

Line Branch Exec Source
1 #include "s21_sscanf.h"
2
3 42 const char *strToLongLong(const char *start, s21_size_t n, int base,
4 long long *toAssign) {
5 42 const char *p = start;
6 42 s21_size_t max = n;
7 42 int check = 1;
8
4/4
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 17 times.
42 if (*p == '-' || *p == '+') {
9 25 p++;
10 25 max--;
11 }
12
13
10/10
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 28 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 8 times.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 7 times.
✓ Branch 9 taken 1 times.
50 if (base == S21_BASE_16 && (n == 0 || max > 2) && p[0] == '0' &&
14 8 s21_strchr("xX", p[1])) {
15 7 p += 2;
16 7 max -= 2;
17 }
18
19 int num;
20 42 long long result = 0;
21
6/6
✓ Branch 1 taken 130 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 104 times.
✓ Branch 4 taken 26 times.
✓ Branch 5 taken 21 times.
✓ Branch 6 taken 5 times.
167 while ((num = getHexadecimalNum(*p)) < base && (n == 0 || max > 0)) {
22 125 result = result * base + num;
23 125 p++;
24 125 max--;
25 }
26
27
6/6
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 35 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 3 times.
42 if (start + 1 == p && (*start == '+' || *start == '-')) {
28 4 check = 0;
29 }
30
31
2/2
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 4 times.
42 if (check) {
32
2/2
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 25 times.
38 if (*start == '-') {
33 13 result *= -1;
34 }
35 38 *toAssign = result;
36 } else {
37 4 p = start;
38 }
39
40 42 return p;
41 }
42
43 167 int getHexadecimalNum(char c) {
44 167 int num = 100000;
45
46
4/4
✓ Branch 0 taken 142 times.
✓ Branch 1 taken 25 times.
✓ Branch 2 taken 116 times.
✓ Branch 3 taken 26 times.
167 if (c >= '0' && c <= '9') {
47 116 num = c - '0';
48
4/4
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 37 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 4 times.
51 } else if (c >= 'a' && c <= 'f') {
49 10 num = 10 + c - 'a';
50
4/4
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 25 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 6 times.
41 } else if (c >= 'A' && c <= 'F') {
51 10 num = 10 + c - 'A';
52 }
53
54 167 return num;
55 }
56
57 34 const char *strToLongDouble(const char *start, s21_size_t n,
58 long double *toAssign) {
59 34 const char *p = start;
60 34 s21_size_t max = n;
61 34 int check = 1;
62
4/4
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 25 times.
34 if (*p == '-' || *p == '+') {
63 9 p++;
64 9 max--;
65 }
66
67 34 int pow10 = 0;
68 34 long double result = convertToLongDouble(n, &max, &pow10, &p, &check);
69
70
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 12 times.
34 if (check) {
71
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 16 times.
22 if (*start == '-') {
72 6 result *= -1;
73 }
74
2/2
✓ Branch 0 taken 69 times.
✓ Branch 1 taken 22 times.
91 for (int i = pow10; i >= 1; i--) {
75 69 result *= 10.0l;
76 }
77 22 *toAssign = result;
78 } else {
79 12 p = start;
80 }
81
82 34 return p;
83 }
84
85 34 long double convertToLongDouble(s21_size_t n, s21_size_t *max, int *pow10,
86 const char **p, int *check) {
87 34 int dot = 0;
88 34 int e = 0;
89 34 s21_size_t countBeforeDot = 0;
90 34 long double fraction = 0.1l;
91
92 int num;
93 34 long double result = 0;
94
6/6
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 141 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 97 times.
✓ Branch 5 taken 56 times.
309 while ((n == 0 || *max > 0) &&
95
6/6
✓ Branch 1 taken 22 times.
✓ Branch 2 taken 34 times.
✓ Branch 3 taken 20 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 30 times.
209 ((num = getFloatNum(**p)) <= 9 || (num == S21_DOT_NUM && !dot) ||
96
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
6 (num == S21_E_NUM && !e))) {
97
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 102 times.
122 if (num == S21_DOT_NUM) {
98 20 dot = 1;
99
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 97 times.
102 } else if (num == S21_E_NUM) {
100 5 e = 1;
101 } else {
102
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 73 times.
97 if (!dot) {
103 24 result = result * 10.0l + (long double)num;
104 24 countBeforeDot++;
105
2/2
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 7 times.
73 } else if (!e) {
106 66 result = result + fraction * num;
107 66 fraction *= 0.1;
108 } else {
109 7 *pow10 = *pow10 * 10 + num;
110 }
111 }
112
113 122 (*p)++;
114 122 (*max)--;
115 }
116
117
4/4
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 17 times.
✓ Branch 3 taken 2 times.
34 if (countBeforeDot == 0 && fraction == 0.1l) {
118
8/8
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 13 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 9 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
17 if (!dot && !e && (n == 0 || *max >= 3)) {
119 11 processNanAndInf(&result, p, check);
120 } else {
121 6 *check = 0;
122 }
123 }
124
125 34 return result;
126 }
127
128 11 void processNanAndInf(long double *result, const char **p, int *check) {
129
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 8 times.
11 if (isInf(*p)) {
130 3 *result = 1.0l / 0.0l;
131 3 (*p) += 3;
132
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 6 times.
8 } else if (isNan(*p)) {
133 2 *result = S21_NAN;
134 2 (*p) += 3;
135 } else {
136 6 *check = 0;
137 }
138 11 }
139
140 153 int getFloatNum(char c) {
141 153 int num = 10000;
142
4/4
✓ Branch 0 taken 116 times.
✓ Branch 1 taken 37 times.
✓ Branch 2 taken 97 times.
✓ Branch 3 taken 19 times.
153 if (c >= '0' && c <= '9') {
143 97 num = c - '0';
144
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 34 times.
56 } else if (c == '.') {
145 22 num = S21_DOT_NUM;
146
4/4
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 28 times.
34 } else if (c == 'E' || c == 'e') {
147 6 num = S21_E_NUM;
148 }
149
150 153 return num;
151 }
152
153 11 int isInf(const char *p) {
154 11 int check = 0;
155
156
6/6
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 2 times.
16 if (s21_strchr("iI", p[0]) && s21_strchr("nN", p[1]) &&
157 5 s21_strchr("fF", p[2])) {
158 3 check = 1;
159 }
160
161 11 return check;
162 }
163
164 8 int isNan(const char *p) {
165 8 int check = 0;
166
167
6/6
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 1 times.
11 if (s21_strchr("Nn", p[0]) && s21_strchr("aA", p[1]) &&
168 3 s21_strchr("Nn", p[2])) {
169 2 check = 1;
170 }
171
172 8 return check;
173 }
174