This commit is contained in:
Loic Deridder
2025-01-24 10:19:26 +01:00
parent 8dabbc426f
commit c92d92dc99
15 changed files with 1088 additions and 0 deletions

View File

@@ -0,0 +1,106 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_print_hex_utils.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lderidde <lderidde@student.s19.be> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/10/30 15:32:29 by lderidde #+# #+# */
/* Updated: 2024/11/05 08:33:09 by lderidde ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_fprintf.h"
static int get_hexsizer(int len, t_flags flags)
{
if (flags.precision <= len && flags.zero == 1)
return (flags.width);
if (flags.precision <= len && flags.zero == 0)
return (len);
if (flags.precision >= len)
{
if (flags.hash == 1)
return (flags.precision + 2);
return (flags.precision);
}
return (len);
}
static int get_hexsizel(int len, t_flags flags)
{
if (flags.precision <= len)
return (len);
if (flags.precision >= len)
{
if (flags.hash == 1)
return (flags.precision + 2);
return (flags.precision);
}
return (len);
}
int get_hexsize(unsigned int nbr, int len, t_flags flags)
{
if (flags.precision == 0 && nbr == 0)
return (0);
if (flags.precision > len)
len = flags.precision;
if (flags.hash == 1 && nbr != 0)
len += 2;
if (flags.precision != -1 && len >= flags.precision)
return (len);
if (len > flags.width && len >= flags.precision)
return (len);
else
{
if (flags.left == 1)
len = get_hexsizel(len, flags);
if (flags.left == 0)
len = get_hexsizer(len, flags);
}
return (len);
}
static void puthexnbr_str(char *str, unsigned long nbr, int *i, char *base)
{
if (nbr > 15)
{
puthexnbr_str(str, nbr / 16, i, base);
puthexnbr_str(str, nbr % 16, i, base);
}
else
{
str[*i] = base[nbr];
*i += 1;
}
}
char *build_hexn(unsigned int nbr, char *hash, t_flags flags, char *base)
{
int i;
int len;
int tmp;
char *strn;
tmp = hex_len(nbr);
len = get_hexsize(nbr, tmp, flags);
strn = malloc(len + 1);
if (!strn)
return (NULL);
strn[len] = '\0';
if (len == 0)
return (strn);
i = 0;
if (flags.hash == 1 && nbr != 0)
hex_hash(strn, hash, &i);
if (flags.hash == 1 && flags.precision < tmp && nbr != 0)
tmp += 2;
if (flags.precision == -1 && flags.zero == 1)
flags.precision = flags.width;
while (flags.precision-- > tmp)
strn[i++] = '0';
puthexnbr_str(strn, nbr, &i, base);
strn[i] = '\0';
return (strn);
}