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