--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sources/list.cpp Sat Jul 23 12:22:23 2016 +0300 @@ -0,0 +1,99 @@ +/* + Copyright 2016 Teemu Piippo + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "list.h" +#include "mystring.h" + +BEGIN_ZFC_NAMESPACE + +/*! + * \brief Finds a suitable string representation for the provided byte. + * \param byte Byte to represent. + * \returns the string representation for the byte. + */ +const char* representByte(unsigned char byte) +{ + static char buffer[8]; + + if (byte < 8) + { + buffer[0] = '\\'; + buffer[1] = byte + '0'; + buffer[2] = '\0'; + return buffer; + } + else switch(byte) + { + case '\a': return "\\a"; + case '\b': return "\\b"; + case '\t': return "\\t"; + case '\n': return "\\n"; + case '\v': return "\\v"; + case '\f': return "\\f"; + case '\r': return "\\r"; + case '\e': return "\\e"; + case '"': return "\\\""; + case '\\': return "\\\\"; + default: + if (isprint(byte)) + { + buffer[0] = byte; + buffer[1] = '\0'; + return buffer; + } + else + { + snprintf(buffer, sizeof buffer, "\\x%2x", byte); + return buffer; + } + } +} + +/*! + * \brief Constructs a byte array from an initializer list containing bytes. + * \param initializerList List of bytes. + */ +ByteArray::ByteArray(std::initializer_list<unsigned char> initializerList) : + Vector<unsigned char>(initializerList) {} + +/*! + * \returns a quoted representation of the contents of the byte array. + */ +String ByteArray::quote() const +{ + String result; + + for (unsigned char byte : *this) + result += representByte(byte); + + return "\"" + result + "\""; +} + +END_ZFC_NAMESPACE