/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* algo.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: ttrave +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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"); }