commit b3ca9337a2751f296b2e705db3ac13b26565cc9a Author: trmartinek Date: Sat Dec 4 09:45:01 2021 +0100 commit initial, une fuite memoire detectee diff --git a/convert.c b/convert.c new file mode 100755 index 0000000..2fadb55 --- /dev/null +++ b/convert.c @@ -0,0 +1,34 @@ +#include +#include +#include +#include "convert_base.h" + +int main(void) +{ + char *nbr; + char *base_from; + char *base_to; + + nbr = (char *)malloc(33 * sizeof(char)); + base_from = (char *)malloc(50 * sizeof(char)); + base_to = (char *)malloc(50 * sizeof(char)); + if(!nbr || !base_from || !base_to) + { + write(2, "Erreur memoire, abandon", 24); + return 1; + } + printf("Rentrez votre nombre\n"); + scanf("%32s", nbr); + fflush(stdin); + printf("Rentrez la base d'entrée de votre nombre\n"); + scanf("%49s", base_from); + fflush(stdin); + printf("Rentrez la base de sortie désirée\n"); + scanf("%49s", base_to); + fflush(stdin); + puts(convert_base(nbr, base_from, base_to)); + free(nbr); + free(base_from); + free(base_to); + return 0; +} diff --git a/convert_base.c b/convert_base.c new file mode 100755 index 0000000..aacc536 --- /dev/null +++ b/convert_base.c @@ -0,0 +1,89 @@ +#include +#include "convert_base.h" + +long decode(char *nbr, char *base_from) +{ + int i; + long result; + + i = 0; + result = 0; + while (nbr[i] == 32 || (nbr[i] >= 9 && nbr[i] <= 13) + || nbr[i] == 43 || nbr[i] == 45) + i++; + while (nbr[i] != '\0' && is_base(nbr[i], base_from)) + { + result = (result * check(base_from)) + unchar(nbr[i], base_from); + i++; + } + if (nbr [i] != '\0' && !is_base(nbr[i], base_from)) + abort(); + return (result); +} + +void convert(long medium, char *base_to, + char *unestring, int *p_i) +{ + long l_base; + + l_base = check(base_to); + if (medium >= 0 && medium < l_base) + { + unestring[*p_i] = base_to[medium]; + *p_i = *p_i + 1; + } + if (medium >= l_base) + { + convert(medium / l_base, base_to, unestring, p_i); + convert(medium % l_base, base_to, unestring, p_i); + } + unestring[*p_i] = '\0'; +} + +char *jonemar(char *cepafini, char *celafin, int i) +{ + int j; + + j = 0; + while (cepafini[j]) + { + celafin[i] = cepafini[j]; + i++; + j++; + } + celafin[i] = '\0'; + return (celafin); +} + +char *recode(long medium, char *base_to, int posi) +{ + char cepafini[50]; + char *celafin; + int i; + int *p_i; + + i = 0; + p_i = &i; + convert(medium, base_to, cepafini, p_i); + if (posi < 0) + celafin = (char *)malloc(sizeof(char) * (*p_i + 3)); + else + celafin = (char *)malloc(sizeof(char) * (*p_i + 2)); + if (!(celafin)) + return (0); + if (posi < 0 && medium != 0) + { + i = 1; + celafin[0] = '-'; + } + else + i = 0; + return (jonemar(cepafini, celafin, i)); +} + +char *convert_base(char *nbr, char *base_from, char *base_to) +{ + if (!(check(base_from)) || !(check(base_to))) + return (NULL); + return (recode(decode(nbr, base_from), base_to, start(nbr))); +} diff --git a/convert_base.h b/convert_base.h new file mode 100755 index 0000000..5d46f8d --- /dev/null +++ b/convert_base.h @@ -0,0 +1,9 @@ +long decode(char *nbr, char *base_from); +void convert(long medium, char *base_to, char *unestring, int *p_i); +char *jonemar(char *cepafini, char *celafin, int i); +char *recode(long medium, char *base_to, int posi); +char *convert_base(char *nbr, char *base_from, char *base_to); +int check(char *base); +int is_base(char k, char *base); +int unchar(char k, char *base); +int start(char *str); diff --git a/convert_base2.c b/convert_base2.c new file mode 100755 index 0000000..01b5d97 --- /dev/null +++ b/convert_base2.c @@ -0,0 +1,69 @@ +int check(char *base) +{ + int i; + int j; + + i = 0; + while (base[i] != '\0') + { + j = i + 1; + while (base[j] != '\0') + { + if (base[j] == base[i]) + return (0); + j++; + } + if (base[i] == 43 || base[i] == 45) + return (0); + i++; + } + if (i < 2) + return (0); + return (i); +} + +int is_base(char k, char *base) +{ + int i; + + i = 0; + while (base[i]) + { + if (k == base[i]) + return (1); + i++; + } + return (0); +} + +int unchar(char k, char *base) +{ + int i; + + i = 0; + while (base[i]) + { + if (k == base[i]) + return (i); + i++; + } + return (0); +} + +int start(char *str) +{ + int posi; + int i; + + i = 0; + posi = 1; + while (str[i] == 32 || (str[i] >= 9 && str[i] <= 13)) + i++; + while (str[i] == '-' || str[i] == '+') + { + if (str[i] == '-') + posi = posi * -1; + i++; + } + return (posi); +}