#include <unistd.h>
void ft_putchar_nbr(int idx, char *ch_base)
{
while (idx > 0)
{
write(1, &ch_base[idx - 1], 1);
idx--;
}
}
int check_minus_nbr(int nbr, char *base)
{
if (nbr < 0)
{
write(1, "-", 1);
nbr *= -1;
}
else if (nbr == 0)
write(1, base, 1);
return (nbr);
}
int check_base(char *base)
{
int idx;
int target;
idx = 0;
while (base[idx])
{
target = 0;
if (base[idx] == '+' || base[idx] == '-') // +, - 기호 거름
return (0);
else if (!(' ' <= base[idx] && base[idx] <= '~')) // 출력 가능한 경우
return (0);
while (target < idx) // idx가 증가할 때마다 0부터 idx-1까지 중복 탐색
{
if (base[target] == base[idx])
return (0);
target++;
}
idx++;
}
if (idx <= 1)
return (0);
return (1);
}
void ft_putnbr_base(int nbr, char *base)
{
int base_rdx; // 진수 확인용 변수
char ch_base[200]; // nbr을 base를 밑으로 하는 진수 변환 후 담을 문자열
int idx; // 인덱스 체크
if (check_base(base)) // 예외 처리
{
base_rdx = 0;
while (base[base_rdx]) // base_rdx의 크기 = 해당 진수의 크기
base_rdx++;
idx = 0;
if (nbr == -2147483648)
{
ch_base[idx] = base[-(nbr % base_rdx)];
nbr = -(nbr / base_rdx); // -상태에서 나누고 양의 값을 씌움
idx++; // int 타입 범위 제한 때문
}
nbr = check_minus_nbr(nbr, base); // nbr이 음수일 때와 0 처리
while (nbr > 0)
{
ch_base[idx] = base[nbr % base_rdx]; // 나머지를 차례로 넣음
nbr /= base_rdx; // 자릿수로 계속해서 나누어 준다.
idx++;
}
ft_putchar_nbr(idx, ch_base); // 역순으로 모두 출력
}
}