VirtualBox

Ignore:
Timestamp:
Mar 24, 2011 4:14:57 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
70762
Message:

IPRT: Added RTStrCopyP, RTStrCopyPEx, RTStrCatP and RTStrCatPEx. These functions will advance the destination buffer pointer and size parameters.

Location:
trunk/src/VBox/Runtime/common/string
Files:
4 copied

Legend:

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

    r36382 r36407  
    3333
    3434
    35 RTDECL(int) RTStrCat(char *pszDst, size_t cbDst, const char *pszSrc)
     35RTDECL(int) RTStrCatP(char **ppszDst, size_t *pcbDst, const char *pszSrc)
    3636{
    37     char *pszDst2 = RTStrEnd(pszDst, cbDst);
    38     AssertReturn(pszDst2, VERR_INVALID_PARAMETER);
    39     cbDst -= pszDst2 - pszDst;
     37    /*
     38     * Advance past the current string in the output buffer and turn this into
     39     * a copy operation.
     40     */
     41    size_t  cbDst  = *pcbDst;
     42    char   *pszDst = RTStrEnd(*ppszDst, *pcbDst);
     43    AssertReturn(pszDst, VERR_INVALID_PARAMETER);
     44    *pcbDst -= pszDst - *ppszDst;
     45    *ppszDst = pszDst;
    4046
    41     size_t cchSrc = strlen(pszSrc);
    42     if (RT_LIKELY(cchSrc < cbDst))
    43     {
    44         memcpy(pszDst2, pszSrc, cchSrc + 1);
    45         return VINF_SUCCESS;
    46     }
     47    return RTStrCopyP(ppszDst, pcbDst, pszSrc);
     48}
     49RT_EXPORT_SYMBOL(RTStrCatP);
    4750
    48     if (cbDst != 0)
    49     {
    50         memcpy(pszDst2, pszSrc, cbDst - 1);
    51         pszDst2[cbDst - 1] = '\0';
    52     }
    53     return VERR_BUFFER_OVERFLOW;
    54 }
    55 RT_EXPORT_SYMBOL(RTStrCat);
    56 
  • trunk/src/VBox/Runtime/common/string/RTStrCatPEx.cpp

    r36382 r36407  
    11/* $Id$ */
    22/** @file
    3  * IPRT - RTStrCatEx
     3 * IPRT - RTStrCatPEx
    44 */
    55
    66/*
    7  * Copyright (C) 2010 Oracle Corporation
     7 * Copyright (C) 2011 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3333
    3434
    35 RTDECL(int) RTStrCatEx(char *pszDst, size_t cbDst, const char *pszSrc, size_t cchMaxSrc)
     35RTDECL(int) RTStrCatPEx(char **ppszDst, size_t *pcbDst, const char *pszSrc, size_t cchMaxSrc)
    3636{
    37     char *pszDst2 = RTStrEnd(pszDst, cbDst);
    38     AssertReturn(pszDst2, VERR_INVALID_PARAMETER);
    39     cbDst -= pszDst2 - pszDst;
     37    /*
     38     * Advance past the current string in the output buffer and turn this into
     39     * a copy operation.
     40     */
     41    size_t  cbDst  = *pcbDst;
     42    char   *pszDst = RTStrEnd(*ppszDst, cbDst);
     43    AssertReturn(pszDst, VERR_INVALID_PARAMETER);
     44    *pcbDst -= pszDst - *ppszDst;
     45    *ppszDst = pszDst;
    4046
    41     const char *pszSrcEol = RTStrEnd(pszSrc, cchMaxSrc);
    42     size_t      cchSrc    = pszSrcEol ? (size_t)(pszSrcEol - pszSrc) : cchMaxSrc;
    43     if (RT_LIKELY(cchSrc < cbDst))
    44     {
    45         memcpy(pszDst2, pszSrc, cchSrc);
    46         pszDst2[cchSrc] = '\0';
    47         return VINF_SUCCESS;
    48     }
     47    return RTStrCopyPEx(ppszDst, pcbDst, pszSrc, cchMaxSrc);
     48}
     49RT_EXPORT_SYMBOL(RTStrCatPEx);
    4950
    50     if (cbDst != 0)
    51     {
    52         memcpy(pszDst2, pszSrc, cbDst - 1);
    53         pszDst2[cbDst - 1] = '\0';
    54     }
    55     return VERR_BUFFER_OVERFLOW;
    56 }
    57 RT_EXPORT_SYMBOL(RTStrCatEx);
    58 
  • trunk/src/VBox/Runtime/common/string/RTStrCopyP.cpp

    r36382 r36407  
    11/* $Id$ */
    22/** @file
    3  * IPRT - RTStrCopy.
     3 * IPRT - RTStrCopyP.
    44 */
    55
    66/*
    7  * Copyright (C) 2010 Oracle Corporation
     7 * Copyright (C) 2010-2011 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3333
    3434
    35 RTDECL(int) RTStrCopy(char *pszDst, size_t cbDst, const char *pszSrc)
     35RTDECL(int) RTStrCopyP(char **ppszDst, size_t *pcbDst, const char *pszSrc)
    3636{
    37     size_t cchSrc = strlen(pszSrc);
     37    size_t const    cchSrc = strlen(pszSrc);
     38    size_t const    cbDst  = *pcbDst;
     39    char           *pszDst = *ppszDst;
    3840    if (RT_LIKELY(cchSrc < cbDst))
    3941    {
    4042        memcpy(pszDst, pszSrc, cchSrc + 1);
     43        *ppszDst = pszDst += cchSrc;
     44        *pcbDst -= cchSrc;
    4145        return VINF_SUCCESS;
    4246    }
     
    4448    if (cbDst != 0)
    4549    {
    46         memcpy(pszDst, pszSrc, cbDst - 1);
    47         pszDst[cbDst - 1] = '\0';
     50        memcpy(*ppszDst, pszSrc, cbDst - 1);
     51        *ppszDst = pszDst += cbDst - 1;
     52        *pszDst  = '\0';
     53        *pcbDst  = 1;
    4854    }
    4955    return VERR_BUFFER_OVERFLOW;
    5056}
    51 RT_EXPORT_SYMBOL(RTStrCopy);
     57RT_EXPORT_SYMBOL(RTStrCopyP);
    5258
  • trunk/src/VBox/Runtime/common/string/RTStrCopyPEx.cpp

    r36382 r36407  
    11/* $Id$ */
    22/** @file
    3  * IPRT - RTStrCopyEx.
     3 * IPRT - RTStrCopyPEx.
    44 */
    55
    66/*
    7  * Copyright (C) 2010 Oracle Corporation
     7 * Copyright (C) 2010-2011 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3333
    3434
    35 RTDECL(int) RTStrCopyEx(char *pszDst, size_t cbDst, const char *pszSrc, size_t cchMaxSrc)
     35RTDECL(int) RTStrCopyPEx(char **ppszDst, size_t *pcbDst, const char *pszSrc, size_t cchMaxSrc)
    3636{
    37     const char *pszSrcEol = RTStrEnd(pszSrc, cchMaxSrc);
    38     size_t      cchSrc    = pszSrcEol ? (size_t)(pszSrcEol - pszSrc) : cchMaxSrc;
     37    const char  *pszSrcEol = RTStrEnd(pszSrc, cchMaxSrc);
     38    size_t       cchSrc    = pszSrcEol ? (size_t)(pszSrcEol - pszSrc) : cchMaxSrc;
     39    size_t const cbDst     = *pcbDst;
     40    char        *pszDst    = *ppszDst;
    3941    if (RT_LIKELY(cchSrc < cbDst))
    4042    {
    4143        memcpy(pszDst, pszSrc, cchSrc);
    42         pszDst[cchSrc] = '\0';
     44        *ppszDst = pszDst += cchSrc;
     45        *pszDst  = '\0';
     46        *pcbDst -= cchSrc;
    4347        return VINF_SUCCESS;
    4448    }
     
    4650    if (cbDst != 0)
    4751    {
    48         memcpy(pszDst, pszSrc, cbDst - 1);
    49         pszDst[cbDst - 1] = '\0';
     52        memcpy(*ppszDst, pszSrc, cbDst - 1);
     53        *ppszDst = pszDst += cbDst - 1;
     54        *pszDst  = '\0';
     55        *pcbDst  = 1;
    5056    }
    5157    return VERR_BUFFER_OVERFLOW;
    5258}
    53 RT_EXPORT_SYMBOL(RTStrCopyEx);
     59RT_EXPORT_SYMBOL(RTStrCopyPEx);
    5460
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