/* * Takes a int64_t and fills in a char* string with that number "radix"-based. * Writes at most 21: chars ("-9223372036854775807" plus NUL). * Returns the length of the string, not including the terminating NULL. */ U_CAPI int32_t U_EXPORT2 T_CString_int64ToString(char* buffer, int64_t v, uint32_t radix) { char tbuf[30]; int32_t tbx = sizeof(tbuf); uint8_t digit; int32_t length = 0; uint64_t uval; U_ASSERT(radix>=2 && radix<=16); uval = (uint64_t) v; if(v<0 && radix == 10) { /* Only in base 10 do we conside numbers to be signed. */ uval = (uint64_t)(-v); buffer[length++] = '-'; } tbx = sizeof(tbuf)-1; tbuf[tbx] = 0; /* We are generating the digits backwards. Null term the end. */ do { digit = (uint8_t)(uval % radix); tbuf[--tbx] = (char)(T_CString_itosOffset(digit)); uval = uval / radix; } while (uval != 0); /* copy converted number into user buffer */ uprv_strcpy(buffer+length, tbuf+tbx); length += sizeof(tbuf) - tbx -1; return length; }
static void uprv_appendByteToHexString(char *dst, uint8_t val) { uint32_t len = (uint32_t)uprv_strlen(dst); *(dst+len) = T_CString_itosOffset((val >> 4)); *(dst+len+1) = T_CString_itosOffset((val & 0xF)); *(dst+len+2) = 0; }