diff options
Diffstat (limited to 'src/string.c')
-rw-r--r-- | src/string.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/string.c b/src/string.c new file mode 100644 index 0000000..f1876f2 --- /dev/null +++ b/src/string.c @@ -0,0 +1,64 @@ + + +#include <stddef.h> +#include <stdint.h> + + +int memcmp(void *s1, const void *s2, size_t n) +{ + unsigned char *a = (unsigned char *) s1; + unsigned char *b = (unsigned char *) s2; + for (size_t i=0;i<n;i++) + if (a[i] != b[i]) return a[i] - b[i]; + return 0; +} + +void *memcpy(void *dest, const void *src, size_t n) +{ + unsigned char *d = (unsigned char *) dest; + unsigned char *s = (unsigned char *) src; + for (size_t i=0;i<n;i++) d[i] = s[i]; + return dest; +} + +void *memmove(void *dest, const void *src, size_t n) +{ + unsigned char *d = (unsigned char *) dest; + unsigned char *s = (unsigned char *) src; + if (d < s) + for (size_t i=0;i<n;i++) + d[i] = s[i]; + else + for (size_t i=n;i!=0;i--) + d[i-1] = s[i-1]; + return dest; +} + +void *memset(void *s, int c, size_t n) +{ + unsigned char *str = (unsigned char *) s; + for (size_t i=0;i<n;i++) str[i] = c; + return s; +} + +size_t strlen(const char *s) +{ + size_t len = 0; + while (s[++len]); + return len; +} + + +char *hex(uint32_t n, char *buf) +{ + buf[0] = '0'; buf[1] = 'x'; + for (int i=0;i<8;i++) + { + int digit = (n >> (i * 4)) & 0xF; + if (digit < 10) + buf[9 - i] = '0' + digit; + else + buf[9 - i] = 'A' + (digit - 10); + } + return buf; +} |