| 757 | |
| 758 | |
| 759 | size_t tss_encode_base64(const byte_t* pchSource, size_t nchSource, byte_t* pchBuffer, size_t nchBuffer) |
| 760 | { |
| 761 | const size_t _ERROR = std::string::npos; // -1; |
| 762 | |
| 763 | |
| 764 | //--Assert Preconditions |
| 765 | |
| 766 | if (pchSource == 0 || nchSource == 0) |
| 767 | return _ERROR; |
| 768 | |
| 769 | |
| 770 | //--If pchBuffer == 0, User is requesting Size |
| 771 | |
| 772 | size_t nchBuf = tss_encode_base64_size(nchSource); |
| 773 | |
| 774 | if (pchBuffer == 0) // Requesting Size |
| 775 | return nchBuf; |
| 776 | |
| 777 | if (nchBuf > nchBuffer) // DOH!! |
| 778 | return _ERROR; |
| 779 | |
| 780 | |
| 781 | //--Get three characters at a time and encode them (watching linelen) |
| 782 | |
| 783 | byte_t* pchBuf = (pchBuffer + 0); |
| 784 | const byte_t* pchSrc = (pchSource + 0); |
| 785 | |
| 786 | |
| 787 | const size_t _max_linelen = (_MAX_RFC822_LINE_LEN - _EOL_LEN); |
| 788 | size_t nLineLen = 0; |
| 789 | |
| 790 | for (; nchSource;) |
| 791 | { |
| 792 | // Like iconv: Increment pointers and decrement sizes |
| 793 | tss_encode_digit_base64(pchSrc, nchSource, pchBuf, nchBuf); |
| 794 | |
| 795 | nLineLen += 4; |
| 796 | |
| 797 | if (nchSource == 0 || nLineLen > _max_linelen) |
| 798 | { |
| 799 | nLineLen = 0; // RESET: |
| 800 | |
| 801 | const byte_t* pchEol = &_aszEoL[0]; |
| 802 | while (*pchEol) |
| 803 | *pchBuf++ = *pchEol++; |
| 804 | } |
| 805 | } |
| 806 | |
| 807 | *pchBuf = 0x00; // CAUTION: Null Terminate!!! |
| 808 | |
| 809 | return (pchBuf - pchBuffer); |
| 810 | } |
| 811 | } // namespace |
| 812 | |
| 813 |
no test coverage detected