|
@@ -187,7 +187,7 @@ snprint_decimal64(
|
|
|
}
|
|
|
|
|
|
ssize_t
|
|
|
-snprint_hex(
|
|
|
+snprint_hex32(
|
|
|
char* buf,
|
|
|
size_t buf_size,
|
|
|
uint32_t num,
|
|
@@ -234,6 +234,54 @@ snprint_hex(
|
|
|
return n_write;
|
|
|
}
|
|
|
|
|
|
+ssize_t
|
|
|
+snprint_hex64(
|
|
|
+ char* buf,
|
|
|
+ size_t buf_size,
|
|
|
+ uint64_t num,
|
|
|
+ int32_t capitalized)
|
|
|
+{
|
|
|
+ ssize_t n_write = 0;
|
|
|
+
|
|
|
+ do_write_if_free(buf, buf_size, '0');
|
|
|
+ if (capitalized) {
|
|
|
+ do_write_if_free(buf, buf_size, 'X');
|
|
|
+ } else {
|
|
|
+ do_write_if_free(buf, buf_size, 'x');
|
|
|
+ }
|
|
|
+ n_write += 2;
|
|
|
+
|
|
|
+ char* orig_buf = buf;
|
|
|
+
|
|
|
+ do {
|
|
|
+ if (capitalized) {
|
|
|
+ do_write_if_free(buf, buf_size, X_to_c(num % 16));
|
|
|
+ } else {
|
|
|
+ do_write_if_free(buf, buf_size, x_to_c(num % 16));
|
|
|
+ }
|
|
|
+ num /= 16;
|
|
|
+ ++n_write;
|
|
|
+ } while (num != 0);
|
|
|
+
|
|
|
+ // prepend trailing '\0'
|
|
|
+ if (buf_size > 0)
|
|
|
+ *buf = 0x00;
|
|
|
+
|
|
|
+ // move buf pointer to the last digit of number
|
|
|
+ --buf;
|
|
|
+
|
|
|
+ // reverse output
|
|
|
+ while (orig_buf < buf) {
|
|
|
+ char c = *buf;
|
|
|
+ *buf = *orig_buf;
|
|
|
+ *orig_buf = c;
|
|
|
+ --buf;
|
|
|
+ ++orig_buf;
|
|
|
+ }
|
|
|
+
|
|
|
+ return n_write;
|
|
|
+}
|
|
|
+
|
|
|
static inline ssize_t
|
|
|
snprint_char(
|
|
|
char* buf,
|
|
@@ -268,12 +316,12 @@ snprintf(
|
|
|
break;
|
|
|
|
|
|
case 'x':
|
|
|
- n_tmp_write = snprint_hex(buf, buf_size, *(uint32_t*)arg_ptr, 0);
|
|
|
+ n_tmp_write = snprint_hex32(buf, buf_size, *(uint32_t*)arg_ptr, 0);
|
|
|
arg_ptr += sizeof(uint32_t);
|
|
|
break;
|
|
|
|
|
|
case 'X':
|
|
|
- n_tmp_write = snprint_hex(buf, buf_size, *(uint32_t*)arg_ptr, 1);
|
|
|
+ n_tmp_write = snprint_hex32(buf, buf_size, *(uint32_t*)arg_ptr, 1);
|
|
|
arg_ptr += sizeof(uint32_t);
|
|
|
break;
|
|
|
|
|
@@ -282,8 +330,17 @@ snprintf(
|
|
|
switch (*(++fmt)) {
|
|
|
// long long aka int64
|
|
|
case 'l':
|
|
|
- ++fmt;
|
|
|
- n_tmp_write = snprint_decimal64(buf, buf_size, *(int64_t*)arg_ptr);
|
|
|
+ switch (*(++fmt)) {
|
|
|
+ case 'd':
|
|
|
+ n_tmp_write = snprint_decimal64(buf, buf_size, *(int64_t*)arg_ptr);
|
|
|
+ break;
|
|
|
+ case 'x':
|
|
|
+ n_tmp_write = snprint_hex64(buf, buf_size, *(int64_t*)arg_ptr, 0);
|
|
|
+ break;
|
|
|
+ case 'X':
|
|
|
+ n_tmp_write = snprint_hex64(buf, buf_size, *(int64_t*)arg_ptr, 1);
|
|
|
+ break;
|
|
|
+ }
|
|
|
arg_ptr += sizeof(int64_t);
|
|
|
break;
|
|
|
// long int aka int32
|
|
@@ -291,6 +348,15 @@ snprintf(
|
|
|
n_tmp_write = snprint_decimal32(buf, buf_size, *(int32_t*)arg_ptr);
|
|
|
arg_ptr += sizeof(int32_t);
|
|
|
break;
|
|
|
+ case 'x':
|
|
|
+ n_tmp_write = snprint_hex32(buf, buf_size, *(uint32_t*)arg_ptr, 0);
|
|
|
+ arg_ptr += sizeof(uint32_t);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 'X':
|
|
|
+ n_tmp_write = snprint_hex32(buf, buf_size, *(uint32_t*)arg_ptr, 1);
|
|
|
+ arg_ptr += sizeof(uint32_t);
|
|
|
+ break;
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -308,7 +374,11 @@ snprintf(
|
|
|
|
|
|
// pointer
|
|
|
case 'p':
|
|
|
- n_tmp_write = snprint_hex(buf, buf_size, *(ptr_t*)arg_ptr, 0);
|
|
|
+#ifdef __32bit_system
|
|
|
+ n_tmp_write = snprint_hex32(buf, buf_size, *(ptr_t*)arg_ptr, 0);
|
|
|
+#else
|
|
|
+ n_tmp_write = snprint_hex64(buf, buf_size, *(ptr_t*)arg_ptr, 0);
|
|
|
+#endif
|
|
|
arg_ptr += sizeof(ptr_t);
|
|
|
break;
|
|
|
|