VirtualBox

Ignore:
Timestamp:
Jul 15, 2020 8:03:03 AM (5 years ago)
Author:
vboxsync
Message:

IPRT: Follow-up fixes for r139114 (RTStrSplit + testcases).

File:
1 edited

Legend:

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

    r85154 r85345  
    4646
    4747    /* Determine the number of paths in buffer first. */
    48     size_t       cch    = cbStrings - 1;
    49     char const  *pszTmp = pcszStrings;
     48    size_t      cch     = cbStrings - 1;
     49    char const *pcszTmp = pcszStrings;
     50    const char *pcszEnd = RTStrEnd(pcszTmp, RTSTR_MAX);
     51    char const *pcszNext;
    5052    const size_t cchSep = strlen(pcszSeparator);
     53          size_t cchNext;
    5154    while (cch > 0)
    5255    {
    53         char const *pszNext = RTStrStr(pszTmp, pcszSeparator);
    54         if (!pszNext)
     56        pcszNext = RTStrStr(pcszTmp, pcszSeparator);
     57        if (!pcszNext)
    5558            break;
    56         const size_t cchNext = pszNext - pszTmp;
     59        cchNext = pcszNext - pcszTmp;
    5760        if (cchNext + cchSep > cch)
    5861            break;
    59         pszTmp += cchNext + cchSep;
    60         cch    -= cchNext + cchSep;
     62        pcszNext += cchSep;
     63        pcszTmp  += cchNext + cchSep;
     64        cch      -= cchNext + cchSep;
    6165        if (cchNext)
    6266            ++cStrings;
    6367    }
    6468
     69    if (pcszTmp != pcszEnd) /* Do we need to take a trailing string without separator into account? */
     70        cStrings++;
     71
    6572    if (!cStrings)
    6673    {
    67         *pcStrings = 0;
     74        *ppapszStrings = NULL;
     75        *pcStrings     = 0;
    6876        return VINF_SUCCESS;
    6977    }
     
    7684
    7785    cch    = cbStrings - 1;
    78     pszTmp = pcszStrings;
     86    pcszTmp = pcszStrings;
    7987
    80     for (size_t i = 0; i < 3;)
     88    for (size_t i = 0; i < cStrings;)
    8189    {
    82         char const *pszNext = RTStrStr(pszTmp, pcszSeparator);
    83         if (!pszNext)
    84             break;
    85         const size_t cchNext = pszNext - pszTmp;
    86         if (cchNext + cchSep > cch)
    87             break;
     90        pcszNext = RTStrStr(pcszTmp, pcszSeparator);
     91        if (!pcszNext)
     92            pcszNext = pcszEnd;
     93        cchNext = pcszNext - pcszTmp;
    8894        if (cchNext)
    8995        {
    90             papszStrings[i] = RTStrDupN(pszTmp, cchNext);
     96            papszStrings[i] = RTStrDupN(pcszTmp, cchNext);
    9197            if (!papszStrings[i])
    9298            {
     
    96102            i++;
    97103        }
    98         pszTmp += cchNext + cchSep;
    99         cch    -= cchNext + cchSep;
     104        pcszTmp += cchNext + cchSep;
     105        cch     -= cchNext + cchSep;
    100106    }
    101107
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