diff options
author | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2005-06-17 12:12:36 +0000 |
---|---|---|
committer | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2005-06-17 12:12:36 +0000 |
commit | 212748ebc37a276a785b6b26acfae8cc6eeb515f (patch) | |
tree | f6c6d295b7bc1fc2957720edab290035c0a5ae44 /strings | |
parent | f716c643d5eac3af81dc7f0a2a224ad813520c9f (diff) | |
download | libapr-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')
-rw-r--r-- | strings/apr_snprintf.c | 46 |
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; |