strformatrt.cpp revision e9a584ee0777ab2612e206eeec264ccb1a8ce333
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/* $Id$ */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/** @file
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * IPRT - IPRT String Formatter Extensions.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/*
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync *
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 *
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 *
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 *
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 */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/** @page pg_rt_str_format_rt The IPRT String Format Extensions
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync *
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 *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync *
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.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync *
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync *
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.
80e46f984efd827517661c0e081a36014ca41af8vboxsync *
80e46f984efd827517661c0e081a36014ca41af8vboxsync *
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.
1dc37bff2fb26897f5892d8330fe2bc0c9859aecvboxsync *
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.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync *
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 *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * - \%Rfn - Pretty printing of a function or method. It drops the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * return code and parameter list.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * On other platforms, \%Rw? simply prints the argument in a form of 0xXXXXXXXX.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync *
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync *
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * Group 4, structure dumpers.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync *
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * - \%RDtimespec - Takes a PCRTTIMESPEC.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync *
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/*******************************************************************************
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync* Header Files *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync*******************************************************************************/
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#define LOG_GROUP RTLOGGROUP_STRING
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync#include <iprt/log.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/string.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/assert.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/string.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#include <iprt/stdarg.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync#ifdef IN_RING3
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync# include <iprt/thread.h>
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync# include <iprt/err.h>
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync#endif
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync#include <iprt/time.h>
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync#include <iprt/ctype.h>
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync#include "internal/string.h"
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync/**
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Callback to format iprt formatting extentions.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * See @ref pg_rt_str_format_rt for a reference on the format types.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync *
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'.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsyncsize_t rtstrFormatRt(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, const char **ppszFormat, va_list *pArgs, int cchWidth, int cchPrecision, unsigned fFlags, char chArgSize)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync{
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync const char *pszFormatOrg = *ppszFormat;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync char ch = *(*ppszFormat)++;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync if (ch == 'R')
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync ch = *(*ppszFormat)++;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync switch (ch)
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync /*
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync * Groups 1 and 2.
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync */
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'T':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'G':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'H':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'R':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'C':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'I':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'X':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'U':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
6febf3149010855617e4a37e2c49f93d68930d44vboxsync /*
6febf3149010855617e4a37e2c49f93d68930d44vboxsync * Interpret the type.
6febf3149010855617e4a37e2c49f93d68930d44vboxsync */
6febf3149010855617e4a37e2c49f93d68930d44vboxsync typedef enum { RTSF_INT, RTSF_INTW, RTSF_FP16, RTSF_FP32, RTSF_FP64, RTSF_UUID, RTSF_BOOL } RTSF;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync static const struct
6febf3149010855617e4a37e2c49f93d68930d44vboxsync {
6febf3149010855617e4a37e2c49f93d68930d44vboxsync uint8_t cch; /**< the length of the string. */
6febf3149010855617e4a37e2c49f93d68930d44vboxsync char sz[10]; /**< the part following 'R'. */
6febf3149010855617e4a37e2c49f93d68930d44vboxsync uint8_t cb; /**< the size of the type. */
63b785c3291332a86a9bc473e68f08121368898bvboxsync uint8_t u8Base; /**< the size of the type. */
63b785c3291332a86a9bc473e68f08121368898bvboxsync RTSF enmFormat; /**< The way to format it. */
63b785c3291332a86a9bc473e68f08121368898bvboxsync uint16_t fFlags; /**< additional RTSTR_F_* flags. */
63b785c3291332a86a9bc473e68f08121368898bvboxsync }
63b785c3291332a86a9bc473e68f08121368898bvboxsync /** Sorted array of types, looked up using binary search! */
63b785c3291332a86a9bc473e68f08121368898bvboxsync s_aTypes[] =
63b785c3291332a86a9bc473e68f08121368898bvboxsync {
63b785c3291332a86a9bc473e68f08121368898bvboxsync#define STRMEM(str) sizeof(str) - 1, str
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 },
80626cd34607c5dbf3f0af51b32396ce58bf493bvboxsync { STRMEM("Cu"), sizeof(RTUINT), 10, RTSF_INT, 0 },
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync { STRMEM("Cv"), sizeof(void *), 16, RTSF_INTW, 0 },
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync { STRMEM("Cx"), sizeof(RTUINT), 16, RTSF_INT, 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 },
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync#undef STRMEM
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync };
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync const char *pszType = *ppszFormat - 1;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync int iStart = 0;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync int iEnd = RT_ELEMENTS(s_aTypes) - 1;
48dafba24ef28f07a241e5857a43b327822574a8vboxsync int i = RT_ELEMENTS(s_aTypes) / 2;
48dafba24ef28f07a241e5857a43b327822574a8vboxsync
48dafba24ef28f07a241e5857a43b327822574a8vboxsync union
48dafba24ef28f07a241e5857a43b327822574a8vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync uint8_t u8;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync uint16_t u16;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync uint32_t u32;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync uint64_t u64;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync int8_t i8;
06782e19f5e2144408396dcec922c423c5ef9da8vboxsync int16_t i16;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync int32_t i32;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync int64_t i64;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync RTFAR16 fp16;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync RTFAR32 fp32;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync RTFAR64 fp64;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync bool fBool;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync PCRTUUID pUuid;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync } u;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync char szBuf[80];
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync unsigned cch;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync AssertMsg(!chArgSize, ("Not argument size '%c' for RT types! '%.10s'\n", chArgSize, pszFormatOrg));
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /*
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Lookup the type - binary search.
194a8ad893b721dfc22ac5f955671f09db015a3fvboxsync */
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync for (;;)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync int iDiff = strncmp(pszType, s_aTypes[i].sz, s_aTypes[i].cch);
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync if (!iDiff)
e073b07dcb5c9827f0530a9bfa2643356c5656dbvboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if (iEnd == iStart)
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync AssertMsgFailed(("Invalid format type '%.10s'!\n", pszFormatOrg));
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync return 0;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
508452243fd3328f7b9e0405d39fb9dc004e31b8vboxsync if (iDiff < 0)
508452243fd3328f7b9e0405d39fb9dc004e31b8vboxsync iEnd = i - 1;
f409459bdd4c15cdb8d7fb6c6d54338cce9ac814vboxsync else
f409459bdd4c15cdb8d7fb6c6d54338cce9ac814vboxsync iStart = i + 1;
f409459bdd4c15cdb8d7fb6c6d54338cce9ac814vboxsync if (iEnd < iStart)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync AssertMsgFailed(("Invalid format type '%.10s'!\n", pszFormatOrg));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return 0;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync i = iStart + (iEnd - iStart) / 2;
bc04c0fb1382c98fb74fb38ac5dbd3f06ea6a92bvboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /*
bc04c0fb1382c98fb74fb38ac5dbd3f06ea6a92bvboxsync * Advance the format string and merge flags.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync *ppszFormat += s_aTypes[i].cch - 1;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync fFlags |= s_aTypes[i].fFlags;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Fetch the argument.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * It's important that a signed value gets sign-extended up to 64-bit.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.u64 = 0;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (fFlags & RTSTR_F_VALSIGNED)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync switch (s_aTypes[i].cb)
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync {
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync case sizeof(int8_t):
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync u.i64 = va_arg(*pArgs, /*int8_t*/int);
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync fFlags |= RTSTR_F_8BIT;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync break;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync case sizeof(int16_t):
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync u.i64 = va_arg(*pArgs, /*int16_t*/int);
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync fFlags |= RTSTR_F_16BIT;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync break;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync case sizeof(int32_t):
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync u.i64 = va_arg(*pArgs, int32_t);
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync fFlags |= RTSTR_F_32BIT;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync break;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync case sizeof(int64_t):
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync u.i64 = va_arg(*pArgs, int64_t);
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync fFlags |= RTSTR_F_64BIT;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync break;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync default:
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync AssertMsgFailed(("Invalid format error, size %d'!\n", s_aTypes[i].cb));
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync break;
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync switch (s_aTypes[i].cb)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(uint8_t):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.u8 = va_arg(*pArgs, /*uint8_t*/unsigned);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync fFlags |= RTSTR_F_8BIT;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(uint16_t):
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync u.u16 = va_arg(*pArgs, /*uint16_t*/unsigned);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync fFlags |= RTSTR_F_16BIT;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(uint32_t):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.u32 = va_arg(*pArgs, uint32_t);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync fFlags |= RTSTR_F_32BIT;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(uint64_t):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.u64 = va_arg(*pArgs, uint64_t);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync fFlags |= RTSTR_F_64BIT;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(RTFAR32):
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.fp32 = va_arg(*pArgs, RTFAR32);
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case sizeof(RTFAR64):
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync u.fp64 = va_arg(*pArgs, RTFAR64);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync default:
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync AssertMsgFailed(("Invalid format error, size %d'!\n", s_aTypes[i].cb));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Format the output.
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync switch (s_aTypes[i].enmFormat)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync case RTSF_INT:
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync cch = RTStrFormatNumber(szBuf, u.u64, s_aTypes[i].u8Base, cchWidth, cchPrecision, fFlags);
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync break;
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync }
df2a53dee17325742e7464e7f53d3f99dc500f3avboxsync
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync /* hex which defaults to max width. */
6320f517ddc16e8d8dd450a47edfaab81f67942avboxsync case RTSF_INTW:
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync {
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync Assert(s_aTypes[i].u8Base == 16);
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync if (cchWidth < 0)
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync {
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync cchWidth = s_aTypes[i].cb * 2 + (fFlags & RTSTR_F_SPECIAL ? 2 : 0);
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync fFlags |= RTSTR_F_ZEROPAD;
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync }
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync cch = RTStrFormatNumber(szBuf, u.u64, s_aTypes[i].u8Base, cchWidth, cchPrecision, fFlags);
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync break;
9113fcf881235e2b3df9ce4760b299c929ac3a62vboxsync }
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case RTSF_FP16:
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
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);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Assert(cch == 4);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync szBuf[4] = ':';
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync cch = RTStrFormatNumber(&szBuf[5], u.fp16.off, 16, 4, -1, fFlags | RTSTR_F_16BIT);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Assert(cch == 4);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch = 4 + 1 + 4;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case RTSF_FP32:
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
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);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Assert(cch == 4);
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync szBuf[4] = ':';
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync cch = RTStrFormatNumber(&szBuf[5], u.fp32.off, 16, 8, -1, fFlags | RTSTR_F_32BIT);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Assert(cch == 8);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch = 4 + 1 + 8;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync break;
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case RTSF_FP64:
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync {
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 Assert(cch == 4);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync szBuf[4] = ':';
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch = RTStrFormatNumber(&szBuf[5], u.fp64.off, 16, 16, -1, fFlags | RTSTR_F_64BIT);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync Assert(cch == 16);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch = 4 + 1 + 16;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case RTSF_UUID:
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync static const char szNull[] = "<NULL>";
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (VALID_PTR(u.pUuid))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
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 u.pUuid->Gen.u32TimeLow,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.pUuid->Gen.u16TimeMid,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.pUuid->Gen.u16TimeHiAndVersion,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.pUuid->Gen.u8ClockSeqHiAndReserved,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.pUuid->Gen.u8ClockSeqLow,
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.pUuid->Gen.au8Node[0],
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.pUuid->Gen.au8Node[1],
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.pUuid->Gen.au8Node[2],
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync u.pUuid->Gen.au8Node[3],
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync u.pUuid->Gen.au8Node[4],
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync u.pUuid->Gen.au8Node[5]);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, szNull, sizeof(szNull) - 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case RTSF_BOOL:
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync static const char szTrue[] = "true ";
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync static const char szFalse[] = "false";
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (u.u64 == 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);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync default:
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Internal error %d\n", s_aTypes[i].enmFormat));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return 0;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync /*
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * Finally, output the formatted string and return.
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync */
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, szBuf, cch);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync /* Group 3 */
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /*
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync * Pretty function / method name printing.
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync */
ba05e6aeed3cd14961a36e0162c29a267b66d7f7vboxsync case 'f':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync char ch = *(*ppszFormat)++;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync switch (ch)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /*
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.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync case 'n':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync const char *pszStart;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync const char *psz = pszStart = va_arg(*pArgs, const char *);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (!VALID_PTR(psz))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, "<null>", sizeof("<null>") - 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync while ((ch = *psz) != '\0' && ch != '(')
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (RT_C_IS_BLANK(ch))
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync psz++;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync while ((ch = *psz) != '\0' && (RT_C_IS_BLANK(ch) || ch == '('))
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync psz++;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (ch)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync pszStart = psz;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else if (ch == '(')
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync psz++;
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, pszStart, psz - pszStart);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync default:
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", ch, pszFormatOrg));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
1207f59aa62006952dbb0bf7700decf34d8caeb2vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /*
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * hex dumping and COM/XPCOM.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'h':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync char ch = *(*ppszFormat)++;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync switch (ch)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /*
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * Hex stuff.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync case 'x':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync uint8_t *pu8 = va_arg(*pArgs, uint8_t *);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (cchWidth <= 0)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cchWidth = 16;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (pu8)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync ch = *(*ppszFormat)++;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync switch (ch)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Regular hex dump.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'd':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync size_t cch = 0;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync int off = 0;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if (cchPrecision <= 0)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cchPrecision = 16;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync while (off < cchWidth)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync int i;
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 cch += pfnOutput(pvArgOutput, " ", 3);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch += pfnOutput(pvArgOutput, " ", 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync for (i = 0; i < cchPrecision && off + i < cchWidth; i++)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync uint8_t u8 = pu8[i];
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync cch += pfnOutput(pvArgOutput, u8 < 127 && u8 >= 32 ? (const char *)&u8 : ".", 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* next */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync pu8 += cchPrecision;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync off += cchPrecision;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return cch;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Hex string.
48dafba24ef28f07a241e5857a43b327822574a8vboxsync */
48dafba24ef28f07a241e5857a43b327822574a8vboxsync case 's':
48dafba24ef28f07a241e5857a43b327822574a8vboxsync {
48dafba24ef28f07a241e5857a43b327822574a8vboxsync if (cchWidth-- > 0)
48dafba24ef28f07a241e5857a43b327822574a8vboxsync {
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync size_t cch = RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%02x", *pu8++);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync for (; cchWidth > 0; cchWidth--, pu8++)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync cch += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, " %02x", *pu8);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return cch;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync default:
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", ch, pszFormatOrg));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, "<null>", sizeof("<null>") - 1);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync#ifdef IN_RING3
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync /*
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * XPCOM / COM status code: %Rhrc, %Rhrf, %Rhra
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * ASSUMES: If Windows Then COM else XPCOM.
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync */
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'r':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync char ch = *(*ppszFormat)++;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync uint32_t hrc = va_arg(*pArgs, uint32_t);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync PCRTCOMERRMSG pMsg = RTErrCOMGet(hrc);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync switch (ch)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
93771df67d4047d8b965665899b6a5bdf06ae277vboxsync case 'c':
93771df67d4047d8b965665899b6a5bdf06ae277vboxsync return pfnOutput(pvArgOutput, pMsg->pszDefine, strlen(pMsg->pszDefine));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'f':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszMsgFull,strlen(pMsg->pszMsgFull));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'a':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%s (0x%08X) - %s", pMsg->pszDefine, hrc, pMsg->pszMsgFull);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync default:
80e46f984efd827517661c0e081a36014ca41af8vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return 0;
80e46f984efd827517661c0e081a36014ca41af8vboxsync }
80e46f984efd827517661c0e081a36014ca41af8vboxsync break;
80e46f984efd827517661c0e081a36014ca41af8vboxsync }
80e46f984efd827517661c0e081a36014ca41af8vboxsync#endif /* IN_RING3 */
80e46f984efd827517661c0e081a36014ca41af8vboxsync
80e46f984efd827517661c0e081a36014ca41af8vboxsync default:
80e46f984efd827517661c0e081a36014ca41af8vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", ch, pszFormatOrg));
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync return 0;
06782e19f5e2144408396dcec922c423c5ef9da8vboxsync
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync }
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync break;
dbfa5765a2a72c30564ef1bd950720e89a06c96avboxsync }
dbfa5765a2a72c30564ef1bd950720e89a06c96avboxsync
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync /*
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync * iprt status code: %Vrc, %Vrs, %Vrf, %Vra.
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync */
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync case 'r':
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync {
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync int rc = va_arg(*pArgs, int);
3221176430afca4d1be145b04bf50163fab4fdb1vboxsync char ch = *(*ppszFormat)++;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync#ifdef IN_RING3 /* we don't want this anywhere else yet. */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync PCRTSTATUSMSG pMsg = RTErrGet(rc);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync switch (ch)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'c':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszDefine, strlen(pMsg->pszDefine));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 's':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszMsgShort, strlen(pMsg->pszMsgShort));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'f':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszMsgFull, strlen(pMsg->pszMsgFull));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'a':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%s (%d) - %s", pMsg->pszDefine, rc, pMsg->pszMsgFull);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync default:
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return 0;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync#else /* !IN_RING3 */
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync switch (ch)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'c':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 's':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'f':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'a':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%d", rc);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync default:
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return 0;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync#endif /* !IN_RING3 */
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync#if defined(IN_RING3)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Windows status code: %Rwc, %Rwf, %Rwa
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'w':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync long rc = va_arg(*pArgs, long);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync char ch = *(*ppszFormat)++;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync# if defined(RT_OS_WINDOWS)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync PCRTWINERRMSG pMsg = RTErrWinGet(rc);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync# endif
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync switch (ch)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync# if defined(RT_OS_WINDOWS)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'c':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return pfnOutput(pvArgOutput, pMsg->pszDefine, strlen(pMsg->pszDefine));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'f':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return pfnOutput(pvArgOutput, pMsg->pszMsgFull,strlen(pMsg->pszMsgFull));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'a':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "%s (0x%08X) - %s", pMsg->pszDefine, rc, pMsg->pszMsgFull);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync# else
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'c':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'f':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case 'a':
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "0x%08X", rc);
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync# endif
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync default:
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync AssertMsgFailed(("Invalid status code format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return 0;
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync break;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync#endif /* IN_RING3 */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Group 4, structure dumpers.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync case 'D':
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Interpret the type.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync typedef enum
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync RTST_TIMESPEC
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync } RTST;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync/** Set if it's a pointer */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync#define RTST_FLAGS_POINTER RT_BIT(0)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync static const struct
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync {
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync uint8_t cch; /**< the length of the string. */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync char sz[16-2]; /**< the part following 'R'. */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync uint8_t cb; /**< the size of the argument. */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync uint8_t fFlags; /**< RTST_FLAGS_* */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync RTST enmType; /**< The structure type. */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /** Sorted array of types, looked up using binary search! */
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync s_aTypes[] =
63b785c3291332a86a9bc473e68f08121368898bvboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync#define STRMEM(str) sizeof(str) - 1, str
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync { STRMEM("Dtimespec"), sizeof(PCRTTIMESPEC), RTST_FLAGS_POINTER, RTST_TIMESPEC},
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync#undef STRMEM
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync };
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync const char *pszType = *ppszFormat - 1;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync int iStart = 0;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync int iEnd = RT_ELEMENTS(s_aTypes) - 1;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync int i = RT_ELEMENTS(s_aTypes) / 2;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync union
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync const void *pv;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync uint64_t u64;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync PCRTTIMESPEC pTimeSpec;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync } u;
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync AssertMsg(!chArgSize, ("Not argument size '%c' for RT types! '%.10s'\n", chArgSize, pszFormatOrg));
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync /*
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync * Lookup the type - binary search.
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync */
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync for (;;)
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync {
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync int iDiff = strncmp(pszType, s_aTypes[i].sz, s_aTypes[i].cch);
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync if (!iDiff)
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync break;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (iEnd == iStart)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Invalid format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return 0;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (iDiff < 0)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync iEnd = i - 1;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync else
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync iStart = i + 1;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync if (iEnd < iStart)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync AssertMsgFailed(("Invalid format type '%.10s'!\n", pszFormatOrg));
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync return 0;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync i = iStart + (iEnd - iStart) / 2;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync }
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync *ppszFormat += s_aTypes[i].cch - 1;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync /*
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync * Fetch the argument.
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync */
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync u.u64 = 0;
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync switch (s_aTypes[i].cb)
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync {
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync case sizeof(const void *):
051eba4436f9c682f7873390fb327e8eceb9e0efvboxsync u.pv = va_arg(*pArgs, const void *);
6febf3149010855617e4a37e2c49f93d68930d44vboxsync break;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync default:
6febf3149010855617e4a37e2c49f93d68930d44vboxsync AssertMsgFailed(("Invalid format error, size %d'!\n", s_aTypes[i].cb));
6febf3149010855617e4a37e2c49f93d68930d44vboxsync break;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync }
6febf3149010855617e4a37e2c49f93d68930d44vboxsync
6febf3149010855617e4a37e2c49f93d68930d44vboxsync /*
6febf3149010855617e4a37e2c49f93d68930d44vboxsync * If it's a pointer, we'll check if it's valid before going on.
6febf3149010855617e4a37e2c49f93d68930d44vboxsync */
6febf3149010855617e4a37e2c49f93d68930d44vboxsync if ((s_aTypes[i].fFlags & RTST_FLAGS_POINTER) && !VALID_PTR(u.pv))
6febf3149010855617e4a37e2c49f93d68930d44vboxsync return pfnOutput(pvArgOutput, "<null>", sizeof("<null>") - 1);
dfb2e698385f22ba39053f27fe2711e463acd3a1vboxsync
dfb2e698385f22ba39053f27fe2711e463acd3a1vboxsync /*
6febf3149010855617e4a37e2c49f93d68930d44vboxsync * Format the output.
6febf3149010855617e4a37e2c49f93d68930d44vboxsync */
6febf3149010855617e4a37e2c49f93d68930d44vboxsync switch (s_aTypes[i].enmType)
dfb2e698385f22ba39053f27fe2711e463acd3a1vboxsync {
dfb2e698385f22ba39053f27fe2711e463acd3a1vboxsync case RTST_TIMESPEC:
6febf3149010855617e4a37e2c49f93d68930d44vboxsync return RTStrFormat(pfnOutput, pvArgOutput, NULL, NULL, "%lld ns", RTTimeSpecGetNano(u.pTimeSpec));
6febf3149010855617e4a37e2c49f93d68930d44vboxsync
6febf3149010855617e4a37e2c49f93d68930d44vboxsync default:
6febf3149010855617e4a37e2c49f93d68930d44vboxsync AssertMsgFailed(("Invalid/unhandled enmType=%d\n", s_aTypes[i].enmType));
6febf3149010855617e4a37e2c49f93d68930d44vboxsync break;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync }
6febf3149010855617e4a37e2c49f93d68930d44vboxsync break;
6febf3149010855617e4a37e2c49f93d68930d44vboxsync }
6febf3149010855617e4a37e2c49f93d68930d44vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /*
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Invalid/Unknown. Bitch about it.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync */
63b785c3291332a86a9bc473e68f08121368898bvboxsync default:
63b785c3291332a86a9bc473e68f08121368898bvboxsync AssertMsgFailed(("Invalid VBox format type '%.10s'!\n", pszFormatOrg));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync break;
63b785c3291332a86a9bc473e68f08121368898bvboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync }
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync else
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync AssertMsgFailed(("Invalid VBox format type '%.10s'!\n", pszFormatOrg));
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync NOREF(pszFormatOrg);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync return 0;
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync}
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync