#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;
}
To embed this program on your website, copy the following code and paste it into your website's HTML: