VirtualBox

Changeset 98428 in vbox for trunk


Ignore:
Timestamp:
Feb 2, 2023 12:03:20 PM (2 years ago)
Author:
vboxsync
Message:

scm: More on the kmk makefile cleanup. bugref:10348

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bldprogs/scmrw-kmk.cpp

    r98407 r98428  
    7676    /** Dependency file.
    7777     *  Separators: space, '|' */
    78     kKmkWordCtx_DepFile
     78    kKmkWordCtx_DepFile,
     79    /** Last context which may do double expansion. */
     80    kKmkWordCtx_LastDoubleExpansion = kKmkWordCtx_DepFile
    7981} KMKWORDCTX;
    8082
     
    158160} KMKPARSER;
    159161
     162
     163/*********************************************************************************************************************************
     164*   Global Variables                                                                                                             *
     165*********************************************************************************************************************************/
     166static char const g_szTabs[] = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
    160167
    161168
     
    472479        {
    473480            /*
    474              * Skip variable expansion.
     481             * Skip variable expansion. ASSUMING double expansion being enabled
     482             * for rules, we respond to both $() and $$() here, $$$$()
    475483             */
    476             if (off + 2 >= cchLine)
    477                 return cchLine - offStart;
    478             char const chOpen = pchLine[++off];
    479             if (chOpen == '(' || chOpen == '{')
     484            size_t cDollars = 0;
     485            do
    480486            {
    481                 char const chClose = chOpen == '(' ? ')' : '}';
    482                 unsigned   uDepth  = 1;
    483487                off++;
    484                 for (;;)
     488                if (off >= cchLine)
     489                    return cchLine - offStart;
     490                cDollars++;
     491                ch = pchLine[off];
     492            } while (ch == '$');
     493            if ((cDollars & 1) || (cDollars == 2 && enmCtx <= kKmkWordCtx_LastDoubleExpansion))
     494            {
     495                char const chOpen = ch;
     496                if (ch == '(' || ch == '{')
    485497                {
    486                     if (off < cchLine)
    487                         ch = pchLine[off++];
    488                     else /* Reached the end while inside the expansion. */
     498                    char const chClose = chOpen == '(' ? ')' : '}';
     499                    unsigned   uDepth  = 1;
     500                    off++;
     501                    for (;;)
    489502                    {
    490                         pState->chOpen = chOpen;
    491                         pState->uDepth = (uint16_t)uDepth;
    492                         return cchLine - offStart;
     503                        if (off < cchLine)
     504                            ch = pchLine[off++];
     505                        else /* Reached the end while inside the expansion. */
     506                        {
     507                            pState->chOpen = chOpen;
     508                            pState->uDepth = (uint16_t)uDepth;
     509                            return cchLine - offStart;
     510                        }
     511                        if (ch == chOpen)
     512                            uDepth++;
     513                        else if (ch == chClose && --uDepth == 0)
     514                            break;
    493515                    }
    494                     if (ch == chOpen)
    495                         uDepth++;
    496                     else if (ch == chClose && --uDepth == 0)
    497                         break;
    498516                }
    499                 continue;
     517                else if (cDollars & 1)
     518                    off++; /* $X */
    500519            }
    501             /* else: $X */
     520            continue;
    502521        }
    503522        else if (ch == ':')
     
    15811600     * Process word by word past the colon, taking new lines into account.
    15821601     */
    1583     KMKWORDSTATE WordState   = { 0, 0 };
    1584     KMKWORDCTX   enmCtx      = kKmkWordCtx_TargetFileOrAssignment;
    1585     bool         fPendingEol = false;
     1602    KMKWORDSTATE WordState    = { 0, 0 };
     1603    KMKWORDCTX   enmCtx       = kKmkWordCtx_TargetFileOrAssignment;
     1604    unsigned     cPendingEols = 0;
    15861605    for (;;)
    15871606    {
     
    16501669                        ScmStreamPutCh(pOut, ':');
    16511670
    1652                     fPendingEol = true;
     1671                    cPendingEols = 1;
    16531672                }
    16541673                else
     
    16571676                    ScmStreamPutEol(pOut, pParser->enmEol);
    16581677                    ScmStreamWrite(pOut, g_szSpaces, cchIndent);
     1678                    if (WordState.uDepth > 0)
     1679                        ScmStreamWrite(pOut, g_szTabs, RT_MIN(WordState.uDepth, sizeof(g_szTabs) - 1));
    16591680                }
    16601681                break;
     
    16791700    while (offLine + 1 == cchLine && pchLine[offLine] == '\\')
    16801701    {
    1681         fPendingEol = true;
     1702        cPendingEols = 1;
    16821703
    16831704        Assert(iSubLine + 1 < cLines);
     
    17161737    {
    17171738        /* Indent the next word. */
    1718         if (!fPendingEol)
     1739        if (cPendingEols == 0)
    17191740            ScmStreamPutCh(pOut, ' ');
    17201741        else
     
    17241745            ScmStreamWrite(pOut, g_szSpaces, cchIndent);
    17251746            ScmStreamWrite(pOut, RT_STR_TUPLE("\t\t"));
    1726             fPendingEol = false;
    1727         }
     1747            if (cPendingEols > 1)
     1748            {
     1749                ScmStreamWrite(pOut, RT_STR_TUPLE("\\"));
     1750                ScmStreamPutEol(pOut, pParser->enmEol);
     1751                ScmStreamWrite(pOut, g_szSpaces, cchIndent);
     1752                ScmStreamWrite(pOut, RT_STR_TUPLE("\t\t"));
     1753            }
     1754            cPendingEols = 0;
     1755        }
     1756        if (WordState.uDepth > 0)
     1757            ScmStreamWrite(pOut, g_szTabs, RT_MIN(WordState.uDepth, sizeof(g_szTabs) - 1));
    17281758
    17291759        /* Get the next word and output it. */
     
    17421772        {
    17431773            /* Get the next input line. */
    1744             unsigned cEmptyLines = 0;
    17451774            for (;;)
    17461775            {
     
    17591788
    17601789                /* Just drop empty lines, we'll re-add one of them afterward if we find more dependencies. */
     1790                cPendingEols++;
    17611791                if (offLine + 1 == cchLine && pchLine[offLine] == '\\')
    1762                 {
    1763                     cEmptyLines++;
    17641792                    continue;
    1765                 }
    1766 
    1767                 fPendingEol = true;
    17681793                break;
    17691794            }
     
    21602185
    21612186                /*
    2162                  * Indent comment lines, unless the comment is too far into the line and such.
     2187                 * Indent comment lines, unless the comment is too far too the right.
    21632188                 */
    21642189                size_t const offEffLine = ScmCalcSpacesForSrcSpan(pchLine, 0, offLine, pSettings);
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