VirtualBox

Changeset 84068 in vbox for trunk/src


Ignore:
Timestamp:
Apr 28, 2020 11:34:42 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
137647
Message:

IPRT,++: Compress the windows status code info (errmsgwin.cpp) to save space and reduce load time a tiny bit. [test + fix] bugref:9726

Location:
trunk/src/VBox/Runtime
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/testcase/tstRTErr-1.cpp

    r84057 r84068  
    4545    char         szMsgAll[sizeof(szMsgShort) + 80];
    4646    size_t const cbBuf  = sizeof(szMsgShort);
    47     char        *pszBuf = (char *)RTTestGuardedAllocTail(hTest, cbBuf);
     47    char * const pszBuf = (char *)RTTestGuardedAllocTail(hTest, cbBuf);
    4848    RTTESTI_CHECK_RETV(pszBuf);
    4949
     
    125125#define CHECK_TEST_RESULT2(a_szFunction, a_pszExpect, a_cchExpect) do { \
    126126                    ssize_t const cchLocalExpect = cbBuf2 > (a_cchExpect) ? (ssize_t)(a_cchExpect) : -(ssize_t)(a_cchExpect) - 1; \
    127                     if (cchRet != cchLocalExpect) \
     127                    if (cchRet != cchLocalExpect && cchRet > 0) \
     128                        RTTestFailed(hTest, "%s(%s, , %#x) -> %zd, expected %zd ('%s' vs '%s')", a_szFunction, pszDefine, cbBuf2, \
     129                                     cchRet, cchLocalExpect, pszBuf2, (a_pszExpect)); \
     130                    else if (cchRet != cchLocalExpect && cchRet <= 0) \
    128131                        RTTestFailed(hTest, "%s(%s, , %#x) -> %zd, expected %zd", a_szFunction, pszDefine, cbBuf2, \
    129132                                     cchRet, cchLocalExpect); \
     
    136139            memset(pszBuf, '?', cbBuf);
    137140            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rrc", rc);
    138             CHECK_TEST_RESULT2("RTErrFormateDefine/%Rrc", pszDefine, cchDefine);
     141            CHECK_TEST_RESULT2("RTErrFormatDefine/%Rrc", pszDefine, cchDefine);
    139142
    140143            memset(pszBuf, '?', cbBuf);
    141144            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rrs", rc);
    142             CHECK_TEST_RESULT2("RTErrFormateDefine/%Rrs", szMsgShort, cchMsgShort);
     145            CHECK_TEST_RESULT2("RTErrFormatMsgShort/%Rrs", szMsgShort, cchMsgShort);
    143146
    144147            memset(pszBuf, '?', cbBuf);
    145148            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rrf", rc);
    146             CHECK_TEST_RESULT2("RTErrFormateDefine/%Rrf", szMsgFull, cchMsgFull);
     149            CHECK_TEST_RESULT2("RTErrFormatMsgFull/%Rrf", szMsgFull, cchMsgFull);
    147150
    148151            if (cchMsgAll == ~(size_t)0)
     
    150153            memset(pszBuf, '?', cbBuf);
    151154            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rra", rc);
    152             CHECK_TEST_RESULT2("RTErrFormateDefine/%Rra", szMsgAll, cchMsgAll);
     155            CHECK_TEST_RESULT2("RTErrFormatMsgAll/%Rra", szMsgAll, cchMsgAll);
    153156        }
    154157        RTTestRestoreAssertions(hTest);
     
    198201            memset(pszBuf, '?', cbBuf);
    199202            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rrc", rc);
    200             CHECK_TEST_RESULT2("RTErrFormateDefine/%Rrc", pszDefine, cchDefine);
     203            CHECK_TEST_RESULT2("RTErrFormatDefine/%Rrc", pszDefine, cchDefine);
    201204
    202205            memset(pszBuf, '?', cbBuf);
    203206            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rrs", rc);
    204             CHECK_TEST_RESULT2("RTErrFormateDefine/%Rrs", pszMsg, cchMsg);
     207            CHECK_TEST_RESULT2("RTErrFormatMsgShort/%Rrs", pszMsg, cchMsg);
    205208
    206209            memset(pszBuf, '?', cbBuf);
    207210            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rrf", rc);
    208             CHECK_TEST_RESULT2("RTErrFormateDefine/%Rrf", pszMsg, cchMsg);
     211            CHECK_TEST_RESULT2("RTErrFormatMsgFull/%Rrf", pszMsg, cchMsg);
    209212
    210213            memset(pszBuf, '?', cbBuf);
    211214            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rra", rc);
    212             CHECK_TEST_RESULT2("RTErrFormateDefine/%Rra", pszMsg, cchMsg);
     215            CHECK_TEST_RESULT2("RTErrFormatMsgAll/%Rra", pszMsg, cchMsg);
     216        }
     217        RTTestRestoreAssertions(hTest);
     218    }
     219
     220    RTTestGuardedFree(hTest, pszBuf);
     221}
     222
     223
     224#ifdef RT_OS_WINDOWS
     225static void tstWinComStatuses(RTTEST hTest)
     226{
     227    RTTestSub(hTest, "COM/Win status codes");
     228
     229    char         szMsg[640];
     230    char         szMsgAll[sizeof(szMsg) + 80];
     231    size_t const cbBuf  = sizeof(szMsg);
     232    char * const pszBuf = (char *)RTTestGuardedAllocTail(hTest, cbBuf);
     233    RTTESTI_CHECK_RETV(pszBuf);
     234
     235    static const struct
     236    {
     237        int32_t rc;
     238        const char *pszDefine;
     239    } s_aTests[] =
     240    {
     241        { (int32_t)0x00000000, "ERROR_SUCCESS" },
     242        { (int32_t)0x0000000e, "ERROR_OUTOFMEMORY" },
     243        { (int32_t)0x8007000e, "E_OUTOFMEMORY" },
     244        { (int32_t)0x00000057, "ERROR_INVALID_PARAMETER" },
     245        { (int32_t)0x80070057, "E_INVALIDARG" },
     246        { (int32_t)0x80004005, "E_FAIL" },
     247        { (int32_t)0x00000783, "RPC_S_NOT_ALL_OBJS_EXPORTED" },
     248
     249    };
     250    for (size_t i = 0; i < RT_ELEMENTS(s_aTests); i++)
     251    {
     252        int32_t const      rc        = s_aTests[i].rc;
     253        const char * const pszDefine = s_aTests[i].pszDefine;
     254        size_t const       cchDefine = strlen(pszDefine);
     255
     256        if (RTErrWinIsKnown(rc) != true)
     257            RTTestFailed(hTest, "RTErrIsKnown(%s) did not return true", pszDefine);
     258
     259        RTTestDisableAssertions(hTest);
     260        size_t cchMsg    = ~(size_t)0;
     261        size_t cchMsgAll = ~(size_t)0;
     262        size_t cbBuf2    = cbBuf - 1;
     263        while (cbBuf2-- > 0)
     264        {
     265            /* RTErrQueryDefine: */
     266            memset(pszBuf, '?', cbBuf);
     267            char *pszBuf2 = &pszBuf[cbBuf - cbBuf2];
     268            ssize_t cchRet = RTErrWinQueryDefine(rc, pszBuf2, cbBuf2, false);
     269            CHECK_TEST_RESULT("RTErrWinQueryDefine", pszDefine, cchDefine);
     270
     271            /* Thru the string formatter. */
     272            memset(pszBuf, '?', cbBuf);
     273            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rwc", rc);
     274            CHECK_TEST_RESULT2("RTErrWinFormatDefine/%Rwc", pszDefine, cchDefine);
     275
     276            memset(pszBuf, '?', cbBuf);
     277            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rhrc", rc);
     278            CHECK_TEST_RESULT2("RTErrWinFormatDefine/%Rhrc", pszDefine, cchDefine);
     279
     280            memset(pszBuf, '?', cbBuf);
     281            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rwf", rc);
     282            if (cchMsg == ~(size_t)0)
     283            {
     284                cchMsg = (size_t)cchRet;
     285                memcpy(szMsg, pszBuf2, cchMsg + 1);
     286            }
     287            CHECK_TEST_RESULT2("RTErrWinFormatMsg/%Rwf", szMsg, cchMsg);
     288
     289            memset(pszBuf, '?', cbBuf);
     290            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rhrf", rc);
     291            CHECK_TEST_RESULT2("RTErrWinFormatMsg/%Rhrf", szMsg, cchMsg);
     292
     293            if (cchMsgAll == ~(size_t)0)
     294                cchMsgAll = RTStrPrintf(szMsgAll, sizeof(szMsgAll), "%s (%#x) - %s", pszDefine, rc, szMsg);
     295            memset(pszBuf, '?', cbBuf);
     296            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rwa", rc);
     297            CHECK_TEST_RESULT2("RTErrWinFormatMsgAll/%Rwa", szMsgAll, cchMsgAll);
     298
     299            memset(pszBuf, '?', cbBuf);
     300            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rhra", rc);
     301            CHECK_TEST_RESULT2("RTErrWinFormatMsgAll/%Rhra", szMsgAll, cchMsgAll);
     302        }
     303        RTTestRestoreAssertions(hTest);
     304    }
     305
     306    /*
     307     * Same but for an unknown status code.
     308     */
     309    static const int32_t s_arcUnknowns[] = { (int32_t)0xff88ff88, 0x0f88ff88, };
     310    for (size_t i = 0; i < RT_ELEMENTS(s_arcUnknowns); i++)
     311    {
     312        int32_t const rc = s_arcUnknowns[i];
     313
     314        if (RTErrIsKnown(rc) != false)
     315            RTTestFailed(hTest, "RTErrIsKnown(%d) did not return false", rc);
     316
     317        size_t const       cchDefine = RTStrPrintf(szMsg, sizeof(szMsg), "%#x", rc);
     318        const char * const pszDefine = szMsg;
     319        size_t const       cchMsg    = RTStrPrintf(szMsgAll, sizeof(szMsgAll), "Unknown Status %#x", rc);
     320        const char * const pszMsg    = szMsgAll;
     321
     322        RTTestDisableAssertions(hTest);
     323        size_t cbBuf2      = cbBuf - 1;
     324        while (cbBuf2-- > 0)
     325        {
     326            /* RTErrWinQueryDefine: */
     327            memset(pszBuf, '?', cbBuf);
     328            char *pszBuf2 = &pszBuf[cbBuf - cbBuf2];
     329            ssize_t cchRet = RTErrWinQueryDefine(rc, pszBuf2, cbBuf2, false);
     330            CHECK_TEST_RESULT("RTErrWinQueryDefine", pszDefine, cchDefine);
     331            RTTEST_CHECK(hTest, RTErrWinQueryDefine(rc, pszBuf2, cbBuf2, true) == VERR_NOT_FOUND);
     332
     333            /* Thru the string formatter. */
     334            memset(pszBuf, '?', cbBuf);
     335            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rwc", rc);
     336            CHECK_TEST_RESULT2("RTErrWinFormatDefine/%Rwc", pszDefine, cchDefine);
     337
     338            memset(pszBuf, '?', cbBuf);
     339            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rhrc", rc);
     340            CHECK_TEST_RESULT2("RTErrWinFormatDefine/%Rhrc", pszDefine, cchDefine);
     341
     342            memset(pszBuf, '?', cbBuf);
     343            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rwf", rc);
     344            CHECK_TEST_RESULT2("RTErrWinFormatMsg/%Rwf", pszMsg, cchMsg);
     345
     346            memset(pszBuf, '?', cbBuf);
     347            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rhrf", rc);
     348            CHECK_TEST_RESULT2("RTErrWinFormatMsg/%Rhrf", pszMsg, cchMsg);
     349
     350            memset(pszBuf, '?', cbBuf);
     351            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rwa", rc);
     352            CHECK_TEST_RESULT2("RTErrWinFormatMsgAll/%Rwa", pszMsg, cchMsg);
     353
     354            memset(pszBuf, '?', cbBuf);
     355            cchRet = RTStrPrintf2(pszBuf2, cbBuf2, "%Rhra", rc);
     356            CHECK_TEST_RESULT2("RTErrWinFormatMsgAll/%Rhra", pszMsg, cchMsg);
    213357        }
    214358        RTTestRestoreAssertions(hTest);
    215359    }
    216360}
    217 
     361#endif
    218362
    219363int main(int argc, char **argv)
     
    227371
    228372    tstIprtStatuses(hTest);
    229     //tstComStatuses(hTest);
     373#ifdef RT_OS_WINDOWS
     374    tstWinComStatuses(hTest);
     375#else
     376#endif
    230377
    231378    /*
  • trunk/src/VBox/Runtime/win/errmsgwin.cpp

    r84067 r84068  
    263263    if (idx != ~(size_t)0)
    264264    {
    265         cchRet += pfnOutput(pvArgOutput, RT_STR_TUPLE(" - "));
     265        cchRet += pfnOutput(pvArgOutput, RT_STR_TUPLE(") - "));
    266266        cchRet += RTBldProgStrTabQueryOutput(&g_WinMsgStrTab,
    267267                                             g_aWinMsgs[idx].offMsgFull, g_aWinMsgs[idx].cchMsgFull,
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette