PageRenderTime 51ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/utils.c

https://bitbucket.org/hinxx/sole
C | 155 lines | 110 code | 25 blank | 20 comment | 18 complexity | ce17e5bd6a76696667c42142e8829d19 MD5 | raw file
Possible License(s): GPL-3.0
  1. /*
  2. * utils.c
  3. *
  4. * Created on: Nov 21, 2012
  5. * Author: hinkocevar@gmail.com
  6. * Project: sole
  7. * Copying: See LICENSE
  8. * Web page: https://bitbucket.org/hinxx/sole
  9. */
  10. #include "utils.h"
  11. int strlen(char *s) {
  12. int c = 0;
  13. while (*s++ != 0) { c++; }
  14. return c;
  15. }
  16. void *memset(void *s, int c, uint32_t n) {
  17. char *p = (char *)s;
  18. while (n--) { *p++ = c; }
  19. return s;
  20. }
  21. void *memcpy(void *dest, const void *src, uint32_t n) {
  22. char *s = (char *)src;
  23. char *d = (char *)dest;
  24. while (n--) { *d++ = *s++; }
  25. return dest;
  26. }
  27. char *strcpy(char *dest, const char *src) {
  28. const unsigned char *s = (const unsigned char *)src;
  29. unsigned char *d = (unsigned char *)dest;
  30. while ((*d++ = *s++));
  31. return dest;
  32. }
  33. /*
  34. * reverse string in place
  35. * http://mbed.org/forum/bugs-suggestions/topic/2319/?page=1#comment-19606
  36. */
  37. void reverse(char *s) {
  38. char *j;
  39. int c;
  40. j = s + strlen(s) - 1;
  41. while (s < j) {
  42. c = *s;
  43. *s++ = *j;
  44. *j-- = c;
  45. }
  46. }
  47. /* itoa: convert n to characters in s
  48. * http://mbed.org/forum/bugs-suggestions/topic/2319/?page=1#comment-19606
  49. *
  50. * */
  51. void itoa(int n, char s[]) {
  52. int i, sign;
  53. if ((sign = n) < 0) /* record sign */
  54. n = -n; /* make n positive */
  55. i = 0;
  56. do { /* generate digits in reverse order */
  57. s[i++] = n % 10 + '0'; /* get next digit */
  58. } while ((n /= 10) > 0); /* delete it */
  59. if (sign < 0)
  60. s[i++] = '-';
  61. s[i] = '\0';
  62. reverse(s);
  63. }
  64. void sprintf_hex(char *dest, char *src, int len) {
  65. char *d = dest;
  66. char *s = src;
  67. while (len--) {
  68. if (((*s >> 4) & 0xF) < 10) {
  69. *d = '0' + ((*s >> 4) & 0xF);
  70. } else {
  71. *d = 'A' + ((*s >> 4) & 0xF) - 10;
  72. }
  73. d++;
  74. if ((*s & 0xF) < 10) {
  75. *d = '0' + (*s & 0xF);
  76. } else {
  77. *d = 'A' + (*s & 0xF) - 10;
  78. }
  79. d++;
  80. *d = ' ';
  81. d++;
  82. s++;
  83. }
  84. }
  85. void sprintf_i(char *dest, int i) {
  86. sprintf_is(dest, i, 0);
  87. }
  88. void sprintf_is(char *dest, int i, char *s) {
  89. sprintf_sis(dest, 0, i, s);
  90. }
  91. void sprintf_si(char *dest, char *s, int i) {
  92. sprintf_sis(dest, s, i, 0);
  93. }
  94. void sprintf_sis(char *dest, char *s1, int i, char *s2) {
  95. int slen1 = 0;
  96. int slen2 = 0;
  97. if (s1) {
  98. slen1 = strlen(s1);
  99. strcpy(dest, s1);
  100. dest[slen1] = '\0';
  101. }
  102. /* convert integer to string */
  103. itoa(i, &dest[slen1]);
  104. if (s2) {
  105. slen1 = strlen(dest);
  106. slen2 = strlen(s2);
  107. strcpy(&dest[slen1], s2);
  108. dest[slen1 + slen2] = '\0';
  109. }
  110. }
  111. void sprintf_isis(char *dest, int i1, char *s1, int i2, char *s2) {
  112. int slen1 = 0;
  113. int slen2 = 0;
  114. /* convert integer to string */
  115. itoa(i1, &dest[slen1]);
  116. slen1 = strlen(dest);
  117. if (s1) {
  118. strcpy(&dest[slen1], s1);
  119. slen1 += strlen(s1);
  120. dest[slen1] = '\0';
  121. }
  122. /* convert integer to string */
  123. itoa(i2, &dest[slen1]);
  124. if (s2) {
  125. slen1 = strlen(dest);
  126. slen2 = strlen(s2);
  127. strcpy(&dest[slen1], s2);
  128. dest[slen1 + slen2] = '\0';
  129. }
  130. }