VirtualBox

Changeset 41195 in vbox


Ignore:
Timestamp:
May 8, 2012 12:51:07 AM (13 years ago)
Author:
vboxsync
Message:

Working on parsing defines.

Location:
trunk/src/bldprogs
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bldprogs/VBoxCPP.cpp

    r41194 r41195  
    9393    /** Variable argument count. */
    9494    bool                fVarArg;
     95    /** Set if originating on the command line. */
     96    bool                fCmdLine;
    9597    /** The number of known arguments.*/
    9698    uint32_t            cArgs;
     
    534536 * @param   pszValue            The value.
    535537 * @param   cchDefine           The length of the value.
     538 * @param   fCmdLine            Set if originating on the command line.
    536539 */
    537540static RTEXITCODE vbcppDefineAddFn(PVBCPP pThis, const char *pszDefine, size_t cchDefine,
    538541                                   const char *pszParams, size_t cchParams,
    539                                    const char *pszValue, size_t cchValue)
     542                                   const char *pszValue, size_t cchValue,
     543                                   bool fCmdLine)
    540544
    541545{
     
    598602    pDef->fFunction = true;
    599603    pDef->fVarArg   = false;
     604    pDef->fCmdLine  = fCmdLine;
    600605    pDef->cArgs     = cArgs;
    601606    pDef->papszArgs = (const char **)((uintptr_t)pDef + cbDef - sizeof(const char *) * cArgs);
     
    651656 * @param   pszValue            The value.
    652657 * @param   cchDefine           The length of the value. RTSTR_MAX is ok.
     658 * @param   fCmdLine            Set if originating on the command line.
    653659 */
    654660static RTEXITCODE vbcppDefineAdd(PVBCPP pThis, const char *pszDefine, size_t cchDefine,
    655                                  const char *pszValue, size_t cchValue)
     661                                 const char *pszValue, size_t cchValue, bool fCmdLine)
    656662{
    657663    /*
     
    688694        pszParams++;
    689695        cchParams -= 2;
    690         return vbcppDefineAddFn(pThis, pszDefine, cchDefine, pszParams, cchParams, pszValue, cchValue);
     696        return vbcppDefineAddFn(pThis, pszDefine, cchDefine, pszParams, cchParams, pszValue, cchValue, fCmdLine);
    691697    }
    692698
     
    706712    pDef->fFunction = false;
    707713    pDef->fVarArg   = false;
     714    pDef->fCmdLine  = fCmdLine;
    708715    pDef->cArgs     = 0;
    709716    pDef->papszArgs = NULL;
     
    817824                const char *pszEqual = strchr(ValueUnion.psz, '=');
    818825                if (pszEqual)
    819                     rcExit = vbcppDefineAdd(pThis, ValueUnion.psz, pszEqual - ValueUnion.psz, pszEqual + 1, RTSTR_MAX);
     826                    rcExit = vbcppDefineAdd(pThis, ValueUnion.psz, pszEqual - ValueUnion.psz, pszEqual + 1, RTSTR_MAX, true);
    820827                else
    821                     rcExit = vbcppDefineAdd(pThis, ValueUnion.psz, RTSTR_MAX, "1", 1);
     828                    rcExit = vbcppDefineAdd(pThis, ValueUnion.psz, RTSTR_MAX, "1", 1, true);
    822829                if (rcExit != RTEXITCODE_SUCCESS)
    823830                    return rcExit;
     
    938945
    939946
    940 static RTEXITCODE vbcppOutputComment(PVBCPP pThis, PSCMSTREAM pStrmInput, size_t offStart, size_t cchOutputted)
     947static RTEXITCODE vbcppOutputComment(PVBCPP pThis, PSCMSTREAM pStrmInput, size_t offStart, size_t cchOutputted,
     948                                     size_t cchMinIndent)
    941949{
    942950    size_t offCur = ScmStreamTell(pStrmInput);
     
    13601368                /* Pretty print the passthru. */
    13611369                unsigned cchIndent = pThis->pCondStack ? pThis->pCondStack->iKeepLevel : 0;
    1362                 size_t cch;
     1370                size_t   cch;
    13631371                if (chType == '<')
    13641372                    cch = ScmStreamPrintf(&pThis->StrmOutput, "#%*sinclude <%.*s>",
     
    13711379                                          cchIndent, "", cchFileSpec, pchFileSpec);
    13721380                if (cch > 0)
    1373                     rcExit = vbcppOutputComment(pThis, pStrmInput, offIncEnd, cch);
     1381                    rcExit = vbcppOutputComment(pThis, pStrmInput, offIncEnd, cch, 1);
    13741382                else
    13751383                    rcExit = vbcppError(pThis, "Output error %Rrc", (int)cch);
     
    13941402static RTEXITCODE vbcppProcessDefine(PVBCPP pThis, PSCMSTREAM pStrmInput, size_t offStart)
    13951403{
    1396     return vbcppError(pThis, "Not implemented %s", __FUNCTION__);
     1404    /*
     1405     * Parse it.
     1406     */
     1407    RTEXITCODE rcExit = vbcppProcessSkipWhiteEscapedEolAndComments(pThis, pStrmInput);
     1408    if (rcExit == RTEXITCODE_SUCCESS)
     1409    {
     1410        size_t      cchDefine;
     1411        const char *pchDefine = ScmStreamCGetWord(pStrmInput, &cchDefine);
     1412        if (pchDefine)
     1413        {
     1414            /* If it's a function style define, parse out the parameter list. */
     1415            size_t      cchParams = 0;
     1416            const char *pchParams = NULL;
     1417            unsigned    ch = ScmStreamPeekCh(pStrmInput);
     1418            if (ch == '(')
     1419            {
     1420                ScmStreamGetCh(pStrmInput);
     1421                pchParams = ScmStreamGetCur(pStrmInput);
     1422
     1423                unsigned chPrev = ch;
     1424                while ((ch = ScmStreamPeekCh(pStrmInput)) != ~(unsigned)0)
     1425                {
     1426                    if (ch == '\r' || ch == '\n')
     1427                    {
     1428                        if (chPrev != '\\')
     1429                        {
     1430                            rcExit = vbcppError(pThis, "Missing ')'");
     1431                            break;
     1432                        }
     1433                        ScmStreamSeekByLine(pStrmInput, ScmStreamTellLine(pStrmInput) + 1);
     1434                    }
     1435                    if (ch == ')')
     1436                    {
     1437                        cchParams = ScmStreamGetCur(pStrmInput) - pchParams;
     1438                        ScmStreamGetCh(pStrmInput);
     1439                        break;
     1440                    }
     1441                    ScmStreamGetCh(pStrmInput);
     1442                }
     1443            }
     1444            /* The simple kind. */
     1445            else if (!RT_C_IS_SPACE(ch) && ch != ~(unsigned)0)
     1446                rcExit = vbcppError(pThis, "Expected whitespace after macro name");
     1447
     1448            /* Parse out the value. */
     1449            if (rcExit == RTEXITCODE_SUCCESS)
     1450                rcExit = vbcppProcessSkipWhiteEscapedEolAndComments(pThis, pStrmInput);
     1451            if (rcExit == RTEXITCODE_SUCCESS)
     1452            {
     1453                size_t      offValue = ScmStreamTell(pStrmInput);
     1454                const char *pchValue = ScmStreamGetCur(pStrmInput);
     1455                unsigned    chPrev = ch;
     1456                while ((ch = ScmStreamPeekCh(pStrmInput)) != ~(unsigned)0)
     1457                {
     1458                    if (ch == '\r' || ch == '\n')
     1459                    {
     1460                        if (chPrev != '\\')
     1461                            break;
     1462                        ScmStreamSeekByLine(pStrmInput, ScmStreamTellLine(pStrmInput) + 1);
     1463                    }
     1464                    ScmStreamGetCh(pStrmInput);
     1465                }
     1466                size_t cchValue = ScmStreamGetCur(pStrmInput) - pchValue;
     1467
     1468                /*
     1469                 * Execute.
     1470                 */
     1471                if (pchParams)
     1472                    rcExit = vbcppDefineAddFn(pThis, pchDefine, cchDefine, pchParams, cchParams, pchValue, cchValue, false);
     1473                else
     1474                    rcExit = vbcppDefineAdd(pThis, pchDefine, cchDefine, pchValue, cchValue, false);
     1475
     1476                /*
     1477                 * Pass thru?
     1478                 */
     1479                if (   pThis->enmMode >= kVBCppMode_Selective
     1480                    && pThis->enmMode != kVBCppMode_SelectiveD
     1481                    && rcExit == RTEXITCODE_SUCCESS)
     1482                {
     1483                    unsigned cchIndent = pThis->pCondStack ? pThis->pCondStack->iKeepLevel : 0;
     1484                    size_t   cch;
     1485                    if (pchParams)
     1486                        cch = ScmStreamPrintf(&pThis->StrmOutput, "#%*sdefine %.*s(%.*s)",
     1487                                              cchIndent, "", cchDefine, pchDefine, cchParams, pchParams);
     1488                    else
     1489                        cch = ScmStreamPrintf(&pThis->StrmOutput, "#%*sdefine %.*s",
     1490                                              cchIndent, "", cchDefine, pchDefine);
     1491                    if (cch > 0)
     1492                        vbcppOutputComment(pThis, pStrmInput, offValue, cch, 1);
     1493                    else
     1494                        rcExit = vbcppError(pThis, "output error");
     1495                }
     1496            }
     1497
     1498        }
     1499    }
     1500    return rcExit;
    13971501}
    13981502
     
    15761680        }
    15771681        else
    1578             rcExit = vbcppError(pThis, "Malformed #ifdef");
     1682            rcExit = vbcppError(pThis, "Malformed #ifndef");
    15791683    }
    15801684    return rcExit;
     
    16281732                    ssize_t cch = ScmStreamPrintf(&pThis->StrmOutput, "#%*selse", pCond->iKeepLevel - 1, "");
    16291733                    if (cch > 0)
    1630                         rcExit = vbcppOutputComment(pThis, pStrmInput, offStart, cch);
     1734                        rcExit = vbcppOutputComment(pThis, pStrmInput, offStart, cch, 2);
    16311735                    else
    16321736                        rcExit = vbcppError(pThis, "Output error %Rrc", (int)cch);
     
    16781782                ssize_t cch = ScmStreamPrintf(&pThis->StrmOutput, "#%*sendif", pCond->iKeepLevel - 1, "");
    16791783                if (cch > 0)
    1680                     rcExit = vbcppOutputComment(pThis, pStrmInput, offStart, cch);
     1784                    rcExit = vbcppOutputComment(pThis, pStrmInput, offStart, cch, 1);
    16811785                else
    16821786                    rcExit = vbcppError(pThis, "Output error %Rrc", (int)cch);
  • trunk/src/bldprogs/scmstream.cpp

    r41194 r41195  
    12861286
    12871287    /* Is it a leading C character. */
    1288     if (!RT_C_IS_ALPHA(*psz) && *psz == '_')
     1288    if (!RT_C_IS_ALPHA(*psz) && *psz != '_')
    12891289        return NULL;
    12901290
     
    13251325
    13261326    /* Is it a leading C character. */
    1327     if (!RT_C_IS_ALPHA(*psz) && *psz == '_')
     1327    if (!RT_C_IS_ALPHA(*psz) && *psz != '_')
    13281328        return NULL;
    13291329
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