static void test2(void) { RTTestISub("< 0"); for (int ch = -1; ch > -2000000; ch--) { RTTESTI_CHECK(!RT_C_IS_CNTRL(ch)); RTTESTI_CHECK(!RT_C_IS_SPACE(ch)); RTTESTI_CHECK(!RT_C_IS_BLANK(ch)); RTTESTI_CHECK(!RT_C_IS_PRINT(ch)); RTTESTI_CHECK(!RT_C_IS_PUNCT(ch)); RTTESTI_CHECK(!RT_C_IS_GRAPH(ch)); RTTESTI_CHECK(!RT_C_IS_DIGIT(ch)); RTTESTI_CHECK(!RT_C_IS_XDIGIT(ch)); RTTESTI_CHECK(!RT_C_IS_ODIGIT(ch)); RTTESTI_CHECK(!RT_C_IS_ALPHA(ch)); RTTESTI_CHECK(!RT_C_IS_UPPER(ch)); RTTESTI_CHECK(!RT_C_IS_LOWER(ch)); } }
static void test3(void) { RTTestISub("> 127"); for (int ch = 128; ch < 2000000; ch++) { RTTESTI_CHECK(!RT_C_IS_CNTRL(ch)); RTTESTI_CHECK(!RT_C_IS_SPACE(ch)); RTTESTI_CHECK(!RT_C_IS_BLANK(ch)); RTTESTI_CHECK(!RT_C_IS_PRINT(ch)); RTTESTI_CHECK(!RT_C_IS_PUNCT(ch)); RTTESTI_CHECK(!RT_C_IS_GRAPH(ch)); RTTESTI_CHECK(!RT_C_IS_DIGIT(ch)); RTTESTI_CHECK(!RT_C_IS_XDIGIT(ch)); RTTESTI_CHECK(!RT_C_IS_ODIGIT(ch)); RTTESTI_CHECK(!RT_C_IS_ALPHA(ch)); RTTESTI_CHECK(!RT_C_IS_UPPER(ch)); RTTESTI_CHECK(!RT_C_IS_LOWER(ch)); } }
/** * Change the traceing configuration of the VM. * * @returns VBox status code. * @retval VINF_SUCCESS * @retval VERR_NOT_FOUND if any of the trace point groups mentioned in the * config string cannot be found. (Or if the string cannot be made * sense of.) No change made. * @retval VERR_INVALID_VM_HANDLE * @retval VERR_INVALID_POINTER * * @param pVM The cross context VM structure. * @param pszConfig The configuration change specification. * * Trace point group names, optionally prefixed by a '-' to * indicate that the group is being disabled. A special * group 'all' can be used to enable or disable all trace * points. * * Drivers, devices and USB devices each have their own * trace point group which can be accessed by prefixing * their official PDM name by 'drv', 'dev' or 'usb' * respectively. */ VMMDECL(int) DBGFR3TraceConfig(PVM pVM, const char *pszConfig) { VM_ASSERT_VALID_EXT_RETURN(pVM, VERR_INVALID_VM_HANDLE); AssertPtrReturn(pszConfig, VERR_INVALID_POINTER); if (pVM->hTraceBufR3 == NIL_RTTRACEBUF) return VERR_DBGF_NO_TRACE_BUFFER; /* * We do this in two passes, the first pass just validates the input string * and the second applies the changes. */ for (uint32_t uPass = 0; uPass < 1; uPass++) { char ch; while ((ch = *pszConfig) != '\0') { if (RT_C_IS_SPACE(ch)) continue; /* * Operation prefix. */ bool fNo = false; do { if (ch == 'n' && pszConfig[1] == 'o') { fNo = !fNo; pszConfig++; } else if (ch == '+') fNo = false; else if (ch == '-' || ch == '!' || ch == '~') fNo = !fNo; else break; } while ((ch = *++pszConfig) != '\0'); if (ch == '\0') break; /* * Extract the name. */ const char *pszName = pszConfig; while ( ch != '\0' && !RT_C_IS_SPACE(ch) && !RT_C_IS_PUNCT(ch)) ch = *++pszConfig; size_t const cchName = pszConfig - pszName; /* * 'all' - special group that enables or disables all trace points. */ if (cchName == 3 && !strncmp(pszName, "all", 3)) { if (uPass != 0) { uint32_t iCpu = pVM->cCpus; if (!fNo) while (iCpu-- > 0) pVM->aCpus[iCpu].fTraceGroups = UINT32_MAX; else while (iCpu-- > 0) pVM->aCpus[iCpu].fTraceGroups = 0; PDMR3TracingConfig(pVM, NULL, 0, !fNo, uPass > 0); } } else { /* * A specific group, try the VMM first then PDM. */ uint32_t i = RT_ELEMENTS(g_aVmmTpGroups); while (i-- > 0) if ( g_aVmmTpGroups[i].cchName == cchName && !strncmp(g_aVmmTpGroups[i].pszName, pszName, cchName)) { if (uPass != 0) { uint32_t iCpu = pVM->cCpus; if (!fNo) while (iCpu-- > 0) pVM->aCpus[iCpu].fTraceGroups |= g_aVmmTpGroups[i].fMask; else while (iCpu-- > 0) pVM->aCpus[iCpu].fTraceGroups &= ~g_aVmmTpGroups[i].fMask; } break; } if (i == UINT32_MAX) { int rc = PDMR3TracingConfig(pVM, pszName, cchName, !fNo, uPass > 0); if (RT_FAILURE(rc)) return rc; } } } } return VINF_SUCCESS; }