fork(14) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5.  
  6. typedef unsigned char uint8_t;
  7. typedef unsigned int uint32_t;
  8. typedef int int32_t;
  9.  
  10.  
  11. #define DATA_SET_SIZE_W 10
  12. #define TEST_ERROR 1
  13. #define BASE_16 16
  14. #define BASE_10 10
  15. #define BASE_2 2
  16.  
  17. uint8_t my_itoa(int32_t data, uint8_t *ptr, uint32_t base);
  18. int32_t my_atoi(uint8_t *ptr, uint8_t digits, uint32_t base);
  19.  
  20.  
  21. int main()
  22. {
  23. uint8_t * ptr;
  24. int32_t num = -4096;
  25. uint32_t digits;
  26. int32_t value;
  27.  
  28. printf("\ntest_data1();\n");
  29. ptr = (uint8_t*)( malloc(DATA_SET_SIZE_W*sizeof(size_t)) );
  30.  
  31. if (! ptr )
  32. {
  33. return TEST_ERROR;
  34. }
  35.  
  36. digits = my_itoa( num, ptr, BASE_16);
  37. value = my_atoi( ptr, digits, BASE_16);
  38.  
  39.  
  40. printf(" Initial number: %d\n", num);
  41. printf(" Final Decimal number: %d\n", value);
  42.  
  43. free(ptr);
  44. }
  45.  
  46.  
  47. uint8_t my_itoa(int32_t data, uint8_t *ptr, uint32_t base)
  48. {
  49. uint8_t len;
  50. int32_t i;
  51. int32_t msk;
  52. uint8_t *ptr_data = ptr;
  53.  
  54. printf("\ntest my_itoa;\n");
  55. printf("Base %d\n", base);
  56. printf("ptr_data 0x%02X\n", ptr_data);
  57. printf("ptr 0x%02X\n", ptr);
  58.  
  59. switch (base)
  60. {
  61. case 2:
  62. for(i=31, msk=0x80000000; i>=0; i--, msk>>=1, ptr_data++)
  63. {
  64. if((uint8_t)((data & msk) >> i))
  65. *ptr_data=0x31;
  66. else
  67. *ptr_data=0x30;
  68. }
  69. break;
  70.  
  71.  
  72. case 10:
  73. if (data < 0)
  74. {
  75. data *= -1; // Convert a positive number
  76. *ptr = '-';
  77. ptr++;
  78. }
  79. for(i=(int32_t)log10(data); i >= 0; i--, ptr_data++)
  80. {
  81. *ptr = (uint8_t) data / pow(10,i);
  82. *ptr += 0x30;
  83. }
  84. break;
  85.  
  86.  
  87. case 16:
  88. printf("data %02X\n", data);
  89. for(i=(2*sizeof(int32_t))-1, msk=0xF0000000; i>=0; msk>>=4, i--, ptr_data++)
  90. {
  91. *ptr = (msk & data) >> (4*(i-1));
  92. printf("mascara 0x%02X\n", (msk & data));
  93. printf("i %d: ", i);
  94. printf("%d -> ",*ptr);
  95. if (*ptr>=0 && *ptr<=9)
  96. *ptr += 0x30;
  97. else
  98. *ptr -= 55;
  99.  
  100. printf("0x%02X\n",*ptr);
  101. }
  102. break;
  103.  
  104. }
  105.  
  106. *ptr_data ='\0';
  107. ptr_data++;
  108.  
  109. len = (uint8_t) (ptr_data-ptr);
  110.  
  111. printf("ptr_data 0x%02X\n", ptr_data);
  112. printf("ptr 0x%02X\n", ptr);
  113.  
  114. printf("ASCII %s\n", (char*)ptr);
  115. printf("retorno len %d", len);
  116. printf("\nFin test my_itoa;\n");
  117.  
  118. return len;
  119.  
  120. }
  121.  
  122.  
  123. int32_t my_atoi(uint8_t *ptr, uint8_t digits, uint32_t base)
  124. {
  125. int32_t i;
  126. int32_t num;
  127. uint8_t negative;
  128.  
  129. for(i=digits-1, negative=0, num=0; i>=0; i--)
  130. {
  131. if (*ptr>='0' && *ptr<='9')
  132. num += (*ptr-'0') * pow(base,i);
  133. else if (*ptr>='A' && *ptr<='B')
  134. num += (*ptr-'A') * pow(base,i);
  135. else if (*ptr>='a' && *ptr<='b')
  136. num += (*ptr-'a') * pow(base,i);
  137. else if (*ptr == '-')
  138. negative = 1;
  139. }
  140.  
  141. if (negative)
  142. num *= -1;
  143.  
  144. return num;
  145. }
Success #stdin #stdout 0s 9432KB
stdin
Standard input is empty
stdout
test_data1();

test my_itoa;
Base 16
ptr_data 0xB430B020
ptr 0xB430B020
data FFFFF000
mascara 0xF0000000
i 7: 240  -> 0xB9
mascara 0xFF000000
i 6: 240  -> 0xB9
mascara 0xFFF00000
i 5: 240  -> 0xB9
mascara 0xFFFF0000
i 4: 240  -> 0xB9
mascara 0xFFFFF000
i 3: 240  -> 0xB9
mascara 0xFFFFF000
i 2: 0  -> 0x30
mascara 0xFFFFF000
i 1: 0  -> 0x30
mascara 0xFFFFF000
i 0: 255  -> 0xC8
ptr_data 0xB430B029
ptr 0xB430B020
ASCII �
retorno len 9
Fin test my_itoa;
  Initial number: -4096
  Final Decimal number: 0