#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int len(char* str);
int white_space(char c);
int check_base(char* base);
long long ten_base(char* nbr, char* base);
int find_char(char ch, char* base_to);
char* tranlate_loop(long long num, char* base_to, int size, char* arr);
char* translate(long long num, char* base_to);
char* ft_convert_base(char* nbr, char* base_from, char* base_to);
int cal_result_len(long long num, char* base_to);

int len(char* str)
{
	int i;

	i = 0;
	while(str[i] != '\0')
		i++;
	return i;
}

int white_space(char c)
{
	if (c == ' ' || (c >= 9 && c <= 13))
		return 1;

	return 0;
}

int check_base(char* base)
{
	int i;
	int j;

	i = 0;
	while (base[i] != '\0')
	{
		if (base[i] == '-' || base[i] == '+' || white_space(base[i]))
			return 1;
		i++;
	}
	i = 0;
	while (base[i])
	{
		j = i + 1;
		while (base[j])
		{
			if (base[i] == base[j])
				return 1;
			j++;
		}
		i++;
	}

	return 0;
}

long long ten_base(char* nbr, char* base)
{
	int sign;
	long long result;

	result = 3000000000;
	sign = 1;
	while (white_space(*nbr))
		nbr++;
	while (*nbr == '+' || *nbr == '-')
	{
		if (*nbr == '-')
			sign *= -1;
		nbr++;
	}
	if (*(nbr + 1) == ' ')
		return result;
	else
		result = 0;
	while (*nbr != '\0')
	{
		result = result * len(base) + find_char(*nbr, base);
		nbr++;
	}
	return sign * result;
}

int find_char(char ch, char *base_to)
{
	int i;

	i = 0;
	while (base_to[i] != '\0')
	{
		if (base_to[i] == ch)
			return i;
		i++;	
	}
	return len(base_to) + 1;
}

char *tranlate_loop(long long num, char* base_to, int size, char *arr)
{
	int i;

	i = 0;
	if (num < 0)
	{
		arr[0] = '-';
		num = -num;
	}
	while (num >= len(base_to))
	{
		if(find_char(num % len(base_to) + '0', base_to) > len(base_to))
			return NULL;
		arr[size - i - 2] = base_to[find_char(num % len(base_to) + '0', base_to)];
		num /= len(base_to);
		i++;
	}
	if (arr[0] == '-')
		arr[1] = base_to[find_char(num % len(base_to) + '0', base_to)];
	else
		arr[0] = base_to[find_char(num % len(base_to) + '0', base_to)];
	arr[size - 1] = '\0';
	return arr;
}

char* translate(long long num, char* base_to)
{
	char* arr;
	int i;
	int base_to_len;
	int size;
	int find_index;

	size = cal_result_len(num, base_to);
	arr = (char*)malloc(sizeof(char) * (size));
	base_to_len = len(base_to);
	find_index = 0;
	arr = tranlate_loop(num, base_to, size, arr);
	return arr;
}

int cal_result_len(long long num, char* base_to)
{
	int i;
	int base_to_len;

	i = 2;
	if (num < 0)
	{
		i = 3;
		num = -num;
	}
	base_to_len = len(base_to);
	while (num >= base_to_len)
	{
		num /= base_to_len;
		i++;
	}
	return i;
}

char* ft_convert_base(char* nbr, char* base_from, char* base_to)
{
	long long int_number;
	int base_to_len;

	int_number = 0;
	base_to_len = 0;
	if (check_base(base_from) || check_base(base_to))
		return NULL;
	int_number = ten_base(nbr, base_from);
	if (int_number < -2147483648 || int_number > 2147483647)
		return NULL;
	
	return translate(int_number, base_to);
}

int main(void)
{
	//char* nbr = "   -+2A";   // -42
	// char *nbr = "   -+-2A";  // 42
	 char *nbr = "-80000000"; //int min
	// char *nbr = "0";
	// char *nbr = "7FFFFFFF";  //int max
	//char *nbr = "   -+  2A"; // not working
	// char *nbr = "B1327E5"; // 16 to bonus 
	char* base_from = "0123456789ABCDEF";
	char* base_to = "01"; //itoa test
	// char *base_to = "0123456789"; //atoi test
	// char *base_to = "lIe ouvy"; // bonus

	printf("%s\n", ft_convert_base(nbr, base_from, base_to));

	return 0;
}

Embed on website

To embed this program on your website, copy the following code and paste it into your website's HTML: