/** * Get the message corresponding to a given status code. * * @returns Pointer to read-only message description. * @param rc The status code. */ RTDECL(PCRTSTATUSMSG) RTErrGet(int rc) { unsigned iFound = ~0; unsigned i; for (i = 0; i < RT_ELEMENTS(g_aStatusMsgs) - 1; i++) { if (g_aStatusMsgs[i].iCode == rc) { /* * Found a match. * Since this isn't a unique key, we must check that it's not * one of those start/end #defines before we return. */ #define STR_ENDS_WITH(a_psz, a_cch, a_sz) \ ( (a_cch) >= sizeof(a_sz) && !strncmp((a_psz) + (a_cch) - sizeof(a_sz) + 1, RT_STR_TUPLE(a_sz)) ) size_t const cchDefine = strlen(g_aStatusMsgs[i].pszDefine); if ( !STR_ENDS_WITH(g_aStatusMsgs[i].pszDefine, cchDefine, "_FIRST") && !STR_ENDS_WITH(g_aStatusMsgs[i].pszDefine, cchDefine, "_LAST") && !STR_ENDS_WITH(g_aStatusMsgs[i].pszDefine, cchDefine, "_LOWEST") && !STR_ENDS_WITH(g_aStatusMsgs[i].pszDefine, cchDefine, "_HIGHEST") ) return &g_aStatusMsgs[i]; iFound = i; } } if (iFound != ~0U) return &g_aStatusMsgs[iFound]; /* * Need to use the temporary stuff. */ int iMsg = ASMAtomicXchgU32(&g_iUnknownMsgs, (g_iUnknownMsgs + 1) % RT_ELEMENTS(g_aUnknownMsgs)); RTStrPrintf(&g_aszUnknownStr[iMsg][0], sizeof(g_aszUnknownStr[iMsg]), "Unknown Status %d (%#x)", rc, rc); return &g_aUnknownMsgs[iMsg]; }
static bool strIsPermissibleDuplicate(const RTSTATUSMSG *pMsg) { const char *pszDefine = pMsg->pszDefine; size_t cchDefine = strlen(pszDefine); #define STR_ENDS_WITH(a_psz, a_cch, a_sz) \ ( (a_cch) >= sizeof(a_sz) && !strncmp((a_psz) + (a_cch) - sizeof(a_sz) + 1, RT_STR_TUPLE(a_sz)) ) return STR_ENDS_WITH(pszDefine, cchDefine, "_FIRST") || STR_ENDS_WITH(pszDefine, cchDefine, "_LAST") || STR_ENDS_WITH(pszDefine, cchDefine, "_LOWEST") || STR_ENDS_WITH(pszDefine, cchDefine, "_HIGHEST") || strstr(pMsg->pszMsgShort, "(mapped to") != 0; }