128 lines
3.0 KiB
C
128 lines
3.0 KiB
C
|
/* ************************************************************************** */
|
||
|
/* */
|
||
|
/* ::: :::::::: */
|
||
|
/* algo.c :+: :+: :+: */
|
||
|
/* +:+ +:+ +:+ */
|
||
|
/* By: ttrave <marvin@42.fr> +#+ +:+ +#+ */
|
||
|
/* +#+#+#+#+#+ +#+ */
|
||
|
/* Created: 2023/07/29 17:23:56 by ttrave #+# #+# */
|
||
|
/* Updated: 2023/07/30 22:35:56 by tomoron ### ########.fr */
|
||
|
/* */
|
||
|
/* ************************************************************************** */
|
||
|
|
||
|
#include "header.h"
|
||
|
|
||
|
void ft_prep_algo(char **dict, char *nbr)
|
||
|
{
|
||
|
t_ulli len;
|
||
|
char **spec_tens;
|
||
|
|
||
|
len = ft_strlen(nbr);
|
||
|
spec_tens = ft_fill_spec_tens(dict);
|
||
|
if (spec_tens == NULL)
|
||
|
{
|
||
|
ft_putstr("Error\n");
|
||
|
return ;
|
||
|
}
|
||
|
ft_nbr_to_letters(dict, nbr, spec_tens, len);
|
||
|
}
|
||
|
|
||
|
void ft_nbr_to_letters(char **dict, char *nbr, char **spec_tens, t_ulli l)
|
||
|
{
|
||
|
t_ulli v;
|
||
|
t_ulli *i;
|
||
|
t_ulli group;
|
||
|
char *last_group_marker;
|
||
|
char *nb;
|
||
|
|
||
|
group = l / 3;
|
||
|
i = &v;
|
||
|
*i = l;
|
||
|
while (*i > 0)
|
||
|
{
|
||
|
if (*i % 3 == 0)
|
||
|
ft_print_hundreds(dict, nbr, i, l);
|
||
|
else if (*i % 3 == 2)
|
||
|
{
|
||
|
nb = ft_cat(nbr[l - *i], nbr[l - *i + 1]);
|
||
|
if (nb == NULL)
|
||
|
return ;
|
||
|
ft_print_tens(dict, spec_tens, nb, i);
|
||
|
}
|
||
|
else if (*i % 3 == 1)
|
||
|
ft_print_units(dict, nbr[l - *i], i);
|
||
|
last_group_marker = ft_print_group_marker(dict, i);
|
||
|
if (last_group_marker == NULL)
|
||
|
{
|
||
|
ft_free_arr_arr(spec_tens);
|
||
|
ft_putstr("Error\n");
|
||
|
return ;
|
||
|
}
|
||
|
if (*i % 3 == 1 && *i > 1)
|
||
|
{
|
||
|
ft_putchar(',');
|
||
|
group--;
|
||
|
}
|
||
|
}
|
||
|
ft_putchar('\n');
|
||
|
free(spec_tens);
|
||
|
}
|
||
|
|
||
|
void ft_print_units(char **dict, char unit, t_ulli *i)
|
||
|
{
|
||
|
ft_print_next(ft_strndup(&unit, 1), dict);
|
||
|
if (*i > 0)
|
||
|
ft_putchar(' ');
|
||
|
(*i)--;
|
||
|
}
|
||
|
|
||
|
void ft_print_hundreds(char **dict, char *nbr, t_ulli *i, t_ulli len)
|
||
|
{
|
||
|
ft_print_next(ft_strndup(&nbr[len - *i], 1), dict);
|
||
|
ft_putchar(' ');
|
||
|
ft_print_next("100", dict);
|
||
|
if (nbr[len - *i + 1] != '0' || nbr[len - *i + 2] != '0')
|
||
|
ft_putstr(" and ");
|
||
|
(*i)--;
|
||
|
}
|
||
|
|
||
|
void ft_print_tens(char **dict, char **spec_tens, char *nb, t_ulli *i)
|
||
|
{
|
||
|
if (ft_is_spec_ten(spec_tens, nb) == 0)
|
||
|
{
|
||
|
ft_print_next(nb, dict);
|
||
|
(*i) -= 2;
|
||
|
if (*i > 2)
|
||
|
ft_putchar(' ');
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ft_print_next(nb, dict);
|
||
|
ft_putchar('-');
|
||
|
(*i)--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
char *ft_print_group_marker(char **dict, t_ulli *len)
|
||
|
{
|
||
|
char *group_marker;
|
||
|
t_ulli i;
|
||
|
|
||
|
i = 1;
|
||
|
if (*len % 3 != 1 || *len < 4)
|
||
|
return ("1");
|
||
|
group_marker = malloc((*len + 1) * sizeof(char));
|
||
|
if (group_marker == NULL)
|
||
|
return (group_marker);
|
||
|
group_marker[*len] = '\0';
|
||
|
group_marker[0] = '1';
|
||
|
while (group_marker[i])
|
||
|
{
|
||
|
group_marker[i] = '0';
|
||
|
i++;
|
||
|
}
|
||
|
ft_print_next(group_marker, dict);
|
||
|
free(group_marker);
|
||
|
return ("1");
|
||
|
}
|