summaryrefslogtreecommitdiff
path: root/strings/apr_snprintf.c
diff options
context:
space:
mode:
authortrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2005-06-17 12:12:36 +0000
committertrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2005-06-17 12:12:36 +0000
commit212748ebc37a276a785b6b26acfae8cc6eeb515f (patch)
treef6c6d295b7bc1fc2957720edab290035c0a5ae44 /strings/apr_snprintf.c
parentf716c643d5eac3af81dc7f0a2a224ad813520c9f (diff)
downloadlibapr-212748ebc37a276a785b6b26acfae8cc6eeb515f.tar.gz
Add %pt support to apr_snprintf() for printing an apr_os_thread_t
in hex format. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@191138 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'strings/apr_snprintf.c')
-rw-r--r--strings/apr_snprintf.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/strings/apr_snprintf.c b/strings/apr_snprintf.c
index 0d5dad0bb..313a778cf 100644
--- a/strings/apr_snprintf.c
+++ b/strings/apr_snprintf.c
@@ -665,6 +665,27 @@ static char *conv_p2_quad(u_widest_int num, register int nbits,
return (p);
}
+#if APR_HAS_THREADS
+static char *conv_os_thread_t_hex(apr_os_thread_t *tid, char *buf_end, apr_size_t *len)
+{
+ union {
+ apr_os_thread_t tid;
+ apr_uint64_t alignme;
+ } u;
+ int is_negative;
+
+ u.tid = *tid;
+ switch(sizeof(u.tid)) {
+ case sizeof(apr_int32_t):
+ return conv_p2(*(apr_uint32_t *)&u.tid, 4, 'x', buf_end, len);
+ case sizeof(apr_int64_t):
+ return conv_p2_quad(*(apr_uint64_t *)&u.tid, 4, 'x', buf_end, len);
+ default:
+ /* not implemented; stick 0 in the buffer */
+ return conv_10(0, TRUE, &is_negative, buf_end, len);
+ }
+}
+#endif
/*
* Do format conversion placing the output in buffer
@@ -1170,6 +1191,31 @@ APR_DECLARE(int) apr_vformatter(int (*flush_func)(apr_vformatter_buff_t *),
#endif
break;
+ case 't':
+#if APR_HAS_THREADS
+ {
+ apr_os_thread_t *tid;
+
+ tid = va_arg(ap, apr_os_thread_t *);
+ if (tid != NULL) {
+ s = conv_os_thread_t_hex(tid, &num_buf[NUM_BUF_SIZE], &s_len);
+ if (adjust_precision && precision < s_len)
+ s_len = precision;
+ }
+ else {
+ s = S_NULL;
+ s_len = S_NULL_LEN;
+ }
+ pad_char = ' ';
+ }
+#else
+ char_buf[0] = '0';
+ s = &char_buf[0];
+ s_len = 1;
+ pad_char = ' ';
+#endif
+ break;
+
case NUL:
/* if %p ends the string, oh well ignore it */
continue;