Write formatted data into the buffer. Supports %s (char*), %e (char*, "&'<> escaped), %i (int), %u (unsigned int), %p (UINT_PTR).
| 2415 | |
| 2416 | // Write formatted data into the buffer. Supports %s (char*), %e (char*, "&'<> escaped), %i (int), %u (unsigned int), %p (UINT_PTR). |
| 2417 | int Debugger::Buffer::WriteF(const char *aFormat, ...) |
| 2418 | { |
| 2419 | if (mFailed) |
| 2420 | { |
| 2421 | // A prior Write() failed and the now-invalid data hasn't yet been cleared |
| 2422 | // from the buffer. Abort. This allows numerous other parts of the code |
| 2423 | // to omit error-checking. |
| 2424 | return DEBUGGER_E_INTERNAL_ERROR; |
| 2425 | } |
| 2426 | |
| 2427 | int i; |
| 2428 | size_t len; |
| 2429 | char c; |
| 2430 | const char *format_ptr, *s, *param_ptr, *entity; |
| 2431 | char number_buf[MAX_INTEGER_SIZE]; |
| 2432 | va_list vl; |
| 2433 | |
| 2434 | for (len = 0, i = 0; i < 2; ++i) |
| 2435 | { |
| 2436 | va_start(vl, aFormat); |
| 2437 | |
| 2438 | // Calculate the required buffer size. |
| 2439 | for (format_ptr = aFormat; c = *format_ptr; ++format_ptr) |
| 2440 | { |
| 2441 | if (c == '%') |
| 2442 | { |
| 2443 | switch (format_ptr[1]) |
| 2444 | { |
| 2445 | case 's': s = va_arg(vl, char*); break; |
| 2446 | case 'i': s = _itoa(va_arg(vl, int), number_buf, 10); break; |
| 2447 | case 'u': s = _ultoa(va_arg(vl, unsigned long), number_buf, 10); break; |
| 2448 | case 'p': s = Exp32or64(_ultoa,_ui64toa)(va_arg(vl, UINT_PTR), number_buf, 10); break; |
| 2449 | |
| 2450 | case 'e': // String, replace "&'<> with appropriate XML entity. |
| 2451 | { |
| 2452 | s = va_arg(vl, char*); |
| 2453 | if (i == 0) |
| 2454 | { |
| 2455 | for (param_ptr = s; *param_ptr; ++param_ptr) |
| 2456 | { |
| 2457 | switch (*param_ptr) |
| 2458 | { |
| 2459 | case '"': case '\'': len += 6; break; // " or ' |
| 2460 | case '&': len += 5; break; // & |
| 2461 | case '<': case '>': len += 4; break; // < or > |
| 2462 | default: ++len; |
| 2463 | } |
| 2464 | } |
| 2465 | } |
| 2466 | else |
| 2467 | { |
| 2468 | for (param_ptr = s; c = *param_ptr; ++param_ptr) |
| 2469 | { |
| 2470 | switch (c) |
| 2471 | { |
| 2472 | case '"': entity = "quot"; break; |
| 2473 | case '\'': entity = "apos"; break; |
| 2474 | case '&': entity = "amp"; break; |
no outgoing calls
no test coverage detected