VirtualBox

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


Ignore:
Timestamp:
Aug 9, 2018 1:37:52 PM (6 years ago)
Author:
vboxsync
Message:

iptr/base64: introduce RTBase64EncodedLengthEx() and RTBase64EncodeEx(),
and RTBASE64_FLAGS_NO_LINE_BREAKS flag for them.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/string/base64.cpp

    r69111 r73587  
    400400/**
    401401 * Calculates the length of the Base64 encoding of a given number of bytes of
    402  * data.
    403  *
    404  * This will assume line breaks every 64 chars. A RTBase64EncodedLengthEx
    405  * function can be added if closer control over the output is found to be
    406  * required.
     402 * data produced by RTBase64Encode().
    407403 *
    408404 * @returns The Base64 string length.
     
    410406 */
    411407RTDECL(size_t) RTBase64EncodedLength(size_t cbData)
     408{
     409    return RTBase64EncodedLengthEx(cbData, 0);
     410}
     411RT_EXPORT_SYMBOL(RTBase64EncodedLength);
     412
     413
     414/**
     415 * Calculates the length of the Base64 encoding of a given number of bytes of
     416 * data produced by RTBase64EncodeEx() with the same @a fFlags.
     417 *
     418 * @returns The Base64 string length.
     419 * @param   cbData      The number of bytes to encode.
     420 * @param   fFlags      Flags, any combination of the RTBASE64_FLAGS \#defines.
     421 */
     422RTDECL(size_t) RTBase64EncodedLengthEx(size_t cbData, uint32_t fFlags)
    412423{
    413424    if (cbData * 8 / 8 != cbData)
     
    419430        cch /= 6;
    420431
    421         cch += ((cch - 1) / RTBASE64_LINE_LEN) * RTBASE64_EOL_SIZE;
     432        if ((fFlags & RTBASE64_FLAGS_NO_LINE_BREAKS) == 0) /* add EOLs? */
     433            cch += ((cch - 1) / RTBASE64_LINE_LEN) * RTBASE64_EOL_SIZE;
    422434        return cch;
    423435    }
     
    428440    cch /= 6;
    429441
    430     cch += ((cch - 1) / RTBASE64_LINE_LEN) * RTBASE64_EOL_SIZE;
     442    if ((fFlags & RTBASE64_FLAGS_NO_LINE_BREAKS) == 0) /* add EOLs? */
     443        cch += ((cch - 1) / RTBASE64_LINE_LEN) * RTBASE64_EOL_SIZE;
    431444    return cch;
    432445}
    433 RT_EXPORT_SYMBOL(RTBase64EncodedLength);
     446RT_EXPORT_SYMBOL(RTBase64EncodedLengthEx);
    434447
    435448
     
    438451 * output buffer.
    439452 *
    440  * This will make the same assumptions about line breaks and EOL size as
    441  * RTBase64EncodedLength() does. A RTBase64EncodeEx function can be added if
    442  * more strict control over the output formatting is found necessary.
     453 * This is equivalent to calling RTBase64EncodeEx() with no flags.
    443454 *
    444455 * @returns IRPT status code.
     
    453464 */
    454465RTDECL(int) RTBase64Encode(const void *pvData, size_t cbData, char *pszBuf, size_t cbBuf, size_t *pcchActual)
     466{
     467    return RTBase64EncodeEx(pvData, cbData, 0, pszBuf, cbBuf, pcchActual);
     468}
     469RT_EXPORT_SYMBOL(RTBase64Encode);
     470
     471
     472/**
     473 * Encodes the specifed data into a Base64 string, the caller supplies the
     474 * output buffer.
     475 *
     476 * @returns IRPT status code.
     477 * @retval  VERR_BUFFER_OVERFLOW if the output buffer is too small. The buffer
     478 *          may contain an invalid Base64 string.
     479 *
     480 * @param   pvData      The data to encode.
     481 * @param   cbData      The number of bytes to encode.
     482 * @param   pszBuf      Where to put the Base64 string.
     483 * @param   cbBuf       The size of the output buffer, including the terminator.
     484 * @param   pcchActual  The actual number of characters returned.
     485 */
     486RTDECL(int) RTBase64EncodeEx(const void *pvData, size_t cbData, uint32_t fFlags,
     487                             char *pszBuf, size_t cbBuf, size_t *pcchActual)
    455488{
    456489    /*
     
    483516        pbSrc  += 3;
    484517
    485         /* deal out linefeeds */
    486         if (cbBuf == cbLineFeed && cbData)
    487         {
    488             if (cbBuf < RTBASE64_EOL_SIZE + 1)
    489                 return VERR_BUFFER_OVERFLOW;
    490             cbBuf -= RTBASE64_EOL_SIZE;
    491             if (RTBASE64_EOL_SIZE == 2)
    492                 *pchDst++ = '\r';
    493             *pchDst++ = '\n';
    494             cbLineFeed = cbBuf - RTBASE64_LINE_LEN;
     518        if ((fFlags & RTBASE64_FLAGS_NO_LINE_BREAKS) == 0) /* add EOLs? */
     519        {
     520            /* deal out end-of-line */
     521            if (cbBuf == cbLineFeed && cbData)
     522            {
     523                if (cbBuf < RTBASE64_EOL_SIZE + 1)
     524                    return VERR_BUFFER_OVERFLOW;
     525                cbBuf -= RTBASE64_EOL_SIZE;
     526                if (RTBASE64_EOL_SIZE == 2)
     527                    *pchDst++ = '\r';
     528                *pchDst++ = '\n';
     529                cbLineFeed = cbBuf - RTBASE64_LINE_LEN;
     530            }
    495531        }
    496532    }
     
    530566    return VINF_SUCCESS;
    531567}
    532 RT_EXPORT_SYMBOL(RTBase64Encode);
    533 
     568RT_EXPORT_SYMBOL(RTBase64EncodeEx);
Note: See TracChangeset for help on using the changeset viewer.

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