diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/strings.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/lib/strings.c b/src/lib/strings.c index 8b83c9f..53caaec 100644 --- a/src/lib/strings.c +++ b/src/lib/strings.c @@ -1,3 +1,4 @@ +#include <lib/kmem.h> #include <lib/strings.h> unsigned long strlen(string_t s) @@ -32,3 +33,77 @@ unsigned char strcmpn(string_t a, string_t b, unsigned int n) } return a[idx] == b[idx]; } + +char* zhex32_to_str(unsigned long value) +{ + char* data = kcalloc(9); + char tmp = 0; + char isz = -1; + for (int i = 0; i < 8; i++) { + tmp = (value >> 4*(8-i-1))&0xF; + if (isz == 0xFF && tmp != 0) + isz = i; + if(tmp > 0x9) + tmp += 7; + tmp += 0x30; + data[i] = tmp; + } + return data+isz; +} + +char* hex32_to_str(unsigned long value) +{ + char* data = kcalloc(9); + char tmp = 0; + for (int i = 0; i < 8; i++) { + tmp = (value >> 4*(8-i-1))&0xF; + if(tmp > 0x9) + tmp += 7; + tmp += 0x30; + data[i] = tmp; + } + return data; +} + +char* u32_to_str(unsigned long value) +{ + unsigned long t = value; + unsigned long c; + char* data = kcalloc(11); + char* dptr = data + 9; + for (int i = 0; i <= 10; i++) { + c = t%10; + *dptr = 0x30 + (c&0xF); + t /= 10; + if (t==0) + break; + dptr -= 1; + } + return dptr; +} + +char* s32_to_str(unsigned long value) +{ + long t = value; + unsigned long c; + char is_neg = 0; + if (t < 0) { + t = -t; + is_neg = 1; + } + char* data = kcalloc(12); + char* dptr = data + 10; + for (int i = 0; i <= 10; i++) { + c = t%10; + *dptr = 0x30 + (c&0xF); + t /= 10; + if (t==0) + break; + dptr -= 1; + } + if (is_neg) { + dptr -= 1; + *dptr = '-'; + } + return dptr; +} |