VirtualBox

Changeset 60028 in vbox for trunk/src/VBox/Runtime/common


Ignore:
Timestamp:
Mar 15, 2016 10:39:16 AM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
106008
Message:

iprt: Added simple (and untested) RTAsn1Integer_ToString implemented. Added spacing flags to RTStrPrintHexBytes (also untested).

Location:
trunk/src/VBox/Runtime/common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/asn1/asn1-ut-integer.cpp

    r57358 r60028  
    55
    66/*
    7  * Copyright (C) 2006-2015 Oracle Corporation
     7 * Copyright (C) 2006-2016 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    338338
    339339
     340RTDECL(int) RTAsn1Integer_ToString(PRTASN1INTEGER pThis, char *pszBuf, size_t cbBuf, uint32_t fFlags, size_t *pcbActual)
     341{
     342    AssertReturn(RTAsn1Integer_IsPresent(pThis), VERR_INVALID_PARAMETER);
     343    AssertReturn(fFlags == 0, VERR_INVALID_FLAGS);
     344
     345    /*
     346     * We only do hex conversions via this API.
     347     * Currently we consider all numbers to be unsigned.
     348     */
     349    /** @todo Signed ASN.1 INTEGER. */
     350    int rc;
     351    size_t cbActual;
     352    if (pThis->Asn1Core.cb <= 8)
     353    {
     354        cbActual = 2 + pThis->Asn1Core.cb*2 + 1;
     355        if (cbActual <= cbBuf)
     356        {
     357            ssize_t cchFormat = RTStrFormatU64(pszBuf, cbBuf, pThis->uValue.u, 16, cbActual - 1 /*cchWidth*/, 0,
     358                                               RTSTR_F_SPECIAL | RTSTR_F_ZEROPAD);
     359            AssertStmt(cchFormat == (ssize_t)cbActual - 1, rc = VERR_INTERNAL_ERROR_3);
     360        }
     361        else
     362            rc = VERR_BUFFER_OVERFLOW;
     363    }
     364    else
     365    {
     366        cbActual = pThis->Asn1Core.cb * 3 - 1 /* save one separator */ + 1 /* terminator */;
     367        if (cbActual <= cbBuf)
     368        {
     369            rc = RTStrPrintHexBytes(pszBuf, cbBuf, pThis->Asn1Core.uData.pv, pThis->Asn1Core.cb, RTSTRPRINTHEXBYTES_F_SEP_SPACE);
     370            Assert(rc == VINF_SUCCESS);
     371        }
     372        else
     373            rc = VERR_BUFFER_OVERFLOW;
     374    }
     375    if (pcbActual)
     376        *pcbActual = cbActual;
     377    return rc;
     378}
     379
    340380
    341381/*
  • trunk/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp

    r57358 r60028  
    55
    66/*
    7  * Copyright (C) 2009-2015 Oracle Corporation
     7 * Copyright (C) 2009-2016 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3636
    3737
    38 RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cchBuf, void const *pv, size_t cb, uint32_t fFlags)
     38RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cbBuf, void const *pv, size_t cb, uint32_t fFlags)
    3939{
    40     AssertReturn(!(fFlags & ~RTSTRPRINTHEXBYTES_F_UPPER), VERR_INVALID_PARAMETER);
     40    AssertReturn(   !(fFlags & ~(RTSTRPRINTHEXBYTES_F_UPPER | RTSTRPRINTHEXBYTES_F_SEP_SPACE | RTSTRPRINTHEXBYTES_F_SEP_COLON))
     41                 &&    (fFlags & (RTSTRPRINTHEXBYTES_F_SEP_SPACE | RTSTRPRINTHEXBYTES_F_SEP_COLON))
     42                    != (RTSTRPRINTHEXBYTES_F_SEP_SPACE | RTSTRPRINTHEXBYTES_F_SEP_COLON),
     43                 VERR_INVALID_FLAGS);
    4144    AssertPtrReturn(pszBuf, VERR_INVALID_POINTER);
    4245    AssertReturn(cb * 2 >= cb, VERR_BUFFER_OVERFLOW);
    43     AssertReturn(cchBuf >= cb * 2 + 1, VERR_BUFFER_OVERFLOW);
     46    char const chSep = fFlags & RTSTRPRINTHEXBYTES_F_SEP_SPACE ? ' '
     47                     : fFlags & RTSTRPRINTHEXBYTES_F_SEP_COLON ? ':' : '\0';
     48    AssertReturn(cbBuf >= cb * (2 + (chSep != '\0')) - (chSep != '\0') + 1, VERR_BUFFER_OVERFLOW);
    4449    if (cb)
    4550        AssertPtrReturn(pv, VERR_INVALID_POINTER);
     
    5055
    5156    uint8_t const *pb = (uint8_t const *)pv;
    52     while (cb-- > 0)
     57
     58    if (!chSep)
     59    {
     60        while (cb-- > 0)
     61        {
     62            uint8_t b = *pb++;
     63            *pszBuf++ = pszHexDigits[b >> 4];
     64            *pszBuf++ = pszHexDigits[b & 0xf];
     65        }
     66    }
     67    else if (cb-- > 0)
    5368    {
    5469        uint8_t b = *pb++;
    5570        *pszBuf++ = pszHexDigits[b >> 4];
    5671        *pszBuf++ = pszHexDigits[b & 0xf];
     72
     73        while (cb-- > 0)
     74        {
     75            b = *pb++;
     76            *pszBuf++ = chSep;
     77            *pszBuf++ = pszHexDigits[b >> 4];
     78            *pszBuf++ = pszHexDigits[b & 0xf];
     79        }
    5780    }
     81
    5882    *pszBuf = '\0';
    5983    return VINF_SUCCESS;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette