strformatrt.cpp revision e9a584ee0777ab2612e206eeec264ccb1a8ce333
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * IPRT - IPRT String Formatter Extensions.
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * available from http://www.virtualbox.org. This file is free software;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * you can redistribute it and/or modify it under the terms of the GNU
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * General Public License (GPL) as published by the Free Software
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * The contents of this file may alternatively be used under the terms
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * of the Common Development and Distribution License Version 1.0
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * VirtualBox OSE distribution, in which case the provisions of the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * CDDL are applicable instead of those of the GPL.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * You may elect to license modified versions of this file under the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * terms and conditions of either the GPL or the CDDL or both.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * additional information or have any questions.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/** @page pg_rt_str_format_rt The IPRT String Format Extensions
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * The string formatter supports most of the non-float format types and flags.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * See RTStrFormatV() for the full tail there. In addition we've added a number
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * of iprt specific format types for the iprt typedefs and other useful stuff.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Note that several of these are similar to \%p and doesn't care much if you try
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * add formating flags/width/precision.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Group 1, the basic runtime typedefs (excluding those which obviously are pointer).
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%RTbool - Takes a bool value and prints 'true', 'false', or '!%d!'.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%RTfile - Takes a #RTFILE value.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%RTfmode - Takes a #RTFMODE value.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%RTfoff - Takes a #RTFOFF value.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * - \%RTfp16 - Takes a #RTFAR16 value.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%RTfp32 - Takes a #RTFAR32 value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTfp64 - Takes a #RTFAR64 value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTgid - Takes a #RTGID value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTino - Takes a #RTINODE value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTint - Takes a #RTINT value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTiop - Takes a #RTIOPORT value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTldrm - Takes a #RTLDRMOD value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTnthrd - Takes a #RTNATIVETHREAD value.
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync * - \%RTproc - Takes a #RTPROCESS value.
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * - \%RTptr - Takes a #RTINTPTR or #RTUINTPTR value (but not void *).
6febf3149010855617e4a37e2c49f93d68930d44vboxsync * - \%RTreg - Takes a #RTCCUINTREG value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTsel - Takes a #RTSEL value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTsem - Takes a #RTSEMEVENT, #RTSEMEVENTMULTI, #RTSEMMUTEX, #RTSEMFASTMUTEX, or #RTSEMRW value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTsock - Takes a #RTSOCKET value.
80e46f984efd827517661c0e081a36014ca41af8vboxsync * - \%RTthrd - Takes a #RTTHREAD value.
80e46f984efd827517661c0e081a36014ca41af8vboxsync * - \%RTuid - Takes a #RTUID value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTuint - Takes a #RTUINT value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTunicp - Takes a #RTUNICP value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTutf16 - Takes a #RTUTF16 value.
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync * - \%RTuuid - Takes a #PCRTUUID and will print the UUID as a string.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RTxuint - Takes a #RTUINT or #RTINT value, formatting it as hex.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RGi - Takes a #RTGCINT value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RGp - Takes a #RTGCPHYS value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RGr - Takes a #RTGCUINTREG value.
48dafba24ef28f07a241e5857a43b327822574a8vboxsync * - \%RGu - Takes a #RTGCUINT value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RGv - Takes a #RTGCPTR, #RTGCINTPTR or #RTGCUINTPTR value.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%RGx - Takes a #RTGCUINT or #RTGCINT value, formatting it as hex.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%RHi - Takes a #RTHCINT value.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * - \%RHp - Takes a #RTHCPHYS value.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%RHr - Takes a #RTHCUINTREG value.
710a6316a22868b04400caf79719f96c18163cd3vboxsync * - \%RHu - Takes a #RTHCUINT value.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%RHv - Takes a #RTHCPTR, #RTHCINTPTR or #RTHCUINTPTR value.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * - \%RHx - Takes a #RTHCUINT or #RTHCINT value, formatting it as hex.
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync * - \%RRv - Takes a #RTRCPTR, #RTRCINTPTR or #RTRCUINTPTR value.
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync * - \%RCi - Takes a #RTCCINT value.
06782e19f5e2144408396dcec922c423c5ef9da8vboxsync * - \%RCp - Takes a #RTCCPHYS value.
80e46f984efd827517661c0e081a36014ca41af8vboxsync * - \%RCr - Takes a #RTCCUINTREG value.
80e46f984efd827517661c0e081a36014ca41af8vboxsync * - \%RCu - Takes a #RTUINT value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RCv - Takes a #uintptr_t, #intptr_t, void * value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%RCx - Takes a #RTUINT or #RTINT value, formatting it as hex.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * Group 2, the generic integer types which are prefered over relying on what
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * bit-count a 'long', 'short', or 'long long' has on a platform. This are
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync * highly prefered for the [u]intXX_t kind of types.
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * - \%RI[8|16|32|64] - Signed integer value of the specifed bit count.
6febf3149010855617e4a37e2c49f93d68930d44vboxsync * - \%RU[8|16|32|64] - Unsigned integer value of the specifed bit count.
63b785c3291332a86a9bc473e68f08121368898bvboxsync * - \%RX[8|16|32|64] - Hexadecimal integer value of the specifed bit count.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Group 3, hex dumpers and other complex stuff which requires more than simple formatting.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%Rhxd - Takes a pointer to the memory which is to be dumped in typical
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * hex format. Use the width to specify the length, and the precision to
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * set the number of bytes per line. Default width and precision is 16.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%Rhxs - Takes a pointer to the memory to be displayed as a hex string,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * i.e. a series of space separated bytes formatted as two digit hex value.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Use the width to specify the length. Default length is 16 bytes.
48dafba24ef28f07a241e5857a43b327822574a8vboxsync * - \%Rrc - Takes an integer iprt status code as argument. Will insert the
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * status code define corresponding to the iprt status code.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * - \%Rrs - Takes an integer iprt status code as argument. Will insert the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * short description of the specified status code.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%Rrf - Takes an integer iprt status code as argument. Will insert the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * full description of the specified status code.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%Rra - Takes an integer iprt status code as argument. Will insert the
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync * status code define + full description.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%Rt - Current thread (RTThreadSelf()), no arguments.
fb1975a6972d89de9e515bed0248db93f04ec9d8vboxsync * - \%Rwc - Takes a long Windows error code as argument. Will insert the status
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * code define corresponding to the Windows error code.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%Rwf - Takes a long Windows error code as argument. Will insert the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * full description of the specified status code.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%Rwa - Takes a long Windows error code as argument. Will insert the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * error code define + full description.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * - \%Rhrc - Takes a COM/XPCOM status code as argument. Will insert the status
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * code define corresponding to the Windows error code.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%Rhrf - Takes a COM/XPCOM status code as argument. Will insert the
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * full description of the specified status code.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%Rhra - Takes a COM/XPCOM error code as argument. Will insert the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * error code define + full description.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%Rfn - Pretty printing of a function or method. It drops the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * return code and parameter list.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * On other platforms, \%Rw? simply prints the argument in a form of 0xXXXXXXXX.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * Group 4, structure dumpers.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * - \%RDtimespec - Takes a PCRTTIMESPEC.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/*******************************************************************************
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync* Header Files *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync*******************************************************************************/
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Callback to format iprt formatting extentions.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * See @ref pg_rt_str_format_rt for a reference on the format types.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * @returns The number of bytes formatted.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * @param pfnOutput Pointer to output function.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * @param pvArgOutput Argument for the output function.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * @param ppszFormat Pointer to the format string pointer. Advance this till the char
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * after the format specifier.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * @param pArgs Pointer to the argument list. Use this to fetch the arguments.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * @param cchWidth Format Width. -1 if not specified.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * @param cchPrecision Format Precision. -1 if not specified.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * @param fFlags Flags (RTSTR_NTFS_*).
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * @param chArgSize The argument size specifier, 'l' or 'L'.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsyncsize_t rtstrFormatRt(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, const char **ppszFormat, va_list *pArgs, int cchWidth, int cchPrecision, unsigned fFlags, char chArgSize)
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync * Groups 1 and 2.
6febf3149010855617e4a37e2c49f93d68930d44vboxsync * Interpret the type.
6febf3149010855617e4a37e2c49f93d68930d44vboxsync typedef enum { RTSF_INT, RTSF_INTW, RTSF_FP16, RTSF_FP32, RTSF_FP64, RTSF_UUID, RTSF_BOOL } RTSF;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync static const struct
63b785c3291332a86a9bc473e68f08121368898bvboxsync uint16_t fFlags; /**< additional RTSTR_F_* flags. */
63b785c3291332a86a9bc473e68f08121368898bvboxsync /** Sorted array of types, looked up using binary search! */
63b785c3291332a86a9bc473e68f08121368898bvboxsync { STRMEM("Ci"), sizeof(RTINT), 10, RTSF_INT, RTSTR_F_VALSIGNED },
80626cd34607c5dbf3f0af51b32396ce58bf493bvboxsync { STRMEM("Cp"), sizeof(RTGCPHYS), 16, RTSF_INTW, 0 },
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync { STRMEM("Cr"), sizeof(RTCCUINTREG), 16, RTSF_INTW, 0 },
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync { STRMEM("Cv"), sizeof(void *), 16, RTSF_INTW, 0 },
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync { STRMEM("Gi"), sizeof(RTGCINT), 10, RTSF_INT, RTSTR_F_VALSIGNED },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Gp"), sizeof(RTGCPHYS), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Gr"), sizeof(RTGCUINTREG), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Gu"), sizeof(RTGCUINT), 10, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Gv"), sizeof(RTGCPTR), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Gx"), sizeof(RTGCUINT), 16, RTSF_INT, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Hi"), sizeof(RTHCINT), 10, RTSF_INT, RTSTR_F_VALSIGNED },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Hp"), sizeof(RTHCPHYS), 16, RTSF_INTW, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Hr"), sizeof(RTGCUINTREG), 16, RTSF_INTW, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Hu"), sizeof(RTHCUINT), 10, RTSF_INT, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Hv"), sizeof(RTHCPTR), 16, RTSF_INTW, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Hx"), sizeof(RTHCUINT), 16, RTSF_INT, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("I16"), sizeof(int16_t), 10, RTSF_INT, RTSTR_F_VALSIGNED },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("I32"), sizeof(int32_t), 10, RTSF_INT, RTSTR_F_VALSIGNED },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("I64"), sizeof(int64_t), 10, RTSF_INT, RTSTR_F_VALSIGNED },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("I8"), sizeof(int8_t), 10, RTSF_INT, RTSTR_F_VALSIGNED },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Rv"), sizeof(RTRCPTR), 16, RTSF_INTW, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tbool"), sizeof(bool), 10, RTSF_BOOL, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tfile"), sizeof(RTFILE), 10, RTSF_INT, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tfmode"), sizeof(RTFMODE), 16, RTSF_INTW, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tfoff"), sizeof(RTFOFF), 10, RTSF_INT, RTSTR_F_VALSIGNED },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tfp16"), sizeof(RTFAR16), 16, RTSF_FP16, RTSTR_F_ZEROPAD },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tfp32"), sizeof(RTFAR32), 16, RTSF_FP32, RTSTR_F_ZEROPAD },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tfp64"), sizeof(RTFAR64), 16, RTSF_FP64, RTSTR_F_ZEROPAD },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tgid"), sizeof(RTGID), 10, RTSF_INT, RTSTR_F_VALSIGNED },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tino"), sizeof(RTINODE), 16, RTSF_INTW, 0 },
80e46f984efd827517661c0e081a36014ca41af8vboxsync { STRMEM("Tint"), sizeof(RTINT), 10, RTSF_INT, RTSTR_F_VALSIGNED },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tiop"), sizeof(RTIOPORT), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tldrm"), sizeof(RTLDRMOD), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tnthrd"), sizeof(RTNATIVETHREAD), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tproc"), sizeof(RTPROCESS), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tptr"), sizeof(RTUINTPTR), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Treg"), sizeof(RTCCUINTREG), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tsel"), sizeof(RTSEL), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tsem"), sizeof(RTSEMEVENT), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tsock"), sizeof(RTSOCKET), 10, RTSF_INT, 0 },
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync { STRMEM("Tthrd"), sizeof(RTTHREAD), 16, RTSF_INTW, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tuid"), sizeof(RTUID), 10, RTSF_INT, RTSTR_F_VALSIGNED },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tuint"), sizeof(RTUINT), 10, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tunicp"), sizeof(RTUNICP), 16, RTSF_INTW, RTSTR_F_ZEROPAD },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tutf16"), sizeof(RTUTF16), 16, RTSF_INTW, RTSTR_F_ZEROPAD },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Tuuid"), sizeof(PCRTUUID), 16, RTSF_UUID, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("Txint"), sizeof(RTUINT), 16, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("U16"), sizeof(uint16_t), 10, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("U32"), sizeof(uint32_t), 10, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("U64"), sizeof(uint64_t), 10, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("U8"), sizeof(uint8_t), 10, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("X16"), sizeof(uint16_t), 16, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("X32"), sizeof(uint32_t), 16, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("X64"), sizeof(uint64_t), 16, RTSF_INT, 0 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync { STRMEM("X8"), sizeof(uint8_t), 16, RTSF_INT, 0 },
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync AssertMsg(!chArgSize, ("Not argument size '%c' for RT types! '%.10s'\n", chArgSize, pszFormatOrg));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Lookup the type - binary search.
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync int iDiff = strncmp(pszType, s_aTypes[i].sz, s_aTypes[i].cch);
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync AssertMsgFailed(("Invalid format type '%.10s'!\n", pszFormatOrg));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync AssertMsgFailed(("Invalid format type '%.10s'!\n", pszFormatOrg));
bc04c0fb1382c98fb74fb38ac5dbd3f06ea6a92bvboxsync * Advance the format string and merge flags.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Fetch the argument.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * It's important that a signed value gets sign-extended up to 64-bit.
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync case sizeof(int8_t):
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync case sizeof(int16_t):
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync case sizeof(int32_t):
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync case sizeof(int64_t):
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync AssertMsgFailed(("Invalid format error, size %d'!\n", s_aTypes[i].cb));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(uint8_t):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(uint16_t):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(uint32_t):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(uint64_t):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(RTFAR32):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(RTFAR64):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync AssertMsgFailed(("Invalid format error, size %d'!\n", s_aTypes[i].cb));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Format the output.
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync cch = RTStrFormatNumber(szBuf, u.u64, s_aTypes[i].u8Base, cchWidth, cchPrecision, fFlags);
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync /* hex which defaults to max width. */
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync cchWidth = s_aTypes[i].cb * 2 + (fFlags & RTSTR_F_SPECIAL ? 2 : 0);
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync cch = RTStrFormatNumber(szBuf, u.u64, s_aTypes[i].u8Base, cchWidth, cchPrecision, fFlags);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync fFlags &= ~(RTSTR_F_VALSIGNED | RTSTR_F_BIT_MASK | RTSTR_F_WIDTH | RTSTR_F_PRECISION);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch = RTStrFormatNumber(&szBuf[0], u.fp16.sel, 16, 4, -1, fFlags | RTSTR_F_16BIT);
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync cch = RTStrFormatNumber(&szBuf[5], u.fp16.off, 16, 4, -1, fFlags | RTSTR_F_16BIT);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync fFlags &= ~(RTSTR_F_VALSIGNED | RTSTR_F_BIT_MASK | RTSTR_F_WIDTH | RTSTR_F_PRECISION);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch = RTStrFormatNumber(&szBuf[0], u.fp32.sel, 16, 4, -1, fFlags | RTSTR_F_16BIT);
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync cch = RTStrFormatNumber(&szBuf[5], u.fp32.off, 16, 8, -1, fFlags | RTSTR_F_32BIT);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync fFlags &= ~(RTSTR_F_VALSIGNED | RTSTR_F_BIT_MASK | RTSTR_F_WIDTH | RTSTR_F_PRECISION);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch = RTStrFormatNumber(&szBuf[0], u.fp64.sel, 16, 4, -1, fFlags | RTSTR_F_16BIT);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch = RTStrFormatNumber(&szBuf[5], u.fp64.off, 16, 16, -1, fFlags | RTSTR_F_64BIT);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* cannot call RTUuidToStr because of GC/R0. */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, szNull, sizeof(szNull) - 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, szTrue, sizeof(szTrue) - 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (u.u64 == 0)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, szFalse, sizeof(szFalse) - 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* invalid boolean value */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "!%lld!", u.u64);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Internal error %d\n", s_aTypes[i].enmFormat));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * Finally, output the formatted string and return.
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync /* Group 3 */
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync * Pretty function / method name printing.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Pretty function / method name printing.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * This isn't 100% right (see classic signal prototype) and it assumes
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * standardized names, but it'll do for today.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync const char *pszStart;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync const char *psz = pszStart = va_arg(*pArgs, const char *);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, "<null>", sizeof("<null>") - 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync while ((ch = *psz) != '\0' && (RT_C_IS_BLANK(ch) || ch == '('))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, pszStart, psz - pszStart);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", ch, pszFormatOrg));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * hex dumping and COM/XPCOM.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * Hex stuff.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Regular hex dump.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%s%0*x %04x:", off ? "\n" : "", sizeof(pu8) * 2, (uintptr_t)pu8, off);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync for (i = 0; i < cchPrecision && off + i < cchWidth ; i++)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync off + i < cchWidth ? !(i & 7) && i ? "-%02x" : " %02x" : " ", pu8[i]);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync while (i++ < cchPrecision)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync for (i = 0; i < cchPrecision && off + i < cchWidth; i++)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch += pfnOutput(pvArgOutput, u8 < 127 && u8 >= 32 ? (const char *)&u8 : ".", 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Hex string.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync size_t cch = RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%02x", *pu8++);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync cch += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, " %02x", *pu8);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", ch, pszFormatOrg));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, "<null>", sizeof("<null>") - 1);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * XPCOM / COM status code: %Rhrc, %Rhrf, %Rhra
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * ASSUMES: If Windows Then COM else XPCOM.
93771df67d4047d8b965665899b6a5bdf06ae277vboxsync return pfnOutput(pvArgOutput, pMsg->pszDefine, strlen(pMsg->pszDefine));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszMsgFull,strlen(pMsg->pszMsgFull));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%s (0x%08X) - %s", pMsg->pszDefine, hrc, pMsg->pszMsgFull);
80e46f984efd827517661c0e081a36014ca41af8vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", pszFormatOrg));
80e46f984efd827517661c0e081a36014ca41af8vboxsync#endif /* IN_RING3 */
80e46f984efd827517661c0e081a36014ca41af8vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", ch, pszFormatOrg));
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync * iprt status code: %Vrc, %Vrs, %Vrf, %Vra.
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync#ifdef IN_RING3 /* we don't want this anywhere else yet. */
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszDefine, strlen(pMsg->pszDefine));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszMsgShort, strlen(pMsg->pszMsgShort));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszMsgFull, strlen(pMsg->pszMsgFull));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%s (%d) - %s", pMsg->pszDefine, rc, pMsg->pszMsgFull);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync#else /* !IN_RING3 */
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%d", rc);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync#endif /* !IN_RING3 */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Windows status code: %Rwc, %Rwf, %Rwa
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszDefine, strlen(pMsg->pszDefine));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, pMsg->pszMsgFull,strlen(pMsg->pszMsgFull));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%s (0x%08X) - %s", pMsg->pszDefine, rc, pMsg->pszMsgFull);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "0x%08X", rc);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", pszFormatOrg));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync#endif /* IN_RING3 */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Group 4, structure dumpers.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Interpret the type.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync typedef enum
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync/** Set if it's a pointer */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync static const struct
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /** Sorted array of types, looked up using binary search! */
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync { STRMEM("Dtimespec"), sizeof(PCRTTIMESPEC), RTST_FLAGS_POINTER, RTST_TIMESPEC},
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync const void *pv;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync AssertMsg(!chArgSize, ("Not argument size '%c' for RT types! '%.10s'\n", chArgSize, pszFormatOrg));
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync * Lookup the type - binary search.
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync int iDiff = strncmp(pszType, s_aTypes[i].sz, s_aTypes[i].cch);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Invalid format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Invalid format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * Fetch the argument.
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case sizeof(const void *):
6febf3149010855617e4a37e2c49f93d68930d44vboxsync AssertMsgFailed(("Invalid format error, size %d'!\n", s_aTypes[i].cb));
6febf3149010855617e4a37e2c49f93d68930d44vboxsync * If it's a pointer, we'll check if it's valid before going on.
6febf3149010855617e4a37e2c49f93d68930d44vboxsync if ((s_aTypes[i].fFlags & RTST_FLAGS_POINTER) && !VALID_PTR(u.pv))
6febf3149010855617e4a37e2c49f93d68930d44vboxsync return pfnOutput(pvArgOutput, "<null>", sizeof("<null>") - 1);
6febf3149010855617e4a37e2c49f93d68930d44vboxsync * Format the output.
6febf3149010855617e4a37e2c49f93d68930d44vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, "%lld ns", RTTimeSpecGetNano(u.pTimeSpec));
6febf3149010855617e4a37e2c49f93d68930d44vboxsync AssertMsgFailed(("Invalid/unhandled enmType=%d\n", s_aTypes[i].enmType));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Invalid/Unknown. Bitch about it.
63b785c3291332a86a9bc473e68f08121368898bvboxsync AssertMsgFailed(("Invalid VBox format type '%.10s'!\n", pszFormatOrg));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync AssertMsgFailed(("Invalid VBox format type '%.10s'!\n", pszFormatOrg));