| 471 | }; |
| 472 | |
| 473 | bool tss_ReverseConvert(iconv_t revConv, const char* pConvertedFrom, size_t nFrom, char* pConvertedTo, size_t nTo) |
| 474 | { |
| 475 | cDebug d("tss_ReverseConvert< B, S, C >()"); |
| 476 | d.TraceDebug("Converted from: %s\n", util_output_bytes((void*)pConvertedFrom, nFrom).c_str()); |
| 477 | d.TraceDebug("Converted to: %s\n", util_output_bytes((void*)pConvertedTo, nTo).c_str()); |
| 478 | |
| 479 | char aBuffer[MB_LEN_MAX]; |
| 480 | # ifdef DEBUG |
| 481 | for (size_t foo = 0; foo < sizeof(aBuffer); foo++) |
| 482 | aBuffer[foo] = 0xCD; |
| 483 | # endif |
| 484 | char* pBuf = &aBuffer[0]; |
| 485 | size_t nBuf = sizeof(aBuffer); |
| 486 | |
| 487 | const char* pSrc = pConvertedTo; |
| 488 | size_t nSrc = nTo; |
| 489 | |
| 490 | size_t nConv = // NOTE: |
| 491 | iconv(revConv, // On return, these addresses |
| 492 | (ICONV_SOURCE_TYPE**)&pSrc, // are set for one past the last |
| 493 | &nSrc, // "item" converted successfully |
| 494 | &pBuf, |
| 495 | &nBuf); |
| 496 | |
| 497 | if (nConv == (size_t)-1) |
| 498 | { |
| 499 | d.TraceDebug("reverse conversion failed: iconv error\n"); |
| 500 | return false; |
| 501 | } |
| 502 | |
| 503 | d.TraceDebug("sizeof( aBuffer ): %u, nBuf: %u, nFrom: %u\n", sizeof(aBuffer), nBuf, nFrom); |
| 504 | d.TraceDebug("reverse conversion got: %s\n", util_output_bytes((void*)&aBuffer[0], sizeof(aBuffer) - nBuf).c_str()); |
| 505 | |
| 506 | if (((sizeof(aBuffer) - nBuf) != nFrom) || // convertedFrom and check must be same size |
| 507 | (0 != memcmp(pConvertedFrom, &aBuffer[0], nFrom))) // must be same value, too |
| 508 | { |
| 509 | d.TraceDebug("reverse conversion failed: converted to a different value\n"); |
| 510 | return false; |
| 511 | } |
| 512 | |
| 513 | return true; |
| 514 | } |
| 515 | |
| 516 | template<class CharT> bool tss_IsFlaggedCharacter(CharT ch) |
| 517 | { |
no test coverage detected