VirtualBox

Changeset 93178 in vbox for trunk


Ignore:
Timestamp:
Jan 11, 2022 8:28:01 AM (3 years ago)
Author:
vboxsync
Message:

iprt/RTExprEval: Only expand ${VAR}, drop $(VAR). Simplifies the code. bugref:9781

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/misc/expreval.cpp

    r93174 r93178  
    563563
    564564/**
    565  * Finds the end of the current variable expansion, taking nested expansoins
     565 * Finds the end of the current variable expansion, taking nested expansion
    566566 * into account.
    567567 *
     
    575575 * @param   pfNested    Where to return whether it's a nested (@c true) or plain
    576576 *                      one.
    577  *
    578  * @note    This code would be somewhat simpler if we only used one style of
    579  *          wrappers (either parentheses or curly brackets).
    580  */
    581 DECL_NO_INLINE(static, EXPRRET) expr_expand_find_end(PEXPR pThis, const char *pchSrc, size_t cchSrc,
    582                                                      size_t *pcchVarRef, bool *pfNested)
     577 */
     578static EXPRRET expr_expand_find_end(PEXPR pThis, const char *pchSrc, size_t cchSrc, size_t *pcchVarRef, bool *pfNested)
    583579{
    584580    const char * const  pchStart = pchSrc;
    585     char                achPars[EXPR_MAX_VAR_RECURSION];
    586581
    587582    /*
     
    590585    Assert(cchSrc >= 2);
    591586    Assert(pchSrc[0] == '$');
    592     Assert(pchSrc[1] == '(' || pchSrc[1] == '}');
    593     unsigned            cPars    = 1;
    594     char                chEndPar = pchSrc[1] == '(' ? ')' : '}';
    595     achPars[0] = chEndPar;
     587    Assert(pchSrc[1] == '{');
     588    unsigned            cPars = 1;
    596589    pchSrc += 2;
    597590    cchSrc -= 2;
     
    603596    while (cchSrc > 0)
    604597    {
    605         char       ch2;
    606598        char const ch = *pchSrc;
    607599        if (   ch == '$'
    608600            && cchSrc >= 2
    609             && (   (ch2 = pchSrc[1]) == '('
    610                 || ch2 == '{'))
    611         {
    612             if (cPars < RT_ELEMENTS(achPars))
    613                 achPars[cPars++] = chEndPar = ch2 == '(' ? ')' : '}';
     601            && pchSrc[1] == '{')
     602        {
     603            if (cPars < EXPR_MAX_VAR_RECURSION)
     604                cPars++;
    614605            else
    615606            {
     
    625616            pchSrc += 1;
    626617            cchSrc -= 1;
    627             if (ch == chEndPar)
    628             {
     618            if (ch == '}')
    629619                if (--cPars == 0)
    630620                {
     
    632622                    return kExprRet_Ok;
    633623                }
    634                 chEndPar = achPars[cPars];
    635             }
    636             Assert(chEndPar != '\0');
    637624        }
    638625    }
     
    651638 * @param   cchSrc      The length of the string to expand.
    652639 * @param   cDepth      The recursion depth, starting at zero.
    653  *
    654  * @note    This code would be somewhat simpler if we only used one style of
    655  *          wrappers (either parentheses or curly brackets).
    656640 */
    657641static char *expr_expand_string(PEXPR pThis, const char *pchSrc, size_t cchSrc, unsigned cDepth)
     
    675659                if (pchDollar)
    676660                {
    677                     /* Treat lone $ w/o a following ( or { as plain text. */
     661                    /* Treat lone $ w/o a following { as plain text. */
    678662                    if (   cchPlain + 1 >= cchSrc
    679663                        && pchDollar[0] == '$'
    680664                        && (   cchPlain + 1 == cchSrc
    681                             || (pchDollar[1] != '{' && pchDollar[1] != '(')) )
     665                            || pchDollar[1] != '{') )
    682666                    {
    683667                        cchPlain  += 1;
     
    723707                        break;
    724708
    725                     /* If we don't have ${ or $( loop, just loop. */
     709                    /* If we don't have ${, just loop. */
    726710                    if (   cchSrc < 2
    727711                        || pchSrc[0] != '$'
    728                         || (pchSrc[1] != '{' && pchSrc[1] != '('))
     712                        || pchSrc[1] != '{')
    729713                        continue;
    730714                }
     
    734718                 * finding the end of it and recursively dealing with any sub-expansions first.
    735719                 */
    736                 Assert(pchSrc[0] == '$' && (pchSrc[1] == '{' || pchSrc[1] == '('));
     720                Assert(pchSrc[0] == '$' && pchSrc[1] == '{');
    737721                size_t cchVarRef;
    738722                bool   fNested;
     
    23792363        else
    23802364        {
    2381             char    achPars[EXPR_MAX_VAR_RECURSION];
    2382             int     iPar = -1;
    2383             char    chEndPar = '\0';
    2384 
     2365            unsigned cPars = 0;
    23852366            pszStart = psz;
    23862367            while ((ch = *psz) != '\0')
    23872368            {
    2388                 char ch2;
    2389 
    2390                 /* $(adsf) or ${asdf} needs special handling. */
    2391                 if (    ch == '$'
    2392                     &&  (   (ch2 = psz[1]) == '('
    2393                          || ch2 == '{'))
     2369                /* ${asdf} needs special handling. */
     2370                if (   ch == '$'
     2371                    && psz[1] == '{')
    23942372                {
    23952373                    psz++;
    2396                     if (iPar > (int)(sizeof(achPars) / sizeof(achPars[0])))
     2374                    if (cPars < EXPR_MAX_VAR_RECURSION)
     2375                        ++cPars;
     2376                    else
    23972377                    {
    23982378                        rc = expr_error(pThis, "Too deep nesting of variable expansions");
    23992379                        break;
    24002380                    }
    2401                     achPars[++iPar] = chEndPar = ch2 == '(' ? ')' : '}';
    24022381                }
    2403                 else if (ch == chEndPar)
     2382                else if (ch == '}')
    24042383                {
    2405                     iPar--;
    2406                     chEndPar = iPar >= 0 ? achPars[iPar] : '\0';
     2384                    if (cPars > 0)
     2385                        cPars--;
    24072386                }
    2408                 else if (!chEndPar)
     2387                else if (cPars == 0)
    24092388                {
    24102389                    uchVal = expr_map_get(ch);
  • trunk/src/VBox/Runtime/testcase/tstRTExprEval.cpp

    r93175 r93178  
    133133    CHECK_iResult(INT64_MAX);
    134134    g_fQueryVariableExpected = true;
    135     RTTESTI_CHECK_RC(RTExprEvalToInteger(hExprEval, RT_STR_TUPLE("$(MYVAR1) + 0"), &iResult, NULL), VINF_SUCCESS);
     135    RTTESTI_CHECK_RC(RTExprEvalToInteger(hExprEval, RT_STR_TUPLE("${MYVAR1} + 0"), &iResult, NULL), VINF_SUCCESS);
    136136    CHECK_iResult(42);
    137     RTTESTI_CHECK_RC(RTExprEvalToInteger(hExprEval, RT_STR_TUPLE("$($(MYNESTED1)) + 2"), &iResult, NULL), VINF_SUCCESS);
     137    RTTESTI_CHECK_RC(RTExprEvalToInteger(hExprEval, RT_STR_TUPLE("${${MYNESTED1}} + 2"), &iResult, NULL), VINF_SUCCESS);
    138138    CHECK_iResult(44);
    139139    g_fQueryVariableExpected = false;
     
    173173}
    174174
    175 
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