42_minishell/libtf/src/str2.c
2024-04-23 14:55:47 +02:00

89 lines
2.4 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* str2.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/01/30 15:19:37 by mcolonna #+# #+# */
/* Updated: 2024/02/15 11:12:22 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
#include "libtf.h"
unsigned int str_touint(t_err err, t_const_string str)
{
t_stream stream;
unsigned int r;
streamstr_init(&stream, str);
r = stream_readuint(&err_remember, &stream);
if (err_get() || stream_read(&stream))
return ((*err)("bad value"), 0);
return (r);
}
int str_toint(t_err err, t_const_string str)
{
t_stream stream;
int r;
streamstr_init(&stream, str);
r = stream_readint(&err_remember, &stream);
if (err_get() || stream_read(&stream))
return ((*err)("bad value"), -1);
return (r);
}
t_string str_join(t_err *err, t_memclass mc, t_const_string str1,
t_const_string str2)
{
const size_t len1 = str_len(str1);
const size_t len2 = str_len(str2);
t_string r;
r = mem_alloc(err, mc, sizeof(char) * (len1 + len2 + 1));
if (!r)
return (NULL);
data_cpy(r, str1, len1);
data_cpy(r + len1, str2, len2);
r[len1 + len2] = '\0';
return (r);
}
t_string str_uinttostr(t_err *err, t_memclass mc, unsigned int n)
{
const t_const_string digits[] = {
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
t_string r;
t_string tmp;
if (n == 0)
return (str_dup(err, mc, "0"));
r = str_dup(err, mc, digits[n % 10]);
n /= 10;
while (n > 0)
{
tmp = r;
r = str_join(err, mc, digits[n % 10], r);
mem_free(tmp);
n /= 10;
}
return (r);
}
t_string str_inttostr(t_err *err, t_memclass mc, int n)
{
t_string r;
if (n >= 0)
return (str_uinttostr(err, mc, n));
else
{
r = str_uinttostr(err, mc, -n);
if (!r)
return (NULL);
return (str_join(err, mc, "-", r));
}
}