VirtualBox

Changeset 41561 in vbox for trunk


Ignore:
Timestamp:
Jun 4, 2012 12:10:19 PM (13 years ago)
Author:
vboxsync
Message:

DBGC: Made the parse cope with functions.

Location:
trunk
Files:
1 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/dbg.h

    r41558 r41561  
    365365
    366366
    367 /** Pointer to command descriptor. */
     367/** Pointer to a command descriptor. */
    368368typedef struct DBGCCMD *PDBGCCMD;
    369 /** Pointer to const command descriptor. */
     369/** Pointer to a const command descriptor. */
    370370typedef const struct DBGCCMD *PCDBGCCMD;
     371
     372/** Pointer to a function descriptor. */
     373typedef struct DBGCFUNC *PDBGCFUNC;
     374/** Pointer to a const function descriptor. */
     375typedef const struct DBGCFUNC *PCDBGCFUNC;
    371376
    372377/** Pointer to helper functions for commands. */
     
    887892/**
    888893 * DBGC command descriptor.
    889  *
    890  * If a pResultDesc is specified the command can be called and used
    891  * as a function too. If it's a pure function, set fFlags to
    892  * DBGCCMD_FLAGS_FUNCTION.
    893894 */
    894895typedef struct DBGCCMD
     
    920921
    921922
     923/**
     924 * Function handler.
     925 *
     926 * The console will call the handler for a command once it's finished
     927 * parsing the user input.  The command handler function is responsible
     928 * for executing the command itself.
     929 *
     930 * @returns VBox status.
     931 * @param   pCmd        Pointer to the command descriptor (as registered).
     932 * @param   pCmdHlp     Pointer to command helper functions.
     933 * @param   pVM         Pointer to the current VM (if any).
     934 * @param   paArgs      Pointer to (readonly) array of arguments.
     935 * @param   cArgs       Number of arguments in the array.
     936 * @param   pResult     Where to return the result.
     937 */
     938typedef DECLCALLBACK(int) FNDBGCFUNC(PCDBGCFUNC pFunc, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, unsigned cArgs,
     939                                     PDBGCVAR pResult);
     940/** Pointer to a FNDBGCFUNC() function. */
     941typedef FNDBGCFUNC *PFNDBGCFUNC;
     942
     943/**
     944 * DBGC function descriptor.
     945 */
     946typedef struct DBGCFUNC
     947{
     948    /** Command string. */
     949    const char     *pszFuncNm;
     950    /** Minimum number of arguments. */
     951    unsigned        cArgsMin;
     952    /** Max number of arguments. */
     953    unsigned        cArgsMax;
     954    /** Argument descriptors (array). */
     955    PCDBGCVARDESC   paArgDescs;
     956    /** Number of argument descriptors. */
     957    unsigned        cArgDescs;
     958    /** flags. (reserved for now) */
     959    unsigned        fFlags;
     960    /** Handler function. */
     961    PFNDBGCFUNC     pfnHandler;
     962    /** Function syntax. */
     963    const char     *pszSyntax;
     964    /** Function description. */
     965    const char     *pszDescription;
     966} DBGCFUNC;
     967
     968
    922969
    923970/** Pointer to a DBGC backend. */
  • trunk/include/VBox/err.h

    r41559 r41561  
    21662166/** Syntax error - Command not found. */
    21672167#define VERR_DBGC_PARSE_COMMAND_NOT_FOUND           (VERR_DBGC_PARSE_LOWEST + 24)
     2168/** Syntax error - buggy parser. */
     2169#define VERR_DBGC_PARSE_BUG                         (VERR_DBGC_PARSE_LOWEST + 25)
    21682170
    21692171
  • trunk/src/VBox/Debugger/DBGCCommands.cpp

    r41553 r41561  
    55
    66/*
    7  * Copyright (C) 2006-2011 Oracle Corporation
     7 * Copyright (C) 2006-2012 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3535#include <iprt/ldr.h>
    3636#include <iprt/mem.h>
     37#include <iprt/rand.h>
    3738#include <iprt/path.h>
    3839#include <iprt/string.h>
     
    220221
    221222/** Command descriptors for the basic commands. */
    222 const DBGCCMD    g_aCmds[] =
     223const DBGCCMD    g_aDbgcCmds[] =
    223224{
    224225    /* pszCmd,      cArgsMin, cArgsMax, paArgDescs,          cArgDescs,               fFlags, pfnHandler        pszSyntax,          ....pszDescription */
     
    259260    { "writecore",  1,        1,        &g_aArgWriteCore[0], RT_ELEMENTS(g_aArgWriteCore), 0, dbgcCmdWriteCore,   "<filename>",           "Write core to file." },
    260261};
    261 
    262262/** The number of native commands. */
    263 const unsigned g_cCmds = RT_ELEMENTS(g_aCmds);
    264 
    265 
    266 /**
    267  * Pointer to head of the list of external commands.
    268  */
    269 static PDBGCEXTCMDS g_pExtCmdsHead;     /** @todo rw protect g_pExtCmdsHead! */
    270 /** Locks the g_pExtCmdsHead list for reading. */
    271 #define DBGCEXTCMDS_LOCK_RD()       do { } while (0)
    272 /** Locks the g_pExtCmdsHead list for writing. */
    273 #define DBGCEXTCMDS_LOCK_WR()       do { } while (0)
    274 /** UnLocks the g_pExtCmdsHead list after reading. */
    275 #define DBGCEXTCMDS_UNLOCK_RD()     do { } while (0)
    276 /** UnLocks the g_pExtCmdsHead list after writing. */
    277 #define DBGCEXTCMDS_UNLOCK_WR()     do { } while (0)
     263const uint32_t      g_cDbgcCmds = RT_ELEMENTS(g_aDbgcCmds);
     264/** Pointer to head of the list of external commands. */
     265static PDBGCEXTCMDS g_pExtCmdsHead;
    278266
    279267
     
    292280 * @param   fExternal   Whether or not the routine is external.
    293281 */
    294 PCDBGCCMD dbgcRoutineLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal)
     282PCDBGCCMD dbgcCommandLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal)
    295283{
    296284    if (!fExternal)
     
    307295        }
    308296
    309         for (unsigned iCmd = 0; iCmd < RT_ELEMENTS(g_aCmds); iCmd++)
    310         {
    311             if (    !strncmp(pachName, g_aCmds[iCmd].pszCmd, cchName)
    312                 &&  !g_aCmds[iCmd].pszCmd[cchName])
    313                 return &g_aCmds[iCmd];
     297        for (unsigned iCmd = 0; iCmd < RT_ELEMENTS(g_aDbgcCmds); iCmd++)
     298        {
     299            if (    !strncmp(pachName, g_aDbgcCmds[iCmd].pszCmd, cchName)
     300                &&  !g_aDbgcCmds[iCmd].pszCmd[cchName])
     301                return &g_aDbgcCmds[iCmd];
    314302        }
    315303    }
    316304    else
    317305    {
    318         DBGCEXTCMDS_LOCK_RD();
     306        DBGCEXTLISTS_LOCK_RD();
    319307        for (PDBGCEXTCMDS pExtCmds = g_pExtCmdsHead; pExtCmds; pExtCmds = pExtCmds->pNext)
    320308        {
     
    326314            }
    327315        }
    328         DBGCEXTCMDS_UNLOCK_RD();
    329     }
    330 
    331     NOREF(pDbgc);
     316        DBGCEXTLISTS_UNLOCK_RD();
     317    }
     318
    332319    return NULL;
    333320}
     
    348335     * Lock the list.
    349336     */
    350     DBGCEXTCMDS_LOCK_WR();
     337    DBGCEXTLISTS_LOCK_WR();
    351338    PDBGCEXTCMDS pCur = g_pExtCmdsHead;
    352339    while (pCur)
     
    354341        if (paCommands == pCur->paCmds)
    355342        {
    356             DBGCEXTCMDS_UNLOCK_WR();
     343            DBGCEXTLISTS_UNLOCK_WR();
    357344            AssertMsgFailed(("Attempt at re-registering %d command(s)!\n", cCommands));
    358345            return VWRN_DBGC_ALREADY_REGISTERED;
     
    375362    else
    376363        rc = VERR_NO_MEMORY;
    377     DBGCEXTCMDS_UNLOCK_WR();
     364    DBGCEXTLISTS_UNLOCK_WR();
    378365
    379366    return rc;
     
    395382     * Lock the list.
    396383     */
    397     DBGCEXTCMDS_LOCK_WR();
     384    DBGCEXTLISTS_LOCK_WR();
    398385    PDBGCEXTCMDS pPrev = NULL;
    399386    PDBGCEXTCMDS pCur = g_pExtCmdsHead;
     
    406393            else
    407394                g_pExtCmdsHead = pCur->pNext;
    408             DBGCEXTCMDS_UNLOCK_WR();
     395            DBGCEXTLISTS_UNLOCK_WR();
    409396
    410397            RTMemFree(pCur);
     
    414401        pCur = pCur->pNext;
    415402    }
    416     DBGCEXTCMDS_UNLOCK_WR();
     403    DBGCEXTLISTS_UNLOCK_WR();
    417404
    418405    NOREF(cCommands);
     
    498485                                "-------------------\n"
    499486                                "\n"
    500                                 "Commands and Functions:\n");
    501         for (i = 0; i < RT_ELEMENTS(g_aCmds); i++)
     487                                "Commands:\n");
     488        for (i = 0; i < RT_ELEMENTS(g_aDbgcCmds); i++)
    502489            rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL,
    503490                                    "%-11s %-30s %s\n",
    504                                     g_aCmds[i].pszCmd,
    505                                     g_aCmds[i].pszSyntax,
    506                                     g_aCmds[i].pszDescription);
     491                                    g_aDbgcCmds[i].pszCmd,
     492                                    g_aDbgcCmds[i].pszSyntax,
     493                                    g_aDbgcCmds[i].pszDescription);
    507494        rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL,
    508495                                "\n"
     
    518505        if (g_pExtCmdsHead)
    519506        {
    520             DBGCEXTCMDS_LOCK_RD();
     507            DBGCEXTLISTS_LOCK_RD();
    521508            rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL,
    522509                                    "\n"
    523                                     "External Commands and Functions:\n");
     510                                    "External Commands:\n");
    524511            for (PDBGCEXTCMDS pExtCmd = g_pExtCmdsHead; pExtCmd; pExtCmd = pExtCmd->pNext)
    525512                for (i = 0; i < pExtCmd->cCmds; i++)
     
    529516                                            pExtCmd->paCmds[i].pszSyntax,
    530517                                            pExtCmd->paCmds[i].pszDescription);
    531             DBGCEXTCMDS_UNLOCK_RD();
    532         }
     518            DBGCEXTLISTS_UNLOCK_RD();
     519        }
     520
     521
    533522
    534523        rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL,
     
    536525                                "Operators:\n");
    537526        unsigned iPrecedence = 0;
    538         unsigned cLeft = g_cOps;
     527        unsigned cLeft = g_cDbgcOps;
    539528        while (cLeft > 0)
    540529        {
    541             for (i = 0; i < g_cOps; i++)
    542                 if (g_aOps[i].iPrecedence == iPrecedence)
     530            for (i = 0; i < g_cDbgcOps; i++)
     531                if (g_aDbgcOps[i].iPrecedence == iPrecedence)
    543532                {
    544533                    rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL,
    545534                                            "%-10s  %s  %s\n",
    546                                             g_aOps[i].szName,
    547                                             g_aOps[i].fBinary ? "Binary" : "Unary ",
    548                                             g_aOps[i].pszDescription);
     535                                            g_aDbgcOps[i].szName,
     536                                            g_aDbgcOps[i].fBinary ? "Binary" : "Unary ",
     537                                            g_aDbgcOps[i].pszDescription);
    549538                    cLeft--;
    550539                }
     
    572561
    573562            /* lookup in the command list (even when found in the emulation) */
    574             for (i = 0; i < RT_ELEMENTS(g_aCmds); i++)
    575                 if (RTStrSimplePatternMatch(pszPattern, g_aCmds[i].pszCmd))
     563            for (i = 0; i < RT_ELEMENTS(g_aDbgcCmds); i++)
     564                if (RTStrSimplePatternMatch(pszPattern, g_aDbgcCmds[i].pszCmd))
    576565                {
    577                     rc = dbgcPrintHelp(pCmdHlp, &g_aCmds[i], false);
     566                    rc = dbgcPrintHelp(pCmdHlp, &g_aDbgcCmds[i], false);
    578567                    fFound = true;
    579568                }
     
    586575                     || *pszPattern == '*'))
    587576           {
    588                DBGCEXTCMDS_LOCK_RD();
     577               DBGCEXTLISTS_LOCK_RD();
    589578               const char *pszPattern2 = pszPattern + (*pszPattern == '.' || *pszPattern == '?');
    590579               for (PDBGCEXTCMDS pExtCmd = g_pExtCmdsHead; pExtCmd; pExtCmd = pExtCmd->pNext)
     
    595584                           fFound = true;
    596585                       }
    597                DBGCEXTCMDS_UNLOCK_RD();
     586               DBGCEXTLISTS_UNLOCK_RD();
    598587           }
    599588
    600589           /* operators */
    601            if (!fFound && strlen(paArgs[iArg].u.pszString) < sizeof(g_aOps[i].szName))
     590           if (!fFound && strlen(paArgs[iArg].u.pszString) < sizeof(g_aDbgcOps[i].szName))
    602591           {
    603                for (i = 0; i < g_cOps; i++)
    604                    if (RTStrSimplePatternMatch(pszPattern, g_aOps[i].szName))
     592               for (i = 0; i < g_cDbgcOps; i++)
     593                   if (RTStrSimplePatternMatch(pszPattern, g_aDbgcOps[i].szName))
    605594                   {
    606595                       rc = pCmdHlp->pfnPrintf(pCmdHlp, NULL,
    607596                                               "%-10s  %s  %s\n",
    608                                                g_aOps[i].szName,
    609                                                g_aOps[i].fBinary ? "Binary" : "Unary ",
    610                                                g_aOps[i].pszDescription);
     597                                               g_aDbgcOps[i].szName,
     598                                               g_aDbgcOps[i].fBinary ? "Binary" : "Unary ",
     599                                               g_aDbgcOps[i].pszDescription);
    611600                       fFound = true;
    612601                   }
     
    21032092}
    21042093
     2094
     2095
     2096/**
     2097 * @callback_method_impl{The randu32() function implementation.}
     2098 */
     2099static DECLCALLBACK(int) dbgcFuncRandU32(PCDBGCFUNC pFunc, PDBGCCMDHLP pCmdHlp, PVM pVM, PCDBGCVAR paArgs, uint32_t cArgs,
     2100                                         PDBGCVAR pResult)
     2101{
     2102    AssertReturn(cArgs == 0, VERR_DBGC_PARSE_BUG);
     2103    uint32_t u32 = RTRandU32();
     2104    DBGCVAR_INIT_NUMBER(pResult, u32);
     2105    NOREF(pFunc); NOREF(pCmdHlp); NOREF(pVM); NOREF(paArgs);
     2106    return VINF_SUCCESS;
     2107}
     2108
  • trunk/src/VBox/Debugger/DBGCEmulateCodeView.cpp

    r41542 r41561  
    368368
    369369/** The number of commands in the CodeView/WinDbg emulation. */
    370 const unsigned g_cCmdsCodeView = RT_ELEMENTS(g_aCmdsCodeView);
    371 
     370const uint32_t g_cCmdsCodeView = RT_ELEMENTS(g_aCmdsCodeView);
     371
     372
     373/** Function descriptors for the CodeView / WinDbg emulation.
     374 * The emulation isn't attempting to be identical, only somewhat similar.
     375 */
     376const DBGCFUNC g_aFuncsCodeView[] =
     377{
     378};
     379
     380/** The number of functions in the CodeView/WinDbg emulation. */
     381const uint32_t g_cFuncsCodeView = RT_ELEMENTS(g_aFuncsCodeView);
    372382
    373383
  • trunk/src/VBox/Debugger/DBGCEval.cpp

    r41559 r41561  
    4343
    4444
     45/*******************************************************************************
     46*   Internal Functions                                                         *
     47*******************************************************************************/
     48static int dbgcProcessArguments(PDBGC pDbgc, const char *pszCmdOrFunc,
     49                                uint32_t const cArgsMin, uint32_t const cArgsMax,
     50                                PCDBGCVARDESC const paVarDescs, uint32_t const cVarDescs,
     51                                char *pszArgs, unsigned *piArg, unsigned *pcArgs);
     52
     53
    4554
    4655/**
     
    5059{
    5160    memset(g_bmOperatorChars, 0, sizeof(g_bmOperatorChars));
    52     for (unsigned iOp = 0; iOp < g_cOps; iOp++)
    53         ASMBitSet(&g_bmOperatorChars[0], (uint8_t)g_aOps[iOp].szName[0]);
     61    for (unsigned iOp = 0; iOp < g_cDbgcOps; iOp++)
     62        ASMBitSet(&g_bmOperatorChars[0], (uint8_t)g_aDbgcOps[iOp].szName[0]);
    5463}
    5564
     
    312321
    313322
     323static int dbgcEvalSubCall(PDBGC pDbgc, char *pszFuncNm, size_t cchFuncNm, bool fExternal, char *pszArgs, size_t cchArgs,
     324                           DBGCVARCAT enmCategory, PDBGCVAR pResult)
     325{
     326    /*
     327     * Lookup the function.
     328     */
     329    PCDBGCFUNC pFunc = dbgcFunctionLookup(pDbgc, pszFuncNm, cchFuncNm, fExternal);
     330    if (!pFunc)
     331        return VERR_DBGC_PARSE_FUNCTION_NOT_FOUND;
     332
     333    /*
     334     * Parse the arguments.
     335     */
     336    unsigned cArgs;
     337    unsigned iArg;
     338    pszArgs[cchArgs] = '\0';
     339    int rc = dbgcProcessArguments(pDbgc, pFunc->pszFuncNm,
     340                                  pFunc->cArgsMin, pFunc->cArgsMax, pFunc->paArgDescs, pFunc->cArgDescs,
     341                                  pszArgs, &iArg, &cArgs);
     342    if (RT_SUCCESS(rc))
     343        rc = pFunc->pfnHandler(pFunc, &pDbgc->CmdHlp, pDbgc->pVM, &pDbgc->aArgs[iArg], cArgs, pResult);
     344    pDbgc->iArg = iArg;
     345    return rc;
     346}
     347
     348
    314349/**
    315350 * Evaluates one argument with respect to unary operators.
     
    389424    if (pszFunEnd)
    390425    {
    391         /*
    392          * Ok, it's a function call.
    393          */
    394         if (fExternal)
    395             pszExpr++, cchExpr--;
    396         PCDBGCCMD pFun = dbgcRoutineLookup(pDbgc, pszExpr, pszFunEnd - pszExpr, fExternal);
    397         if (!pFun)
    398             return VERR_DBGC_PARSE_FUNCTION_NOT_FOUND;
    399 #if 0
    400         if (!pFun->pResultDesc)
    401             return VERR_DBGC_PARSE_NOT_A_FUNCTION;
    402 
    403         /*
    404          * Parse the expression in parenthesis.
    405          */
    406         cchExpr -= pszFunEnd - pszExpr;
    407         pszExpr = pszFunEnd;
    408         /** @todo implement multiple arguments. */
    409         DBGCVAR     Arg;
    410         rc = dbgcEvalSub(pDbgc, pszExpr, cchExpr, enmCategory, &Arg);
    411         if (!rc)
    412         {
    413             rc = dbgcEvalSubMatchVars(pDbgc, pFun->cArgsMin, pFun->cArgsMax, pFun->paArgDescs, pFun->cArgDescs, &Arg, 1);
    414             if (!rc)
    415                 rc = pFun->pfnHandler(pFun, &pDbgc->CmdHlp, pDbgc->pVM, &Arg, 1, pResult);
    416         }
    417         else if (rc == VERR_DBGC_PARSE_EMPTY_ARGUMENT && pFun->cArgsMin == 0)
    418             rc = pFun->pfnHandler(pFun, &pDbgc->CmdHlp, pDbgc->pVM, NULL, 0, pResult);
    419 #else
    420         rc = VERR_NOT_IMPLEMENTED;
    421 #endif
    422         return rc;
     426        size_t cchFunNm = pszFunEnd - pszFun;
     427        return dbgcEvalSubCall(pDbgc, pszFun, cchFunNm, fExternal, pszFunEnd + 1, cchExpr - cchFunNm - fExternal - 2,
     428                               enmCategory, pResult);
    423429    }
    424430
     
    591597        else if (ch == '(')
    592598        {
    593             if (!cPar && (fBinary || cchWord)) /** @todo function call */
     599            if (!cPar && fBinary && !cchWord)
    594600                return VERR_DBGC_PARSE_EXPECTED_BINARY_OP;
    595601            cPar++;
     
    936942 *          argument is indicated by *pcArg.
    937943 *
    938  * @param   pDbgc       Debugger console instance data.
    939  * @param   pCmd        Pointer to the command descriptor.
    940  * @param   pszArg      Pointer to the arguments to parse.
    941  * @param   paArgs      Where to store the parsed arguments.
    942  * @param   cArgs       Size of the paArgs array.
    943  * @param   pcArgs      Where to store the number of arguments.  In the event
    944  *                      of an error this is (ab)used to store the index of the
    945  *                      offending argument.
     944 * @param   pDbgc           Debugger console instance data.
     945 * @param   pszCmdOrFunc    The name of the function or command. (For logging.)
     946 * @param   cArgsMin        See DBGCCMD::cArgsMin and DBGCFUNC::cArgsMin.
     947 * @param   cArgsMax        See DBGCCMD::cArgsMax and DBGCFUNC::cArgsMax.
     948 * @param   paVarDescs      See DBGCCMD::paVarDescs and DBGCFUNC::paVarDescs.
     949 * @param   cVarDescs       See DBGCCMD::cVarDescs and DBGCFUNC::cVarDescs.
     950 * @param   pszArg          Pointer to the arguments to parse.
     951 * @param   piArg           Where to return the index of the first argument in
     952 *                          DBGC::aArgs. Always set. Caller must restore DBGC::iArg
     953 *                          to this value when done, even on failure.
     954 * @param   pcArgs          Where to store the number of arguments.  In the event
     955 *                          of an error this is (ab)used to store the index of the
     956 *                          offending argument.
    946957 */
    947 static int dbgcProcessArguments(PDBGC pDbgc, PCDBGCCMD pCmd, char *pszArgs, PDBGCVAR paArgs, unsigned cArgs, unsigned *pcArgs)
     958static int dbgcProcessArguments(PDBGC pDbgc, const char *pszCmdOrFunc,
     959                                uint32_t const cArgsMin, uint32_t const cArgsMax,
     960                                PCDBGCVARDESC const paVarDescs, uint32_t const cVarDescs,
     961                                char *pszArgs, unsigned *piArg, unsigned *pcArgs)
    948962{
    949     Log2(("dbgcProcessArguments: pCmd=%s pszArgs='%s'\n", pCmd->pszCmd, pszArgs));
     963    Log2(("dbgcProcessArguments: pszCmdOrFunc=%s pszArgs='%s'\n", pszCmdOrFunc, pszArgs));
    950964
    951965    /*
    952966     * Check if we have any argument and if the command takes any.
    953967     */
     968    *piArg  = pDbgc->iArg;
    954969    *pcArgs = 0;
    955970    /* strip leading blanks. */
     
    958973    if (!*pszArgs)
    959974    {
    960         if (!pCmd->cArgsMin)
     975        if (!cArgsMin)
    961976            return VINF_SUCCESS;
    962977        return VERR_DBGC_PARSE_TOO_FEW_ARGUMENTS;
    963978    }
    964     /** @todo fixme - foo() doesn't work. */
    965     if (!pCmd->cArgsMax)
     979    if (!cArgsMax)
    966980        return VERR_DBGC_PARSE_TOO_MANY_ARGUMENTS;
    967981
     
    969983     * The parse loop.
    970984     */
    971     PDBGCVAR        pArg0       = &paArgs[0];
    972     PDBGCVAR        pArg        = pArg0;
     985    PDBGCVAR        pArg        = &pDbgc->aArgs[pDbgc->iArg];
    973986    PCDBGCVARDESC   pPrevDesc   = NULL;
    974     PCDBGCVARDESC   paVarDescs  = pCmd->paArgDescs;
    975     unsigned const  cVarDescs   = pCmd->cArgDescs;
    976987    unsigned        cCurDesc    = 0;
    977988    unsigned        iVar        = 0;
     
    983994         * Can we have another argument?
    984995         */
    985         if (*pcArgs >= pCmd->cArgsMax)
     996        if (*pcArgs >= cArgsMax)
    986997            return VERR_DBGC_PARSE_TOO_MANY_ARGUMENTS;
    987         if (pArg >= &paArgs[cArgs])
     998        if (pDbgc->iArg >= RT_ELEMENTS(pDbgc->aArgs))
    988999            return VERR_DBGC_PARSE_ARGUMENT_OVERFLOW;
    9891000        if (iVarDesc >= cVarDescs)
     
    10511062            else if (ch == '(')
    10521063            {
    1053                 if (!cPar && fBinary)
    1054                     return VERR_DBGC_PARSE_EXPECTED_BINARY_OP;
    10551064                cPar++;
    10561065                fBinary = false;
     
    11811190        iVar++;
    11821191        pArg++;
    1183         (*pcArgs)++;
     1192        pDbgc->iArg++;
     1193        *pcArgs += 1;
    11841194        pszArgs = psz;
    11851195        while (*pszArgs && RT_C_IS_BLANK(*pszArgs))
     
    12491259     * Find the command.
    12501260     */
    1251     PCDBGCCMD pCmd = dbgcRoutineLookup(pDbgc, pszCmd, pszArgs - pszCmd, fExternal);
     1261    PCDBGCCMD pCmd = dbgcCommandLookup(pDbgc, pszCmd, pszArgs - pszCmd, fExternal);
    12521262    if (!pCmd)
    12531263    {
     
    12591269     * Parse arguments (if any).
    12601270     */
     1271    unsigned iArg;
    12611272    unsigned cArgs;
    1262     int rc = dbgcProcessArguments(pDbgc, pCmd, pszArgs, &pDbgc->aArgs[pDbgc->iArg],
    1263                                   RT_ELEMENTS(pDbgc->aArgs) - pDbgc->iArg, &cArgs);
     1273    int rc = dbgcProcessArguments(pDbgc,  pCmd->pszCmd,
     1274                                  pCmd->cArgsMin, pCmd->cArgsMax, pCmd->paArgDescs, pCmd->cArgDescs,
     1275                                  pszArgs, &iArg, &cArgs);
    12641276    if (RT_SUCCESS(rc))
    12651277    {
     
    12701282         */
    12711283        if (!fNoExecute)
    1272             rc = pCmd->pfnHandler(pCmd, &pDbgc->CmdHlp, pDbgc->pVM, &pDbgc->aArgs[0], cArgs);
     1284            rc = pCmd->pfnHandler(pCmd, &pDbgc->CmdHlp, pDbgc->pVM, &pDbgc->aArgs[iArg], cArgs);
    12731285        pDbgc->rcCmd = rc;
     1286        pDbgc->iArg  = iArg;
    12741287        if (rc == VERR_DBGC_COMMAND_FAILED)
    12751288            rc = VINF_SUCCESS;
     
    12781291    {
    12791292        pDbgc->rcCmd = rc;
     1293        pDbgc->iArg  = iArg;
    12801294
    12811295        /* report parse / eval error. */
     
    13731387        }
    13741388    }
     1389
    13751390    return rc;
    13761391}
  • trunk/src/VBox/Debugger/DBGCInternal.h

    r41553 r41561  
    118118    /** The current debugger emulation. */
    119119    const char         *pszEmulation;
    120     /** Pointer to the command and functions for the current debugger emulation. */
     120    /** Pointer to the commands for the current debugger emulation. */
    121121    PCDBGCCMD           paEmulationCmds;
    122122    /** The number of commands paEmulationCmds points to. */
    123123    unsigned            cEmulationCmds;
     124    /** Pointer to the functions for the current debugger emulation. */
     125    PCDBGCFUNC          paEmulationFuncs;
     126    /** The number of functions paEmulationFuncs points to. */
     127    uint32_t            cEmulationFuncs;
    124128    /** Log indicator. (If set we're writing the log to the console.) */
    125129    bool                fLog;
     
    227231/** Pointer to chunk of external commands. */
    228232typedef DBGCEXTCMDS *PDBGCEXTCMDS;
     233
     234
     235/**
     236 * Chunk of external functions.
     237 */
     238typedef struct DBGCEXTFUNCS
     239{
     240    /** Number of functions descriptors. */
     241    uint32_t            cFuncs;
     242    /** Pointer to array of functions descriptors. */
     243    PCDBGCFUNC          paFuncs;
     244    /** Pointer to the next chunk. */
     245    struct DBGCEXTFUNCS *pNext;
     246} DBGCEXTFUNCS;
     247/** Pointer to chunk of external functions. */
     248typedef DBGCEXTFUNCS *PDBGCEXTFUNCS;
    229249
    230250
     
    363383PCDBGCSYM   dbgcLookupRegisterSymbol(PDBGC pDbgc, const char *pszSymbol);
    364384PCDBGCOP    dbgcOperatorLookup(PDBGC pDbgc, const char *pszExpr, bool fPreferBinary, char chPrev);
    365 PCDBGCCMD   dbgcRoutineLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
     385PCDBGCCMD   dbgcCommandLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
     386PCDBGCFUNC  dbgcFunctionLookup(PDBGC pDbgc, const char *pachName, size_t cchName, bool fExternal);
    366387
    367388DECLCALLBACK(int) dbgcOpRegister(PDBGC pDbgc, PCDBGCVAR pArg, DBGCVARCAT enmCat, PDBGCVAR pResult);
     
    386407*   Global Variables                                                           *
    387408*******************************************************************************/
    388 extern const DBGCCMD    g_aCmds[];
    389 extern const unsigned   g_cCmds;
     409extern const DBGCCMD    g_aDbgcCmds[];
     410extern const uint32_t   g_cDbgcCmds;
     411extern const DBGCFUNC   g_aDbgcFuncs[];
     412extern const uint32_t   g_cDbgcFuncs;
    390413extern const DBGCCMD    g_aCmdsCodeView[];
    391 extern const unsigned   g_cCmdsCodeView;
    392 extern const DBGCOP     g_aOps[];
    393 extern const unsigned   g_cOps;
     414extern const uint32_t   g_cCmdsCodeView;
     415extern const DBGCFUNC   g_aFuncsCodeView[];
     416extern const uint32_t   g_cFuncsCodeView;
     417extern const DBGCOP     g_aDbgcOps[];
     418extern const uint32_t   g_cDbgcOps;
     419
     420
     421/*******************************************************************************
     422*   Defined Constants And Macros                                               *
     423*******************************************************************************/
     424/** Locks the g_pExtCmdsHead and g_pExtFuncsHead lists for reading. */
     425#define DBGCEXTLISTS_LOCK_RD()      do { } while (0)
     426/** Locks the g_pExtCmdsHead and g_pExtFuncsHead lists for writing. */
     427#define DBGCEXTLISTS_LOCK_WR()      do { } while (0)
     428/** UnLocks the g_pExtCmdsHead and g_pExtFuncsHead lists after reading. */
     429#define DBGCEXTLISTS_UNLOCK_RD()    do { } while (0)
     430/** UnLocks the g_pExtCmdsHead and g_pExtFuncsHead lists after writing. */
     431#define DBGCEXTLISTS_UNLOCK_WR()    do { } while (0)
     432
    394433
    395434
  • trunk/src/VBox/Debugger/DBGCOps.cpp

    r41553 r41561  
    152152*******************************************************************************/
    153153/** Operators. */
    154 const DBGCOP g_aOps[] =
     154const DBGCOP g_aDbgcOps[] =
    155155{
    156156    /* szName is initialized as a 4 char array because of M$C elsewise optimizing it away in /Ox mode (the 'const char' vs 'char' problem). */
     
    185185
    186186/** Number of operators in the operator array. */
    187 const unsigned g_cOps = RT_ELEMENTS(g_aOps);
     187const uint32_t g_cDbgcOps = RT_ELEMENTS(g_aDbgcOps);
    188188
    189189
     
    14001400{
    14011401    PCDBGCOP    pOp = NULL;
    1402     for (unsigned iOp = 0; iOp < RT_ELEMENTS(g_aOps); iOp++)
    1403     {
    1404         if (     g_aOps[iOp].szName[0] == pszExpr[0]
    1405             &&  (!g_aOps[iOp].szName[1] || g_aOps[iOp].szName[1] == pszExpr[1])
    1406             &&  (!g_aOps[iOp].szName[2] || g_aOps[iOp].szName[2] == pszExpr[2]))
     1402    for (unsigned iOp = 0; iOp < RT_ELEMENTS(g_aDbgcOps); iOp++)
     1403    {
     1404        if (     g_aDbgcOps[iOp].szName[0] == pszExpr[0]
     1405            &&  (!g_aDbgcOps[iOp].szName[1] || g_aDbgcOps[iOp].szName[1] == pszExpr[1])
     1406            &&  (!g_aDbgcOps[iOp].szName[2] || g_aDbgcOps[iOp].szName[2] == pszExpr[2]))
    14071407        {
    14081408            /*
     
    14101410             */
    14111411            unsigned j;
    1412             for (j = iOp + 1; j < RT_ELEMENTS(g_aOps); j++)
    1413                 if (    g_aOps[j].cchName > g_aOps[iOp].cchName
    1414                     &&  g_aOps[j].szName[0] == pszExpr[0]
    1415                     &&  (!g_aOps[j].szName[1] || g_aOps[j].szName[1] == pszExpr[1])
    1416                     &&  (!g_aOps[j].szName[2] || g_aOps[j].szName[2] == pszExpr[2]) )
     1412            for (j = iOp + 1; j < RT_ELEMENTS(g_aDbgcOps); j++)
     1413                if (    g_aDbgcOps[j].cchName > g_aDbgcOps[iOp].cchName
     1414                    &&  g_aDbgcOps[j].szName[0] == pszExpr[0]
     1415                    &&  (!g_aDbgcOps[j].szName[1] || g_aDbgcOps[j].szName[1] == pszExpr[1])
     1416                    &&  (!g_aDbgcOps[j].szName[2] || g_aDbgcOps[j].szName[2] == pszExpr[2]) )
    14171417                    break;
    1418             if (j < RT_ELEMENTS(g_aOps))
     1418            if (j < RT_ELEMENTS(g_aDbgcOps))
    14191419                continue;       /* we'll catch it later. (for theoretical +,++,+++ cases.) */
    1420             pOp = &g_aOps[iOp];
     1420            pOp = &g_aDbgcOps[iOp];
    14211421
    14221422            /*
    14231423             * Preferred type?
    14241424             */
    1425             if (g_aOps[iOp].fBinary == fPreferBinary)
     1425            if (g_aDbgcOps[iOp].fBinary == fPreferBinary)
    14261426                break;
    14271427        }
  • trunk/src/VBox/Debugger/DBGConsole.cpp

    r41553 r41561  
    868868    pDbgc->paEmulationCmds  = &g_aCmdsCodeView[0];
    869869    pDbgc->cEmulationCmds   = g_cCmdsCodeView;
     870    pDbgc->paEmulationFuncs = &g_aFuncsCodeView[0];
     871    pDbgc->cEmulationFuncs  = g_cFuncsCodeView;
    870872    //pDbgc->fLog             = false;
    871873    pDbgc->fRegCtxGuest     = true;
  • trunk/src/VBox/Debugger/Makefile.kmk

    r41477 r41561  
    4747        DBGCCmdHlp.cpp \
    4848        DBGCCmdWorkers.cpp \
    49         DBGCCommands.cpp \
     49                DBGCCommands.cpp \
     50        DBGCFunctions.cpp \
    5051        DBGCEmulateCodeView.cpp \
    5152        DBGCOps.cpp \
  • trunk/src/VBox/Debugger/testcase/tstDBGCParser.cpp

    r41559 r41561  
    11361136    tstTry(pDbgc, "format (1)(1)\n", VERR_DBGC_PARSE_EXPECTED_BINARY_OP);
    11371137    tstTry(pDbgc, "format (1)''\n", VERR_DBGC_PARSE_EXPECTED_BINARY_OP);
    1138     tstTry(pDbgc, "format foo(1)\n", VERR_DBGC_PARSE_EXPECTED_BINARY_OP); /** @todo VERR_DBGC_PARSE_FUNCTION_NOT_FOUND */
     1138    tstTry(pDbgc, "format nosuchfunction(1)\n", VERR_DBGC_PARSE_FUNCTION_NOT_FOUND);
     1139    tstTry(pDbgc, "format nosuchfunction(1,2,3)\n", VERR_DBGC_PARSE_FUNCTION_NOT_FOUND);
     1140    tstTry(pDbgc, "format nosuchfunction()\n", VERR_DBGC_PARSE_FUNCTION_NOT_FOUND);
     1141    tstTry(pDbgc, "format randu32()\n", VINF_SUCCESS);
    11391142    tstTry(pDbgc, "sa 3 23 4 'q' \"21123123\" 'b' \n", VINF_SUCCESS);
    11401143    tstTry(pDbgc, "sa 3,23, 4,'q' ,\"21123123\" , 'b' \n", VINF_SUCCESS);
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