VirtualBox

Changeset 41202 in vbox for trunk


Ignore:
Timestamp:
May 8, 2012 12:02:13 PM (13 years ago)
Author:
vboxsync
Message:

Don't use enmMode, just individual flags for determining behavior.

File:
1 edited

Legend:

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

    r41195 r41202  
    7575{
    7676    kVBCppMode_Invalid = 0,
    77 /*    kVBCppMode_Full,*/
     77    kVBCppMode_Standard,
    7878    kVBCppMode_Selective,
    7979    kVBCppMode_SelectiveD,
     
    210210
    211211/**
     212 * The action to take with \#include.
     213 */
     214typedef enum VBCPPINCLUDEACTION
     215{
     216    kVBCppIncludeAction_Invalid = 0,
     217    kVBCppIncludeAction_Include,
     218    kVBCppIncludeAction_PassThru,
     219    kVBCppIncludeAction_Drop,
     220    kVBCppIncludeAction_End
     221} VBCPPINCLUDEACTION;
     222
     223
     224/**
    212225 * C Preprocessor instance data.
    213226 */
     
    220233    /** Whether to keep comments. */
    221234    bool                fKeepComments;
     235    /** Whether to respect source defines. */
     236    bool                fRespectSourceDefines;
     237    /** Whether to let source defines overrides the ones on the command
     238     *  line. */
     239    bool                fAllowRedefiningCmdLineDefines;
     240    /** Whether to pass thru defines. */
     241    bool                fPassThruDefines;
     242    /** Whether to allow undecided conditionals. */
     243    bool                fUndecidedConditionals;
     244    /** Whether to preforme line splicing.
     245     * @todo implement line splicing  */
     246    bool                fLineSplicing;
     247    /** What to do about include files. */
     248    VBCPPINCLUDEACTION  enmIncludeAction;
    222249
    223250    /** The number of include directories. */
     
    287314
    288315
    289 
     316/**
     317 * Changes the preprocessing mode.
     318 *
     319 * @param   pThis               The C preprocessor instance.
     320 * @param   enmMode             The new mode.
     321 */
     322static void vbcppSetMode(PVBCPP pThis, VBCPPMODE enmMode)
     323{
     324    switch (enmMode)
     325    {
     326        case kVBCppMode_Standard:
     327            pThis->fKeepComments                    = false;
     328            pThis->fRespectSourceDefines            = true;
     329            pThis->fAllowRedefiningCmdLineDefines   = true;
     330            pThis->fPassThruDefines                 = false;
     331            pThis->fUndecidedConditionals           = false;
     332            pThis->fLineSplicing                    = true;
     333            pThis->enmIncludeAction                 = kVBCppIncludeAction_Include;
     334            break;
     335
     336        case kVBCppMode_Selective:
     337            pThis->fKeepComments                    = true;
     338            pThis->fRespectSourceDefines            = false;
     339            pThis->fAllowRedefiningCmdLineDefines   = false;
     340            pThis->fPassThruDefines                 = true;
     341            pThis->fUndecidedConditionals           = true;
     342            pThis->fLineSplicing                    = false;
     343            pThis->enmIncludeAction                 = kVBCppIncludeAction_PassThru;
     344            break;
     345
     346        case kVBCppMode_SelectiveD:
     347            pThis->fKeepComments                    = true;
     348            pThis->fRespectSourceDefines            = true;
     349            pThis->fAllowRedefiningCmdLineDefines   = false;
     350            pThis->fPassThruDefines                 = false;
     351            pThis->fUndecidedConditionals           = false;
     352            pThis->fLineSplicing                    = false;
     353            pThis->enmIncludeAction                 = kVBCppIncludeAction_Drop;
     354            break;
     355
     356        default:
     357            AssertFailedReturnVoid();
     358    }
     359    pThis->enmMode = enmMode;
     360}
     361
     362
     363/**
     364 * Initializes the C preprocessor instance data.
     365 *
     366 * @param   pThis               The C preprocessor instance data.
     367 */
    290368static void vbcppInit(PVBCPP pThis)
    291369{
    292     pThis->enmMode          = kVBCppMode_Selective;
    293     pThis->fKeepComments    = true;
    294     pThis->cIncludes        = 0;
     370    vbcppSetMode(pThis, kVBCppMode_Selective);
    295371    pThis->cIncludes        = 0;
    296372    pThis->papszIncludes    = NULL;
     
    502578
    503579/**
    504  * Inserts a define.
     580 * Inserts a define (rejecting and freeing it in some case).
    505581 *
    506582 * @returns RTEXITCODE_SUCCESS or RTEXITCODE_FAILURE + msg.
     
    510586static RTEXITCODE vbcppDefineInsert(PVBCPP pThis, PVBCPPDEF pDef)
    511587{
     588    /*
     589     * Ignore in source-file defines when doing selective preprocessing.
     590     */
     591    if (   !pThis->fRespectSourceDefines
     592        && !pDef->fCmdLine)
     593    {
     594        /* Ignore*/
     595        vbcppFreeDefine(&pDef->Core, NULL);
     596        return RTEXITCODE_SUCCESS;
     597    }
     598
     599    /*
     600     * Insert it and update the lead character hint bitmap.
     601     */
    512602    if (RTStrSpaceInsert(&pThis->StrSpace, &pDef->Core))
    513603        VBCPP_BITMAP_SET(pThis->bmDefined, *pDef->Core.pszString);
    514604    else
    515605    {
    516         RTMsgWarning("Redefining '%s'\n", pDef->Core.pszString);
    517         PVBCPPDEF pOld = (PVBCPPDEF)vbcppDefineUndef(pThis, pDef->Core.pszString, pDef->Core.cchString, false);
    518         bool fRc = RTStrSpaceInsert(&pThis->StrSpace, &pDef->Core);
    519         Assert(fRc); Assert(pOld);
    520         vbcppFreeDefine(&pOld->Core, NULL);
     606        /*
     607         * Duplicate. When doing selective D preprocessing, let the command
     608         * line take precendece.
     609         */
     610        PVBCPPDEF pOld = (PVBCPPDEF)RTStrSpaceGet(&pThis->StrSpace, pDef->Core.pszString); Assert(pOld);
     611        if (   pThis->fAllowRedefiningCmdLineDefines
     612            || pDef->fCmdLine == pOld->fCmdLine)
     613        {
     614            if (pDef->fCmdLine)
     615                RTMsgWarning("Redefining '%s'\n", pDef->Core.pszString);
     616
     617            RTStrSpaceRemove(&pThis->StrSpace, pOld->Core.pszString);
     618            vbcppFreeDefine(&pOld->Core, NULL);
     619
     620            bool fRc = RTStrSpaceInsert(&pThis->StrSpace, &pDef->Core);
     621            Assert(fRc);
     622        }
     623        else
     624        {
     625            RTMsgWarning("Ignoring redefinition of '%s'\n", pDef->Core.pszString);
     626            vbcppFreeDefine(&pDef->Core, NULL);
     627        }
    521628    }
    522629
     
    816923
    817924            case 'd':
    818                 pThis->enmMode = kVBCppMode_SelectiveD;
    819                 pThis->fKeepComments = true;
     925                vbcppSetMode(pThis, kVBCppMode_SelectiveD);
    820926                break;
    821927
     
    13581464             * Execute it.
    13591465             */
    1360             if (pThis->enmMode < kVBCppMode_Selective)
     1466            if (pThis->enmIncludeAction == kVBCppIncludeAction_Include)
    13611467            {
    13621468                /** @todo Search for the include file and push it onto the input stack.
     
    13641470                rcExit = vbcppError(pThis, "Includes are fully implemented");
    13651471            }
    1366             else if (pThis->enmMode != kVBCppMode_SelectiveD)
     1472            else if (pThis->enmIncludeAction == kVBCppIncludeAction_PassThru)
    13671473            {
    13681474                /* Pretty print the passthru. */
     
    13841490
    13851491            }
    1386             /* else: drop it */
     1492            else
     1493                Assert(pThis->enmIncludeAction == kVBCppIncludeAction_Drop);
    13871494        }
    13881495    }
     
    14771584                 * Pass thru?
    14781585                 */
    1479                 if (   pThis->enmMode >= kVBCppMode_Selective
    1480                     && pThis->enmMode != kVBCppMode_SelectiveD
    1481                     && rcExit == RTEXITCODE_SUCCESS)
     1586                if (   rcExit == RTEXITCODE_SUCCESS
     1587                    && pThis->fPassThruDefines)
    14821588                {
    14831589                    unsigned cchIndent = pThis->pCondStack ? pThis->pCondStack->iKeepLevel : 0;
     
    15171623
    15181624
    1519 static VBCPPEVAL vbcppCondCombine(VBCPPEVAL enmEvalPush, VBCPPEVAL enmEvalTop)
    1520 {
    1521     if (enmEvalTop == kVBCppEval_False)
     1625/**
     1626 * Combines current stack result with the one being pushed.
     1627 *
     1628 * @returns Combined result.
     1629 * @param   enmEvalPush         The result of the condition being pushed.
     1630 * @param   enmEvalStack        The current stack result.
     1631 */
     1632static VBCPPEVAL vbcppCondCombine(VBCPPEVAL enmEvalPush, VBCPPEVAL enmEvalStack)
     1633{
     1634    if (enmEvalStack == kVBCppEval_False)
    15221635        return kVBCppEval_False;
    15231636    return enmEvalPush;
     
    15251638
    15261639
     1640/**
     1641 * Pushes an conditional onto the stack.
     1642 *
     1643 * @returns RTEXITCODE_SUCCESS or RTEXITCODE_FAILURE+msg.
     1644 * @param   pThis               The C preprocessor instance.
     1645 * @param   pStrmInput          The current input stream.
     1646 * @param   offStart            Not currently used, using @a pchCondition and
     1647 *                              @a cchCondition instead.
     1648 * @param   enmKind             The kind of conditional.
     1649 * @param   enmResult           The result of the evaluation.
     1650 * @param   pchCondition        The raw condition.
     1651 * @param   cchCondition        The length of @a pchCondition.
     1652 */
    15271653static RTEXITCODE vbcppCondPush(PVBCPP pThis, PSCMSTREAM pStrmInput, size_t offStart,
    15281654                                VBCPPCONDKIND enmKind, VBCPPEVAL enmResult,
     
    16241750                if (vbcppDefineExists(pThis, pchDefine, cchDefine))
    16251751                    enmEval = kVBCppEval_True;
    1626                 else if (   pThis->enmMode < kVBCppMode_Selective
     1752                else if (   pThis->fUndecidedConditionals
    16271753                         || RTStrSpaceGetN(&pThis->UndefStrSpace, pchDefine, cchDefine) != NULL)
    16281754                    enmEval = kVBCppEval_False;
     
    16701796                if (vbcppDefineExists(pThis, pchDefine, cchDefine))
    16711797                    enmEval = kVBCppEval_False;
    1672                 else if (   pThis->enmMode < kVBCppMode_Selective
     1798                else if (   pThis->fUndecidedConditionals
    16731799                         || RTStrSpaceGetN(&pThis->UndefStrSpace, pchDefine, cchDefine) != NULL)
    16741800                    enmEval = kVBCppEval_True;
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