diff options
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/common/mptStringBuffer.cpp')
-rw-r--r-- | Src/external_dependencies/openmpt-trunk/common/mptStringBuffer.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/common/mptStringBuffer.cpp b/Src/external_dependencies/openmpt-trunk/common/mptStringBuffer.cpp new file mode 100644 index 00000000..7b52c1c6 --- /dev/null +++ b/Src/external_dependencies/openmpt-trunk/common/mptStringBuffer.cpp @@ -0,0 +1,117 @@ +/* + * mptStringBuffer.cpp + * ------------------- + * Purpose: Various functions for "fixing" char array strings for writing to or + * reading from module files, or for securing char arrays in general. + * Notes : (currently none) + * Authors: OpenMPT Devs + * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. + */ + + +#include "stdafx.h" + +#include "mptStringBuffer.h" + + +OPENMPT_NAMESPACE_BEGIN + + + +namespace mpt +{ + +namespace String +{ + +namespace detail +{ + +std::string ReadStringBuffer(String::ReadWriteMode mode, const char *srcBuffer, std::size_t srcSize) +{ + + std::string dest; + const char *src = srcBuffer; + + if(mode == nullTerminated || mode == spacePaddedNull) + { + // We assume that the last character of the source buffer is null. + if(srcSize > 0) + { + srcSize -= 1; + } + } + + if(mode == nullTerminated || mode == maybeNullTerminated) + { + + // Copy null-terminated string, stopping at null. + dest.assign(src, std::find(src, src + srcSize, '\0')); + + } else if(mode == spacePadded || mode == spacePaddedNull) + { + + // Copy string over. + dest.assign(src, src + srcSize); + + // Convert null characters to spaces. + std::transform(dest.begin(), dest.end(), dest.begin(), [] (char c) -> char { return (c != '\0') ? c : ' '; }); + + // Trim trailing spaces. + dest = mpt::trim_right(dest, std::string(" ")); + + } + + return dest; + +} + +void WriteStringBuffer(String::ReadWriteMode mode, char *destBuffer, const std::size_t destSize, const char *srcBuffer, const std::size_t srcSize) +{ + + MPT_ASSERT(destSize > 0); + + const size_t maxSize = std::min(destSize, srcSize); + char *dst = destBuffer; + const char *src = srcBuffer; + + // First, copy over null-terminated string. + size_t pos = maxSize; + while(pos > 0) + { + if((*dst = *src) == '\0') + { + break; + } + pos--; + dst++; + src++; + } + + if(mode == nullTerminated || mode == maybeNullTerminated) + { + // Fill rest of string with nulls. + std::fill(dst, dst + destSize - maxSize + pos, '\0'); + } else if(mode == spacePadded || mode == spacePaddedNull) + { + // Fill the rest of the destination string with spaces. + std::fill(dst, dst + destSize - maxSize + pos, ' '); + } + + if(mode == nullTerminated || mode == spacePaddedNull) + { + // Make sure that destination is really null-terminated. + SetNullTerminator(destBuffer, destSize); + } + +} + +} // namespace detail + +} // namespace String + +} // namespace mpt + + + +OPENMPT_NAMESPACE_END |