Changeset 60028 in vbox for trunk/src/VBox/Runtime/common
- Timestamp:
- Mar 15, 2016 10:39:16 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 106008
- 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 5 5 6 6 /* 7 * Copyright (C) 2006-201 5Oracle Corporation7 * Copyright (C) 2006-2016 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 338 338 339 339 340 RTDECL(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 340 380 341 381 /* -
trunk/src/VBox/Runtime/common/string/RTStrPrintHexBytes.cpp
r57358 r60028 5 5 6 6 /* 7 * Copyright (C) 2009-201 5Oracle Corporation7 * Copyright (C) 2009-2016 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 36 36 37 37 38 RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t c chBuf, void const *pv, size_t cb, uint32_t fFlags)38 RTDECL(int) RTStrPrintHexBytes(char *pszBuf, size_t cbBuf, void const *pv, size_t cb, uint32_t fFlags) 39 39 { 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); 41 44 AssertPtrReturn(pszBuf, VERR_INVALID_POINTER); 42 45 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); 44 49 if (cb) 45 50 AssertPtrReturn(pv, VERR_INVALID_POINTER); … … 50 55 51 56 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) 53 68 { 54 69 uint8_t b = *pb++; 55 70 *pszBuf++ = pszHexDigits[b >> 4]; 56 71 *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 } 57 80 } 81 58 82 *pszBuf = '\0'; 59 83 return VINF_SUCCESS;
Note:
See TracChangeset
for help on using the changeset viewer.