-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathft_printf_scientific_bonus.c
112 lines (105 loc) · 2.82 KB
/
ft_printf_scientific_bonus.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_printf_scientific_bonus.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tmendes- <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/07/18 08:30:10 by tmendes- #+# #+# */
/* Updated: 2020/08/07 08:16:26 by tmendes- ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftprintf_bonus.h"
int nbr_exp(long double nbr, int prec)
{
t_llint nbr_i;
int k;
nbr = ft_ldabs(nbr);
prec++;
if (nbr == 0)
return (0);
else if (nbr >= 1)
return ((ft_nbrdigit(nbr) - 1));
else
{
k = 0;
nbr_i = (t_llint)nbr;
while (nbr_i == 0)
{
k--;
nbr_i = (t_llint)(10 * nbr);
nbr = (10 * nbr) - (long double)nbr_i;
}
return (k);
}
}
static char *p_exp(char *nbr, int prec, t_scntfc sci)
{
sci.itg = 1;
while (*(nbr + sci.itg) != '.')
sci.itg++;
ft_memmove((nbr + sci.itg), (nbr + sci.itg + 1), prec + 2);
sci.chr = *(nbr + prec + 2);
*(nbr + prec + 2) = 0;
if (sci.chr >= '5' && sci.itg > (prec + 2))
nbr = ft_strround(nbr);
if (*nbr == '0')
{
nbr = ft_memmove(nbr, (nbr + 1), prec + 2);
sci.itg--;
}
else
*(nbr + prec + 1) = 0;
ft_memmove((nbr + 2), (nbr + 1), prec + 1);
*(nbr + 1) = '.';
nbr = ft_concat(nbr, "e+");
sci.itg--;
if (sci.itg < 10)
nbr = ft_concat(nbr, "0");
sci.exp = ft_llitoa(sci.itg, 10, 'a');
nbr = ft_concat(nbr, sci.exp);
free(sci.exp);
return (nbr);
}
static char *n_exp(char *nbr, int prec, t_scntfc sci)
{
sci.ptr = ft_strchr(nbr, '.');
sci.itg = 1;
while (*(sci.ptr + sci.itg) == '0')
sci.itg++;
if (*(sci.ptr + sci.itg) == 0)
{
*(nbr + prec + 2) = 0;
nbr = ft_concat(nbr, "e+00");
return (nbr);
}
nbr = ft_memmove(nbr, (sci.ptr + sci.itg), prec + 2);
sci.chr = *(nbr + prec + 1);
*(nbr + prec + 1) = 0;
ft_memmove((nbr + 2), (nbr + 1), prec + 1);
*(nbr + 1) = '.';
nbr = ft_concat(nbr, "e-");
if (sci.itg < 10)
nbr = ft_concat(nbr, "0");
sci.exp = ft_llitoa(sci.itg, 10, 'a');
nbr = ft_concat(nbr, sci.exp);
free(sci.exp);
return (nbr);
}
char *scntfc_not(char *nbr, int prec)
{
t_scntfc sci;
sci = init_scntfc();
if (*nbr == '0')
nbr = n_exp(nbr, prec, sci);
else
{
sci.ptr = nbr;
nbr = ft_strdup("0");
nbr = ft_concat(nbr, sci.ptr);
nbr = p_exp(nbr, prec, sci);
free(sci.ptr);
}
sci = init_scntfc();
return (nbr);
}