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 |