#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef int int32_t;
#define DATA_SET_SIZE_W 10
#define TEST_ERROR 1
#define BASE_16 16
#define BASE_10 10
#define BASE_2 2
uint8_t my_itoa(int32_t data, uint8_t *ptr, uint32_t base);
int32_t my_atoi(uint8_t *ptr, uint8_t digits, uint32_t base);
int main()
{
uint8_t * ptr;
int32_t num = -4096;
uint32_t digits;
int32_t value;
ptr
= (uint8_t*)( malloc(DATA_SET_SIZE_W
*sizeof(size_t)) );
if (! ptr )
{
return TEST_ERROR;
}
digits = my_itoa( num, ptr, BASE_16);
value = my_atoi( ptr, digits, BASE_16);
printf(" Initial number: %d\n", num
); printf(" Final Decimal number: %d\n", value
);
}
uint8_t my_itoa(int32_t data, uint8_t *ptr, uint32_t base)
{
uint8_t len;
int32_t i;
int32_t msk;
uint8_t *ptr_data = ptr;
printf("ptr_data 0x%02X\n", ptr_data
);
switch (base)
{
case 2:
for(i=31, msk=0x80000000; i>=0; i--, msk>>=1, ptr_data++)
{
if((uint8_t)((data & msk) >> i))
*ptr_data=0x31;
else
*ptr_data=0x30;
}
break;
case 10:
if (data < 0)
{
data *= -1; // Convert a positive number
*ptr = '-';
ptr++;
}
for(i
=(int32_t)log10(data
); i
>= 0; i
--, ptr_data
++) {
*ptr
= (uint8_t) data
/ pow(10,i
); *ptr += 0x30;
}
break;
case 16:
for(i=(2*sizeof(int32_t))-1, msk=0xF0000000; i>=0; msk>>=4, i--, ptr_data++)
{
*ptr = (msk & data) >> (4*(i-1));
printf("mascara 0x%02X\n", (msk
& data
)); if (*ptr>=0 && *ptr<=9)
*ptr += 0x30;
else
*ptr -= 55;
}
break;
}
*ptr_data ='\0';
ptr_data++;
len = (uint8_t) (ptr_data-ptr);
printf("ptr_data 0x%02X\n", ptr_data
);
printf("ASCII %s\n", (char*)ptr
); printf("retorno len %d", len
); printf("\nFin test my_itoa;\n");
return len;
}
int32_t my_atoi(uint8_t *ptr, uint8_t digits, uint32_t base)
{
int32_t i;
int32_t num;
uint8_t negative;
for(i=digits-1, negative=0, num=0; i>=0; i--)
{
if (*ptr>='0' && *ptr<='9')
num
+= (*ptr
-'0') * pow(base
,i
); else if (*ptr>='A' && *ptr<='B')
num
+= (*ptr
-'A') * pow(base
,i
); else if (*ptr>='a' && *ptr<='b')
num
+= (*ptr
-'a') * pow(base
,i
); else if (*ptr == '-')
negative = 1;
}
if (negative)
num *= -1;
return num;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgIHVpbnQ4X3Q7CnR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgdWludDMyX3Q7CnR5cGVkZWYgaW50ICAgICAgICAgICAgICAgaW50MzJfdDsKCgojZGVmaW5lIERBVEFfU0VUX1NJWkVfVyAxMAojZGVmaW5lIFRFU1RfRVJST1IgICAgICAxCiNkZWZpbmUgQkFTRV8xNiAgICAgICAgIDE2CiNkZWZpbmUgQkFTRV8xMCAgICAgICAgIDEwCiNkZWZpbmUgQkFTRV8yICAgICAgICAgIDIKCnVpbnQ4X3QgbXlfaXRvYShpbnQzMl90IGRhdGEsIHVpbnQ4X3QgKnB0ciwgdWludDMyX3QgYmFzZSk7CmludDMyX3QgbXlfYXRvaSh1aW50OF90ICpwdHIsIHVpbnQ4X3QgZGlnaXRzLCB1aW50MzJfdCBiYXNlKTsKCgppbnQgbWFpbigpCnsKICB1aW50OF90ICogcHRyOwogIGludDMyX3QgbnVtID0gLTQwOTY7CiAgdWludDMyX3QgZGlnaXRzOwogIGludDMyX3QgdmFsdWU7CgogIHByaW50ZigiXG50ZXN0X2RhdGExKCk7XG4iKTsKICBwdHIgPSAodWludDhfdCopKCBtYWxsb2MoREFUQV9TRVRfU0laRV9XKnNpemVvZihzaXplX3QpKSApOwoKICBpZiAoISBwdHIgKQogIHsKICAgIHJldHVybiBURVNUX0VSUk9SOwogIH0KCiAgZGlnaXRzID0gbXlfaXRvYSggbnVtLCBwdHIsIEJBU0VfMTYpOwogIHZhbHVlID0gbXlfYXRvaSggcHRyLCBkaWdpdHMsIEJBU0VfMTYpOwogIAogIAogIHByaW50ZigiICBJbml0aWFsIG51bWJlcjogJWRcbiIsIG51bSk7CiAgcHJpbnRmKCIgIEZpbmFsIERlY2ltYWwgbnVtYmVyOiAlZFxuIiwgdmFsdWUpOwogIAogIGZyZWUocHRyKTsKfQoKCnVpbnQ4X3QgbXlfaXRvYShpbnQzMl90IGRhdGEsIHVpbnQ4X3QgKnB0ciwgdWludDMyX3QgYmFzZSkKewogIHVpbnQ4X3QgbGVuOwogIGludDMyX3QgaTsKICBpbnQzMl90IG1zazsKICB1aW50OF90ICpwdHJfZGF0YSA9IHB0cjsKICAKICBwcmludGYoIlxudGVzdCBteV9pdG9hO1xuIik7CiAgcHJpbnRmKCJCYXNlICVkXG4iLCBiYXNlKTsKICBwcmludGYoInB0cl9kYXRhIDB4JTAyWFxuIiwgcHRyX2RhdGEpOwogIHByaW50ZigicHRyIDB4JTAyWFxuIiwgcHRyKTsKCglzd2l0Y2ggKGJhc2UpCgl7CgkgIGNhc2UgMjoKCQlmb3IoaT0zMSwgbXNrPTB4ODAwMDAwMDA7IGk+PTA7IGktLSwgbXNrPj49MSwgcHRyX2RhdGErKykKCQl7CgkJICBpZigodWludDhfdCkoKGRhdGEgJiBtc2spID4+IGkpKQoJCQkqcHRyX2RhdGE9MHgzMTsKCQkgIGVsc2UKCQkJKnB0cl9kYXRhPTB4MzA7CgkJfQoJICBicmVhazsKCSAgCgkgIAoJICBjYXNlIDEwOgoJCWlmIChkYXRhIDwgMCkKCQl7CgkJICBkYXRhICo9IC0xOyAvLyBDb252ZXJ0IGEgcG9zaXRpdmUgbnVtYmVyCgkJICAqcHRyID0gJy0nOwoJCSAgIHB0cisrOwoJCX0KCQlmb3IoaT0oaW50MzJfdClsb2cxMChkYXRhKTsgaSA+PSAwOyBpLS0sIHB0cl9kYXRhKyspCgkJewoJCSAgKnB0ciA9ICh1aW50OF90KSBkYXRhIC8gcG93KDEwLGkpOwoJCSAgKnB0ciArPSAweDMwOwoJCX0KCSAgYnJlYWs7CgkgIAoJICAKCSAgY2FzZSAxNjoKCQlwcmludGYoImRhdGEgJTAyWFxuIiwgZGF0YSk7CgkJZm9yKGk9KDIqc2l6ZW9mKGludDMyX3QpKS0xLCBtc2s9MHhGMDAwMDAwMDsgaT49MDsgbXNrPj49NCwgaS0tLCBwdHJfZGF0YSsrKQoJCXsKCQkgICpwdHIgPSAobXNrICYgZGF0YSkgPj4gKDQqKGktMSkpOwoJCSAgcHJpbnRmKCJtYXNjYXJhIDB4JTAyWFxuIiwgKG1zayAmIGRhdGEpKTsKCQkgIHByaW50ZigiaSAlZDogIiwgaSk7CgkJICBwcmludGYoIiVkICAtPiAiLCpwdHIpOwoJCSAgaWYgKCpwdHI+PTAgJiYgKnB0cjw9OSkKCQkJKnB0ciArPSAweDMwOwoJCSAgZWxzZQoJCQkqcHRyIC09IDU1OwoJCSAgCgkJICBwcmludGYoIjB4JTAyWFxuIiwqcHRyKTsKCQl9CgkgIGJyZWFrOwoKCX0KCQoJKnB0cl9kYXRhID0nXDAnOwoJIHB0cl9kYXRhKys7CgkgCglsZW4gPSAodWludDhfdCkgKHB0cl9kYXRhLXB0cik7CgkKCXByaW50ZigicHRyX2RhdGEgMHglMDJYXG4iLCBwdHJfZGF0YSk7CglwcmludGYoInB0ciAweCUwMlhcbiIsIHB0cik7CgkKCXByaW50ZigiQVNDSUkgJXNcbiIsIChjaGFyKilwdHIpOwoJcHJpbnRmKCJyZXRvcm5vIGxlbiAlZCIsIGxlbik7CglwcmludGYoIlxuRmluIHRlc3QgbXlfaXRvYTtcbiIpOwoJCglyZXR1cm4gbGVuOwoKfQoKCmludDMyX3QgbXlfYXRvaSh1aW50OF90ICpwdHIsIHVpbnQ4X3QgZGlnaXRzLCB1aW50MzJfdCBiYXNlKQp7CiAgaW50MzJfdCBpOwogIGludDMyX3QgbnVtOwogIHVpbnQ4X3QgbmVnYXRpdmU7CiAgCiAgZm9yKGk9ZGlnaXRzLTEsIG5lZ2F0aXZlPTAsIG51bT0wOyBpPj0wOyBpLS0pCiAgewoJaWYgKCpwdHI+PScwJyAmJiAqcHRyPD0nOScpCgkgIG51bSArPSAoKnB0ci0nMCcpICogcG93KGJhc2UsaSk7CgllbHNlIGlmICgqcHRyPj0nQScgJiYgKnB0cjw9J0InKSAKCSAgbnVtICs9ICgqcHRyLSdBJykgKiBwb3coYmFzZSxpKTsKCWVsc2UgaWYgKCpwdHI+PSdhJyAmJiAqcHRyPD0nYicpCgkgIG51bSArPSAoKnB0ci0nYScpICogcG93KGJhc2UsaSk7CgllbHNlIGlmICgqcHRyID09ICctJykKCSAgbmVnYXRpdmUgPSAxOwogIH0KICAKICBpZiAobmVnYXRpdmUpCiAgICBudW0gKj0gLTE7CgogIHJldHVybiBudW07CQp9