VirtualBox

Changeset 4215 in vbox for trunk/src/VBox/Debugger


Ignore:
Timestamp:
Aug 18, 2007 7:00:34 AM (17 years ago)
Author:
vboxsync
Message:

Fixed an endless loop in 'd?'. Fixed parameter chopping so it respect multiple unary ops and lack of spaces around ops.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Debugger/DBGConsole.cpp

    r4214 r4215  
    876876};
    877877
     878/** Bitmap where set bits indicates the characters the may start an operator name. */
     879static uint32_t g_bmOperatorChars[256 / (4*8)];
     880
    878881/** Register symbol uUser value.
    879882 * @{
     
    30573060            if (pDbgc->cbDumpElement == 1)
    30583061            {
    3059                 while (i < sizeof(achBuffer))
     3062                while (i++ < sizeof(achBuffer))
    30603063                    pCmdHlp->pfnPrintf(pCmdHlp, NULL, "   ");
    30613064                pCmdHlp->pfnPrintf(pCmdHlp, NULL, "  ");
     
    54365439         */
    54375440        case DBGCVAR_TYPE_NUMBER:
     5441            *pResult = *pArg1;
    54385442            switch (pArg2->enmType)
    54395443            {
     5444                case DBGCVAR_TYPE_SYMBOL:
    54405445                case DBGCVAR_TYPE_STRING:
    54415446                    rc = dbgcSymbolGet(pDbgc, pArg2->u.pszString, DBGCVAR_TYPE_NUMBER, &Var);
     
    56925697         */
    56935698        case DBGCVAR_TYPE_NUMBER:
     5699            *pResult = *pArg1;
    56945700            switch (pArg2->enmType)
    56955701            {
     5702                case DBGCVAR_TYPE_SYMBOL:
    56965703                case DBGCVAR_TYPE_STRING:
    56975704                    rc = dbgcSymbolGet(pDbgc, pArg2->u.pszString, DBGCVAR_TYPE_NUMBER, &Var);
     
    72937300}
    72947301
     7302
     7303/**
     7304 * Initalizes g_bmOperatorChars.
     7305 */
     7306static void dbgcInitOpCharBitMap(void)
     7307{
     7308    memset(g_bmOperatorChars, 0, sizeof(g_bmOperatorChars));
     7309    for (unsigned iOp = 0; iOp < RT_ELEMENTS(g_aOps); iOp++)
     7310        ASMBitSet(&g_bmOperatorChars[0], (uint8_t)g_aOps[iOp].szName[0]);
     7311}
     7312
     7313
     7314/**
     7315 * Checks whether the character may be the start of an operator.
     7316 *
     7317 * @returns true/false.
     7318 * @param   ch      The character.
     7319 */
     7320DECLINLINE(bool) dbgcIsOpChar(char ch)
     7321{
     7322    return ASMBitTest(&g_bmOperatorChars[0], (uint8_t)ch);
     7323}
    72957324
    72967325
     
    79337962        else if (cPar == 0 && !isblank(ch))
    79347963        {
    7935             PCDBGCOP pOp = dbgcOperatorLookup(pDbgc, psz, fBinary, chPrev);
     7964            PCDBGCOP pOp = dbgcIsOpChar(ch)
     7965                         ? dbgcOperatorLookup(pDbgc, psz, fBinary, chPrev)
     7966                         : NULL;
    79367967            if (pOp)
    79377968            {
     
    80888119        char   *psz     = pszArgs;
    80898120        char    ch;
     8121        bool    fBinary = false;
    80908122        for (;;)
    80918123        {
     
    81268158             */
    81278159            else if (ch == '(')
     8160            {
    81288161                cPar++;
     8162                fBinary = false;
     8163            }
    81298164            else if (ch == ')')
    81308165            {
     
    81328167                    return VERR_PARSE_UNBALANCED_PARENTHESIS;
    81338168                cPar--;
     8169                fBinary = true;
    81348170            }
    8135             /*
    8136              * Encountering blanks may mean the end of it all. But of course not
    8137              * while inside a quotation or paranthesis. A binary operator will
    8138              * also force continued parsing.
    8139              */
    8140             else if (isblank(ch) && !cPar && !chQuote)
     8171            else if (!chQuote && !cPar)
    81418172            {
    8142                 pszEnd = psz++;         /* just in case. */
    8143                 while (isblank(*psz))
    8144                     psz++;
    8145                 PCDBGCOP pOp = dbgcOperatorLookup(pDbgc, psz, true, ' ');
    8146                 if (!pOp || !pOp->fBinary)
    8147                     break;              /* the end. */
    8148                 if (pOp)
     8173                /*
     8174                 * Encountering blanks may mean the end of it all. A binary operator
     8175                 * will force continued parsing.
     8176                 */
     8177                if (isblank(*psz))
     8178                {
     8179                    pszEnd = psz++;         /* just in case. */
     8180                    while (isblank(*psz))
     8181                        psz++;
     8182                    PCDBGCOP pOp = dbgcOperatorLookup(pDbgc, psz, fBinary, ' ');
     8183                    if (!pOp || pOp->fBinary != fBinary)
     8184                        break;              /* the end. */
    81498185                    psz += pOp->cchName;
    8150 
    8151                 while (isblank(*psz))   /* skip blanks so we don't get here again */
    8152                     psz++;
    8153                 continue;
     8186                    while (isblank(*psz))   /* skip blanks so we don't get here again */
     8187                        psz++;
     8188                    fBinary = false;
     8189                    continue;
     8190                }
     8191
     8192                /*
     8193                 * Look for operators without a space up front.
     8194                 */
     8195                if (dbgcIsOpChar(*psz))
     8196                {
     8197                    PCDBGCOP pOp = dbgcOperatorLookup(pDbgc, psz, fBinary, ' ');
     8198                    if (pOp)
     8199                    {
     8200                        if (pOp->fBinary != fBinary)
     8201                            break;              /* the end. */
     8202                        psz += pOp->cchName;
     8203                        while (isblank(*psz))   /* skip blanks so we don't get here again */
     8204                            psz++;
     8205                        fBinary = false;
     8206                        continue;
     8207                    }
     8208                    fBinary = true;
     8209                }
    81548210            }
    81558211
     
    86988754    pDbgc->cInputLines      = 0;
    86998755
     8756    dbgcInitOpCharBitMap();
     8757
    87008758    /*
    87018759     * Print welcome message.
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