1 // [AsmJit]
2 // Complete JIT Assembler for C++ Language.
3 //
4 // [License]
5 // Zlib - See COPYING file in this package.
6
7 #define ASMJIT_EXPORTS
8
9 // [Dependencies - AsmJit]
10 #include "../core/assert.h"
11 #include "../core/stringutil.h"
12
13 // [Api-Begin]
14 #include "../core/apibegin.h"
15
16 namespace AsmJit {
17
18 // ============================================================================
19 // [AsmJit::StringUtil]
20 // ============================================================================
21
22 static const char letters[] = "0123456789ABCDEF";
23
copy(char * dst,const char * src,size_t len)24 char* StringUtil::copy(char* dst, const char* src, size_t len)
25 {
26 if (src == NULL)
27 return dst;
28
29 if (len == kInvalidSize)
30 {
31 while (*src) *dst++ = *src++;
32 }
33 else
34 {
35 memcpy(dst, src, len);
36 dst += len;
37 }
38
39 return dst;
40 }
41
fill(char * dst,const int c,size_t len)42 char* StringUtil::fill(char* dst, const int c, size_t len)
43 {
44 memset(dst, c, len);
45 return dst + len;
46 }
47
hex(char * dst,const uint8_t * src,size_t len)48 char* StringUtil::hex(char* dst, const uint8_t* src, size_t len)
49 {
50 for (size_t i = len; i; i--, dst += 2, src += 1)
51 {
52 dst[0] = letters[(src[0] >> 4) & 0xF];
53 dst[1] = letters[(src[0] ) & 0xF];
54 }
55
56 return dst;
57 }
58
59 // Not too efficient, but this is mainly for debugging:)
utoa(char * dst,uintptr_t i,size_t base)60 char* StringUtil::utoa(char* dst, uintptr_t i, size_t base)
61 {
62 ASMJIT_ASSERT(base <= 16);
63
64 char buf[128];
65 char* p = buf + 128;
66
67 do {
68 uintptr_t b = i % base;
69 *--p = letters[b];
70 i /= base;
71 } while (i);
72
73 return StringUtil::copy(dst, p, (size_t)(buf + 128 - p));
74 }
75
itoa(char * dst,intptr_t i,size_t base)76 char* StringUtil::itoa(char* dst, intptr_t i, size_t base)
77 {
78 if (i < 0)
79 {
80 *dst++ = '-';
81 i = -i;
82 }
83
84 return StringUtil::utoa(dst, (size_t)i, base);
85 }
86
87 } // AsmJit namespace
88
89 // [Api-End]
90 #include "../core/apiend.h"
91