#include "strings.h" void uint32_to_dec(uint32_t number, char buf[10]) { for (int i = 0; i < 10; i++) { buf[10 - 1 - i] = '0' + (number % 10); number /= 10; } } void uint32_to_hex(uint32_t number, char buf[8]) { for (int i = 0; i < 8; i++) { unsigned char quadbit = (number >> ((8 - i - 1) * 4)) & 0xf; buf[i] = quadbit > 9 ? quadbit - 10 + 'a' : quadbit + '0'; } } void uint32_to_bin(uint32_t number, char buf[32]) { for (int i = 0; i < 32; i++) buf[i] = ((number >> (32 - i - 1)) & 1) ? '1' : '0'; } void uint32_to_decstring(uint32_t number, char buf[11]) { uint32_to_dec(number, buf); buf[10] = '\0'; } void uint32_to_hexstring(uint32_t number, char buf[9]) { uint32_to_hex(number, buf); buf[8] = '\0'; } void uint32_to_binstring(uint32_t number, char buf[33]) { uint32_to_bin(number, buf); buf[32] = '\0'; } void trim_0s(char string[]) { size_t i; for (i = 0; string[i] == '0'; i++); size_t j = 0; if (!string[i]) string[j++] = string[--i]; do string[j] = string[i + j]; while (string[j++]); } void uint32_to_decstringt(uint32_t number, char buf[11]) { uint32_to_decstring(number, buf); trim_0s(buf); } void uint32_to_hexstringt(uint32_t number, char buf[9]) { uint32_to_hexstring(number, buf); trim_0s(buf); } size_t strlen(char string[]) { size_t len; for (len = 0; string[len]; len++); return len; } void memcpy(void *dst, void *src, size_t nbytes) { size_t iter; // copying by word is faster than by byte // copy by word as much as possible for (iter = 0; iter < nbytes / 4; iter++) ((volatile uint32_t*) dst)[iter] = ((uint32_t*) src)[iter]; // copy the remaining 1, 2 or 3 bytes by byte for (iter *= 4; iter < nbytes; iter++) ((volatile uint8_t*) dst)[iter] = ((uint8_t*) src)[iter]; } // keep in mind memset is also needed for array initialization, like // uint32_t buf[16] = {0}; // gcc compiles this to memset call void *memset(void *s, int c, size_t n) { volatile char *mem = s; for (size_t i = 0; i < n; i++) mem[i] = c; return s; }