fork
Fork of cpputest by
src/CppUTest/SimpleString.cpp@0:0b799af9d58e, 2014-01-28 (annotated)
- Committer:
- rgrover1
- Date:
- Tue Jan 28 09:27:41 2014 +0000
- Revision:
- 0:0b799af9d58e
- Child:
- 1:4769360130ed
CppUTest unit test framework.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rgrover1 | 0:0b799af9d58e | 1 | /* |
rgrover1 | 0:0b799af9d58e | 2 | * Copyright (c) 2007, Michael Feathers, James Grenning and Bas Vodde |
rgrover1 | 0:0b799af9d58e | 3 | * All rights reserved. |
rgrover1 | 0:0b799af9d58e | 4 | * |
rgrover1 | 0:0b799af9d58e | 5 | * Redistribution and use in source and binary forms, with or without |
rgrover1 | 0:0b799af9d58e | 6 | * modification, are permitted provided that the following conditions are met: |
rgrover1 | 0:0b799af9d58e | 7 | * * Redistributions of source code must retain the above copyright |
rgrover1 | 0:0b799af9d58e | 8 | * notice, this list of conditions and the following disclaimer. |
rgrover1 | 0:0b799af9d58e | 9 | * * Redistributions in binary form must reproduce the above copyright |
rgrover1 | 0:0b799af9d58e | 10 | * notice, this list of conditions and the following disclaimer in the |
rgrover1 | 0:0b799af9d58e | 11 | * documentation and/or other materials provided with the distribution. |
rgrover1 | 0:0b799af9d58e | 12 | * * Neither the name of the <organization> nor the |
rgrover1 | 0:0b799af9d58e | 13 | * names of its contributors may be used to endorse or promote products |
rgrover1 | 0:0b799af9d58e | 14 | * derived from this software without specific prior written permission. |
rgrover1 | 0:0b799af9d58e | 15 | * |
rgrover1 | 0:0b799af9d58e | 16 | * THIS SOFTWARE IS PROVIDED BY THE EARLIER MENTIONED AUTHORS ``AS IS'' AND ANY |
rgrover1 | 0:0b799af9d58e | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
rgrover1 | 0:0b799af9d58e | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
rgrover1 | 0:0b799af9d58e | 19 | * DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY |
rgrover1 | 0:0b799af9d58e | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
rgrover1 | 0:0b799af9d58e | 21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
rgrover1 | 0:0b799af9d58e | 22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
rgrover1 | 0:0b799af9d58e | 23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
rgrover1 | 0:0b799af9d58e | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
rgrover1 | 0:0b799af9d58e | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
rgrover1 | 0:0b799af9d58e | 26 | */ |
rgrover1 | 0:0b799af9d58e | 27 | |
rgrover1 | 0:0b799af9d58e | 28 | #include "CppUTest/TestHarness.h" |
rgrover1 | 0:0b799af9d58e | 29 | #include "CppUTest/SimpleString.h" |
rgrover1 | 0:0b799af9d58e | 30 | #include "CppUTest/PlatformSpecificFunctions.h" |
rgrover1 | 0:0b799af9d58e | 31 | #include "CppUTest/TestMemoryAllocator.h" |
rgrover1 | 0:0b799af9d58e | 32 | |
rgrover1 | 0:0b799af9d58e | 33 | |
rgrover1 | 0:0b799af9d58e | 34 | TestMemoryAllocator* SimpleString::stringAllocator_ = NULL; |
rgrover1 | 0:0b799af9d58e | 35 | |
rgrover1 | 0:0b799af9d58e | 36 | TestMemoryAllocator* SimpleString::getStringAllocator() |
rgrover1 | 0:0b799af9d58e | 37 | { |
rgrover1 | 0:0b799af9d58e | 38 | if (stringAllocator_ == NULL) |
rgrover1 | 0:0b799af9d58e | 39 | return defaultNewArrayAllocator(); |
rgrover1 | 0:0b799af9d58e | 40 | return stringAllocator_; |
rgrover1 | 0:0b799af9d58e | 41 | } |
rgrover1 | 0:0b799af9d58e | 42 | |
rgrover1 | 0:0b799af9d58e | 43 | void SimpleString::setStringAllocator(TestMemoryAllocator* allocator) |
rgrover1 | 0:0b799af9d58e | 44 | { |
rgrover1 | 0:0b799af9d58e | 45 | stringAllocator_ = allocator; |
rgrover1 | 0:0b799af9d58e | 46 | } |
rgrover1 | 0:0b799af9d58e | 47 | |
rgrover1 | 0:0b799af9d58e | 48 | /* Avoid using the memory leak detector INSIDE SimpleString as its used inside the detector */ |
rgrover1 | 0:0b799af9d58e | 49 | char* SimpleString::allocStringBuffer(size_t _size) |
rgrover1 | 0:0b799af9d58e | 50 | { |
rgrover1 | 0:0b799af9d58e | 51 | return getStringAllocator()->alloc_memory(_size, __FILE__, __LINE__); |
rgrover1 | 0:0b799af9d58e | 52 | } |
rgrover1 | 0:0b799af9d58e | 53 | |
rgrover1 | 0:0b799af9d58e | 54 | void SimpleString::deallocStringBuffer(char* str) |
rgrover1 | 0:0b799af9d58e | 55 | { |
rgrover1 | 0:0b799af9d58e | 56 | getStringAllocator()->free_memory(str, __FILE__, __LINE__); |
rgrover1 | 0:0b799af9d58e | 57 | } |
rgrover1 | 0:0b799af9d58e | 58 | |
rgrover1 | 0:0b799af9d58e | 59 | char* SimpleString::getEmptyString() const |
rgrover1 | 0:0b799af9d58e | 60 | { |
rgrover1 | 0:0b799af9d58e | 61 | char* empty = allocStringBuffer(1); |
rgrover1 | 0:0b799af9d58e | 62 | empty[0] = '\0'; |
rgrover1 | 0:0b799af9d58e | 63 | return empty; |
rgrover1 | 0:0b799af9d58e | 64 | } |
rgrover1 | 0:0b799af9d58e | 65 | SimpleString::SimpleString(const char *otherBuffer) |
rgrover1 | 0:0b799af9d58e | 66 | { |
rgrover1 | 0:0b799af9d58e | 67 | if (otherBuffer == 0) { |
rgrover1 | 0:0b799af9d58e | 68 | buffer_ = getEmptyString(); |
rgrover1 | 0:0b799af9d58e | 69 | } |
rgrover1 | 0:0b799af9d58e | 70 | else { |
rgrover1 | 0:0b799af9d58e | 71 | size_t len = PlatformSpecificStrLen(otherBuffer) + 1; |
rgrover1 | 0:0b799af9d58e | 72 | buffer_ = allocStringBuffer(len); |
rgrover1 | 0:0b799af9d58e | 73 | PlatformSpecificStrCpy(buffer_, otherBuffer); |
rgrover1 | 0:0b799af9d58e | 74 | } |
rgrover1 | 0:0b799af9d58e | 75 | } |
rgrover1 | 0:0b799af9d58e | 76 | |
rgrover1 | 0:0b799af9d58e | 77 | SimpleString::SimpleString(const char *other, size_t repeatCount) |
rgrover1 | 0:0b799af9d58e | 78 | { |
rgrover1 | 0:0b799af9d58e | 79 | size_t len = PlatformSpecificStrLen(other) * repeatCount + 1; |
rgrover1 | 0:0b799af9d58e | 80 | buffer_ = allocStringBuffer(len); |
rgrover1 | 0:0b799af9d58e | 81 | char* next = buffer_; |
rgrover1 | 0:0b799af9d58e | 82 | for (size_t i = 0; i < repeatCount; i++) { |
rgrover1 | 0:0b799af9d58e | 83 | PlatformSpecificStrCpy(next, other); |
rgrover1 | 0:0b799af9d58e | 84 | next += PlatformSpecificStrLen(other); |
rgrover1 | 0:0b799af9d58e | 85 | } |
rgrover1 | 0:0b799af9d58e | 86 | *next = 0; |
rgrover1 | 0:0b799af9d58e | 87 | |
rgrover1 | 0:0b799af9d58e | 88 | } |
rgrover1 | 0:0b799af9d58e | 89 | SimpleString::SimpleString(const SimpleString& other) |
rgrover1 | 0:0b799af9d58e | 90 | { |
rgrover1 | 0:0b799af9d58e | 91 | size_t len = other.size() + 1; |
rgrover1 | 0:0b799af9d58e | 92 | buffer_ = allocStringBuffer(len); |
rgrover1 | 0:0b799af9d58e | 93 | PlatformSpecificStrCpy(buffer_, other.buffer_); |
rgrover1 | 0:0b799af9d58e | 94 | } |
rgrover1 | 0:0b799af9d58e | 95 | |
rgrover1 | 0:0b799af9d58e | 96 | SimpleString& SimpleString::operator=(const SimpleString& other) |
rgrover1 | 0:0b799af9d58e | 97 | { |
rgrover1 | 0:0b799af9d58e | 98 | if (this != &other) { |
rgrover1 | 0:0b799af9d58e | 99 | deallocStringBuffer(buffer_); |
rgrover1 | 0:0b799af9d58e | 100 | size_t len = other.size() + 1; |
rgrover1 | 0:0b799af9d58e | 101 | buffer_ = allocStringBuffer(len); |
rgrover1 | 0:0b799af9d58e | 102 | PlatformSpecificStrCpy(buffer_, other.buffer_); |
rgrover1 | 0:0b799af9d58e | 103 | } |
rgrover1 | 0:0b799af9d58e | 104 | return *this; |
rgrover1 | 0:0b799af9d58e | 105 | } |
rgrover1 | 0:0b799af9d58e | 106 | |
rgrover1 | 0:0b799af9d58e | 107 | bool SimpleString::contains(const SimpleString& other) const |
rgrover1 | 0:0b799af9d58e | 108 | { |
rgrover1 | 0:0b799af9d58e | 109 | //strstr on some machines does not handle "" |
rgrover1 | 0:0b799af9d58e | 110 | //the right way. "" should be found in any string |
rgrover1 | 0:0b799af9d58e | 111 | if (PlatformSpecificStrLen(other.buffer_) == 0) return true; |
rgrover1 | 0:0b799af9d58e | 112 | else if (PlatformSpecificStrLen(buffer_) == 0) return false; |
rgrover1 | 0:0b799af9d58e | 113 | else return PlatformSpecificStrStr(buffer_, other.buffer_) != 0; |
rgrover1 | 0:0b799af9d58e | 114 | } |
rgrover1 | 0:0b799af9d58e | 115 | |
rgrover1 | 0:0b799af9d58e | 116 | bool SimpleString::containsNoCase(const SimpleString& other) const |
rgrover1 | 0:0b799af9d58e | 117 | { |
rgrover1 | 0:0b799af9d58e | 118 | return toLower().contains(other.toLower()); |
rgrover1 | 0:0b799af9d58e | 119 | } |
rgrover1 | 0:0b799af9d58e | 120 | |
rgrover1 | 0:0b799af9d58e | 121 | |
rgrover1 | 0:0b799af9d58e | 122 | bool SimpleString::startsWith(const SimpleString& other) const |
rgrover1 | 0:0b799af9d58e | 123 | { |
rgrover1 | 0:0b799af9d58e | 124 | if (PlatformSpecificStrLen(other.buffer_) == 0) return true; |
rgrover1 | 0:0b799af9d58e | 125 | else if (PlatformSpecificStrLen(buffer_) == 0) return false; |
rgrover1 | 0:0b799af9d58e | 126 | else return PlatformSpecificStrStr(buffer_, other.buffer_) == buffer_; |
rgrover1 | 0:0b799af9d58e | 127 | } |
rgrover1 | 0:0b799af9d58e | 128 | |
rgrover1 | 0:0b799af9d58e | 129 | bool SimpleString::endsWith(const SimpleString& other) const |
rgrover1 | 0:0b799af9d58e | 130 | { |
rgrover1 | 0:0b799af9d58e | 131 | size_t buffer_length = PlatformSpecificStrLen(buffer_); |
rgrover1 | 0:0b799af9d58e | 132 | size_t other_buffer_length = PlatformSpecificStrLen(other.buffer_); |
rgrover1 | 0:0b799af9d58e | 133 | if (other_buffer_length == 0) return true; |
rgrover1 | 0:0b799af9d58e | 134 | if (buffer_length == 0) return false; |
rgrover1 | 0:0b799af9d58e | 135 | if (buffer_length < other_buffer_length) return false; |
rgrover1 | 0:0b799af9d58e | 136 | return PlatformSpecificStrCmp(buffer_ + buffer_length - other_buffer_length, other.buffer_) == 0; |
rgrover1 | 0:0b799af9d58e | 137 | } |
rgrover1 | 0:0b799af9d58e | 138 | |
rgrover1 | 0:0b799af9d58e | 139 | size_t SimpleString::count(const SimpleString& substr) const |
rgrover1 | 0:0b799af9d58e | 140 | { |
rgrover1 | 0:0b799af9d58e | 141 | size_t num = 0; |
rgrover1 | 0:0b799af9d58e | 142 | char* str = buffer_; |
rgrover1 | 0:0b799af9d58e | 143 | while ((str = PlatformSpecificStrStr(str, substr.buffer_))) { |
rgrover1 | 0:0b799af9d58e | 144 | num++; |
rgrover1 | 0:0b799af9d58e | 145 | str++; |
rgrover1 | 0:0b799af9d58e | 146 | } |
rgrover1 | 0:0b799af9d58e | 147 | return num; |
rgrover1 | 0:0b799af9d58e | 148 | } |
rgrover1 | 0:0b799af9d58e | 149 | |
rgrover1 | 0:0b799af9d58e | 150 | void SimpleString::split(const SimpleString& delimiter, SimpleStringCollection& col) const |
rgrover1 | 0:0b799af9d58e | 151 | { |
rgrover1 | 0:0b799af9d58e | 152 | size_t num = count(delimiter); |
rgrover1 | 0:0b799af9d58e | 153 | size_t extraEndToken = (endsWith(delimiter)) ? 0 : 1U; |
rgrover1 | 0:0b799af9d58e | 154 | col.allocate(num + extraEndToken); |
rgrover1 | 0:0b799af9d58e | 155 | |
rgrover1 | 0:0b799af9d58e | 156 | char* str = buffer_; |
rgrover1 | 0:0b799af9d58e | 157 | char* prev; |
rgrover1 | 0:0b799af9d58e | 158 | for (size_t i = 0; i < num; ++i) { |
rgrover1 | 0:0b799af9d58e | 159 | prev = str; |
rgrover1 | 0:0b799af9d58e | 160 | str = PlatformSpecificStrStr(str, delimiter.buffer_) + 1; |
rgrover1 | 0:0b799af9d58e | 161 | size_t len = (size_t) (str - prev); |
rgrover1 | 0:0b799af9d58e | 162 | char* sub = allocStringBuffer(len + 1); |
rgrover1 | 0:0b799af9d58e | 163 | PlatformSpecificStrNCpy(sub, prev, len); |
rgrover1 | 0:0b799af9d58e | 164 | sub[len] = '\0'; |
rgrover1 | 0:0b799af9d58e | 165 | col[i] = sub; |
rgrover1 | 0:0b799af9d58e | 166 | deallocStringBuffer(sub); |
rgrover1 | 0:0b799af9d58e | 167 | } |
rgrover1 | 0:0b799af9d58e | 168 | if (extraEndToken) { |
rgrover1 | 0:0b799af9d58e | 169 | col[num] = str; |
rgrover1 | 0:0b799af9d58e | 170 | } |
rgrover1 | 0:0b799af9d58e | 171 | } |
rgrover1 | 0:0b799af9d58e | 172 | |
rgrover1 | 0:0b799af9d58e | 173 | void SimpleString::replace(char to, char with) |
rgrover1 | 0:0b799af9d58e | 174 | { |
rgrover1 | 0:0b799af9d58e | 175 | size_t s = size(); |
rgrover1 | 0:0b799af9d58e | 176 | for (size_t i = 0; i < s; i++) { |
rgrover1 | 0:0b799af9d58e | 177 | if (buffer_[i] == to) buffer_[i] = with; |
rgrover1 | 0:0b799af9d58e | 178 | } |
rgrover1 | 0:0b799af9d58e | 179 | } |
rgrover1 | 0:0b799af9d58e | 180 | |
rgrover1 | 0:0b799af9d58e | 181 | void SimpleString::replace(const char* to, const char* with) |
rgrover1 | 0:0b799af9d58e | 182 | { |
rgrover1 | 0:0b799af9d58e | 183 | size_t c = count(to); |
rgrover1 | 0:0b799af9d58e | 184 | size_t len = size(); |
rgrover1 | 0:0b799af9d58e | 185 | size_t tolen = PlatformSpecificStrLen(to); |
rgrover1 | 0:0b799af9d58e | 186 | size_t withlen = PlatformSpecificStrLen(with); |
rgrover1 | 0:0b799af9d58e | 187 | |
rgrover1 | 0:0b799af9d58e | 188 | size_t newsize = len + (withlen * c) - (tolen * c) + 1; |
rgrover1 | 0:0b799af9d58e | 189 | |
rgrover1 | 0:0b799af9d58e | 190 | if (newsize) { |
rgrover1 | 0:0b799af9d58e | 191 | char* newbuf = allocStringBuffer(newsize); |
rgrover1 | 0:0b799af9d58e | 192 | for (size_t i = 0, j = 0; i < len;) { |
rgrover1 | 0:0b799af9d58e | 193 | if (PlatformSpecificStrNCmp(&buffer_[i], to, tolen) == 0) { |
rgrover1 | 0:0b799af9d58e | 194 | PlatformSpecificStrNCpy(&newbuf[j], with, withlen); |
rgrover1 | 0:0b799af9d58e | 195 | j += withlen; |
rgrover1 | 0:0b799af9d58e | 196 | i += tolen; |
rgrover1 | 0:0b799af9d58e | 197 | } |
rgrover1 | 0:0b799af9d58e | 198 | else { |
rgrover1 | 0:0b799af9d58e | 199 | newbuf[j] = buffer_[i]; |
rgrover1 | 0:0b799af9d58e | 200 | j++; |
rgrover1 | 0:0b799af9d58e | 201 | i++; |
rgrover1 | 0:0b799af9d58e | 202 | } |
rgrover1 | 0:0b799af9d58e | 203 | } |
rgrover1 | 0:0b799af9d58e | 204 | deallocStringBuffer(buffer_); |
rgrover1 | 0:0b799af9d58e | 205 | buffer_ = newbuf; |
rgrover1 | 0:0b799af9d58e | 206 | buffer_[newsize - 1] = '\0'; |
rgrover1 | 0:0b799af9d58e | 207 | } |
rgrover1 | 0:0b799af9d58e | 208 | else { |
rgrover1 | 0:0b799af9d58e | 209 | buffer_ = getEmptyString(); |
rgrover1 | 0:0b799af9d58e | 210 | buffer_[0] = '\0'; |
rgrover1 | 0:0b799af9d58e | 211 | } |
rgrover1 | 0:0b799af9d58e | 212 | } |
rgrover1 | 0:0b799af9d58e | 213 | |
rgrover1 | 0:0b799af9d58e | 214 | SimpleString SimpleString::toLower() const |
rgrover1 | 0:0b799af9d58e | 215 | { |
rgrover1 | 0:0b799af9d58e | 216 | SimpleString str(*this); |
rgrover1 | 0:0b799af9d58e | 217 | |
rgrover1 | 0:0b799af9d58e | 218 | size_t str_size = str.size(); |
rgrover1 | 0:0b799af9d58e | 219 | for (size_t i = 0; i < str_size; i++) |
rgrover1 | 0:0b799af9d58e | 220 | str.buffer_[i] = PlatformSpecificToLower(str.buffer_[i]); |
rgrover1 | 0:0b799af9d58e | 221 | |
rgrover1 | 0:0b799af9d58e | 222 | return str; |
rgrover1 | 0:0b799af9d58e | 223 | } |
rgrover1 | 0:0b799af9d58e | 224 | |
rgrover1 | 0:0b799af9d58e | 225 | const char *SimpleString::asCharString() const |
rgrover1 | 0:0b799af9d58e | 226 | { |
rgrover1 | 0:0b799af9d58e | 227 | return buffer_; |
rgrover1 | 0:0b799af9d58e | 228 | } |
rgrover1 | 0:0b799af9d58e | 229 | |
rgrover1 | 0:0b799af9d58e | 230 | size_t SimpleString::size() const |
rgrover1 | 0:0b799af9d58e | 231 | { |
rgrover1 | 0:0b799af9d58e | 232 | return PlatformSpecificStrLen(buffer_); |
rgrover1 | 0:0b799af9d58e | 233 | } |
rgrover1 | 0:0b799af9d58e | 234 | |
rgrover1 | 0:0b799af9d58e | 235 | bool SimpleString::isEmpty() const |
rgrover1 | 0:0b799af9d58e | 236 | { |
rgrover1 | 0:0b799af9d58e | 237 | return size() == 0; |
rgrover1 | 0:0b799af9d58e | 238 | } |
rgrover1 | 0:0b799af9d58e | 239 | |
rgrover1 | 0:0b799af9d58e | 240 | |
rgrover1 | 0:0b799af9d58e | 241 | |
rgrover1 | 0:0b799af9d58e | 242 | SimpleString::~SimpleString() |
rgrover1 | 0:0b799af9d58e | 243 | { |
rgrover1 | 0:0b799af9d58e | 244 | deallocStringBuffer(buffer_); |
rgrover1 | 0:0b799af9d58e | 245 | } |
rgrover1 | 0:0b799af9d58e | 246 | |
rgrover1 | 0:0b799af9d58e | 247 | bool operator==(const SimpleString& left, const SimpleString& right) |
rgrover1 | 0:0b799af9d58e | 248 | { |
rgrover1 | 0:0b799af9d58e | 249 | return 0 == PlatformSpecificStrCmp(left.asCharString(), right.asCharString()); |
rgrover1 | 0:0b799af9d58e | 250 | } |
rgrover1 | 0:0b799af9d58e | 251 | |
rgrover1 | 0:0b799af9d58e | 252 | bool SimpleString::equalsNoCase(const SimpleString& str) const |
rgrover1 | 0:0b799af9d58e | 253 | { |
rgrover1 | 0:0b799af9d58e | 254 | return toLower() == str.toLower(); |
rgrover1 | 0:0b799af9d58e | 255 | } |
rgrover1 | 0:0b799af9d58e | 256 | |
rgrover1 | 0:0b799af9d58e | 257 | |
rgrover1 | 0:0b799af9d58e | 258 | bool operator!=(const SimpleString& left, const SimpleString& right) |
rgrover1 | 0:0b799af9d58e | 259 | { |
rgrover1 | 0:0b799af9d58e | 260 | return !(left == right); |
rgrover1 | 0:0b799af9d58e | 261 | } |
rgrover1 | 0:0b799af9d58e | 262 | |
rgrover1 | 0:0b799af9d58e | 263 | SimpleString SimpleString::operator+(const SimpleString& rhs) |
rgrover1 | 0:0b799af9d58e | 264 | { |
rgrover1 | 0:0b799af9d58e | 265 | SimpleString t(buffer_); |
rgrover1 | 0:0b799af9d58e | 266 | t += rhs.buffer_; |
rgrover1 | 0:0b799af9d58e | 267 | return t; |
rgrover1 | 0:0b799af9d58e | 268 | } |
rgrover1 | 0:0b799af9d58e | 269 | |
rgrover1 | 0:0b799af9d58e | 270 | SimpleString& SimpleString::operator+=(const SimpleString& rhs) |
rgrover1 | 0:0b799af9d58e | 271 | { |
rgrover1 | 0:0b799af9d58e | 272 | return operator+=(rhs.buffer_); |
rgrover1 | 0:0b799af9d58e | 273 | } |
rgrover1 | 0:0b799af9d58e | 274 | |
rgrover1 | 0:0b799af9d58e | 275 | SimpleString& SimpleString::operator+=(const char* rhs) |
rgrover1 | 0:0b799af9d58e | 276 | { |
rgrover1 | 0:0b799af9d58e | 277 | size_t len = this->size() + PlatformSpecificStrLen(rhs) + 1; |
rgrover1 | 0:0b799af9d58e | 278 | char* tbuffer = allocStringBuffer(len); |
rgrover1 | 0:0b799af9d58e | 279 | PlatformSpecificStrCpy(tbuffer, this->buffer_); |
rgrover1 | 0:0b799af9d58e | 280 | PlatformSpecificStrCat(tbuffer, rhs); |
rgrover1 | 0:0b799af9d58e | 281 | deallocStringBuffer(buffer_); |
rgrover1 | 0:0b799af9d58e | 282 | buffer_ = tbuffer; |
rgrover1 | 0:0b799af9d58e | 283 | return *this; |
rgrover1 | 0:0b799af9d58e | 284 | } |
rgrover1 | 0:0b799af9d58e | 285 | |
rgrover1 | 0:0b799af9d58e | 286 | void SimpleString::padStringsToSameLength(SimpleString& str1, SimpleString& str2, char padCharacter) |
rgrover1 | 0:0b799af9d58e | 287 | { |
rgrover1 | 0:0b799af9d58e | 288 | if (str1.size() > str2.size()) { |
rgrover1 | 0:0b799af9d58e | 289 | padStringsToSameLength(str2, str1, padCharacter); |
rgrover1 | 0:0b799af9d58e | 290 | return; |
rgrover1 | 0:0b799af9d58e | 291 | } |
rgrover1 | 0:0b799af9d58e | 292 | |
rgrover1 | 0:0b799af9d58e | 293 | char pad[2]; |
rgrover1 | 0:0b799af9d58e | 294 | pad[0] = padCharacter; |
rgrover1 | 0:0b799af9d58e | 295 | pad[1] = 0; |
rgrover1 | 0:0b799af9d58e | 296 | str1 = SimpleString(pad, str2.size() - str1.size()) + str1; |
rgrover1 | 0:0b799af9d58e | 297 | } |
rgrover1 | 0:0b799af9d58e | 298 | |
rgrover1 | 0:0b799af9d58e | 299 | SimpleString SimpleString::subString(size_t beginPos, size_t amount) const |
rgrover1 | 0:0b799af9d58e | 300 | { |
rgrover1 | 0:0b799af9d58e | 301 | if (beginPos > size()-1) return ""; |
rgrover1 | 0:0b799af9d58e | 302 | |
rgrover1 | 0:0b799af9d58e | 303 | SimpleString newString = buffer_ + beginPos; |
rgrover1 | 0:0b799af9d58e | 304 | |
rgrover1 | 0:0b799af9d58e | 305 | if (newString.size() > amount) |
rgrover1 | 0:0b799af9d58e | 306 | newString.buffer_[amount] = '\0'; |
rgrover1 | 0:0b799af9d58e | 307 | |
rgrover1 | 0:0b799af9d58e | 308 | return newString; |
rgrover1 | 0:0b799af9d58e | 309 | } |
rgrover1 | 0:0b799af9d58e | 310 | |
rgrover1 | 0:0b799af9d58e | 311 | char SimpleString::at(int pos) const |
rgrover1 | 0:0b799af9d58e | 312 | { |
rgrover1 | 0:0b799af9d58e | 313 | return buffer_[pos]; |
rgrover1 | 0:0b799af9d58e | 314 | } |
rgrover1 | 0:0b799af9d58e | 315 | |
rgrover1 | 0:0b799af9d58e | 316 | int SimpleString::find(char ch) const |
rgrover1 | 0:0b799af9d58e | 317 | { |
rgrover1 | 0:0b799af9d58e | 318 | return findFrom(0, ch); |
rgrover1 | 0:0b799af9d58e | 319 | } |
rgrover1 | 0:0b799af9d58e | 320 | |
rgrover1 | 0:0b799af9d58e | 321 | int SimpleString::findFrom(size_t starting_position, char ch) const |
rgrover1 | 0:0b799af9d58e | 322 | { |
rgrover1 | 0:0b799af9d58e | 323 | size_t length = size(); |
rgrover1 | 0:0b799af9d58e | 324 | for (size_t i = starting_position; i < length; i++) |
rgrover1 | 0:0b799af9d58e | 325 | if (buffer_[i] == ch) return (int) i; |
rgrover1 | 0:0b799af9d58e | 326 | return -1; |
rgrover1 | 0:0b799af9d58e | 327 | } |
rgrover1 | 0:0b799af9d58e | 328 | |
rgrover1 | 0:0b799af9d58e | 329 | SimpleString SimpleString::subStringFromTill(char startChar, char lastExcludedChar) const |
rgrover1 | 0:0b799af9d58e | 330 | { |
rgrover1 | 0:0b799af9d58e | 331 | int beginPos = find(startChar); |
rgrover1 | 0:0b799af9d58e | 332 | if (beginPos < 0) return ""; |
rgrover1 | 0:0b799af9d58e | 333 | |
rgrover1 | 0:0b799af9d58e | 334 | int endPos = findFrom((size_t)beginPos, lastExcludedChar); |
rgrover1 | 0:0b799af9d58e | 335 | if (endPos == -1) return subString((size_t)beginPos, size()); |
rgrover1 | 0:0b799af9d58e | 336 | |
rgrover1 | 0:0b799af9d58e | 337 | return subString((size_t)beginPos, (size_t) (endPos - beginPos)); |
rgrover1 | 0:0b799af9d58e | 338 | } |
rgrover1 | 0:0b799af9d58e | 339 | |
rgrover1 | 0:0b799af9d58e | 340 | |
rgrover1 | 0:0b799af9d58e | 341 | void SimpleString::copyToBuffer(char* bufferToCopy, size_t bufferSize) const |
rgrover1 | 0:0b799af9d58e | 342 | { |
rgrover1 | 0:0b799af9d58e | 343 | if (bufferToCopy == NULL || bufferSize == 0) return; |
rgrover1 | 0:0b799af9d58e | 344 | |
rgrover1 | 0:0b799af9d58e | 345 | size_t sizeToCopy = (bufferSize-1 < size()) ? bufferSize-1 : size(); |
rgrover1 | 0:0b799af9d58e | 346 | |
rgrover1 | 0:0b799af9d58e | 347 | PlatformSpecificStrNCpy(bufferToCopy, buffer_, sizeToCopy); |
rgrover1 | 0:0b799af9d58e | 348 | bufferToCopy[sizeToCopy] = '\0'; |
rgrover1 | 0:0b799af9d58e | 349 | |
rgrover1 | 0:0b799af9d58e | 350 | } |
rgrover1 | 0:0b799af9d58e | 351 | |
rgrover1 | 0:0b799af9d58e | 352 | SimpleString StringFrom(bool value) |
rgrover1 | 0:0b799af9d58e | 353 | { |
rgrover1 | 0:0b799af9d58e | 354 | return SimpleString(StringFromFormat("%s", value ? "true" : "false")); |
rgrover1 | 0:0b799af9d58e | 355 | } |
rgrover1 | 0:0b799af9d58e | 356 | |
rgrover1 | 0:0b799af9d58e | 357 | SimpleString StringFrom(const char *value) |
rgrover1 | 0:0b799af9d58e | 358 | { |
rgrover1 | 0:0b799af9d58e | 359 | return SimpleString(value); |
rgrover1 | 0:0b799af9d58e | 360 | } |
rgrover1 | 0:0b799af9d58e | 361 | |
rgrover1 | 0:0b799af9d58e | 362 | SimpleString StringFromOrNull(const char * expected) |
rgrover1 | 0:0b799af9d58e | 363 | { |
rgrover1 | 0:0b799af9d58e | 364 | return (expected) ? StringFrom(expected) : "(null)"; |
rgrover1 | 0:0b799af9d58e | 365 | } |
rgrover1 | 0:0b799af9d58e | 366 | |
rgrover1 | 0:0b799af9d58e | 367 | SimpleString StringFrom(int value) |
rgrover1 | 0:0b799af9d58e | 368 | { |
rgrover1 | 0:0b799af9d58e | 369 | return StringFromFormat("%d", value); |
rgrover1 | 0:0b799af9d58e | 370 | } |
rgrover1 | 0:0b799af9d58e | 371 | |
rgrover1 | 0:0b799af9d58e | 372 | SimpleString StringFrom(long value) |
rgrover1 | 0:0b799af9d58e | 373 | { |
rgrover1 | 0:0b799af9d58e | 374 | return StringFromFormat("%ld", value); |
rgrover1 | 0:0b799af9d58e | 375 | } |
rgrover1 | 0:0b799af9d58e | 376 | |
rgrover1 | 0:0b799af9d58e | 377 | SimpleString StringFrom(const void* value) |
rgrover1 | 0:0b799af9d58e | 378 | { |
rgrover1 | 0:0b799af9d58e | 379 | return SimpleString("0x") + HexStringFrom(value); |
rgrover1 | 0:0b799af9d58e | 380 | } |
rgrover1 | 0:0b799af9d58e | 381 | |
rgrover1 | 0:0b799af9d58e | 382 | SimpleString HexStringFrom(long value) |
rgrover1 | 0:0b799af9d58e | 383 | { |
rgrover1 | 0:0b799af9d58e | 384 | return StringFromFormat("%lx", value); |
rgrover1 | 0:0b799af9d58e | 385 | } |
rgrover1 | 0:0b799af9d58e | 386 | |
rgrover1 | 0:0b799af9d58e | 387 | static long convertPointerToLongValue(const void* value) |
rgrover1 | 0:0b799af9d58e | 388 | { |
rgrover1 | 0:0b799af9d58e | 389 | /* |
rgrover1 | 0:0b799af9d58e | 390 | * This way of converting also can convert a 64bit pointer in a 32bit integer by truncating. |
rgrover1 | 0:0b799af9d58e | 391 | * This isn't the right way to convert pointers values and need to change by implementing a |
rgrover1 | 0:0b799af9d58e | 392 | * proper portable way to convert pointers to strings. |
rgrover1 | 0:0b799af9d58e | 393 | */ |
rgrover1 | 0:0b799af9d58e | 394 | long* long_value = (long*) &value; |
rgrover1 | 0:0b799af9d58e | 395 | return *long_value; |
rgrover1 | 0:0b799af9d58e | 396 | } |
rgrover1 | 0:0b799af9d58e | 397 | |
rgrover1 | 0:0b799af9d58e | 398 | SimpleString HexStringFrom(const void* value) |
rgrover1 | 0:0b799af9d58e | 399 | { |
rgrover1 | 0:0b799af9d58e | 400 | return StringFromFormat("%lx", convertPointerToLongValue(value)); |
rgrover1 | 0:0b799af9d58e | 401 | } |
rgrover1 | 0:0b799af9d58e | 402 | |
rgrover1 | 0:0b799af9d58e | 403 | SimpleString StringFrom(double value, int precision) |
rgrover1 | 0:0b799af9d58e | 404 | { |
rgrover1 | 0:0b799af9d58e | 405 | return StringFromFormat("%.*g", precision, value); |
rgrover1 | 0:0b799af9d58e | 406 | } |
rgrover1 | 0:0b799af9d58e | 407 | |
rgrover1 | 0:0b799af9d58e | 408 | SimpleString StringFrom(char value) |
rgrover1 | 0:0b799af9d58e | 409 | { |
rgrover1 | 0:0b799af9d58e | 410 | return StringFromFormat("%c", value); |
rgrover1 | 0:0b799af9d58e | 411 | } |
rgrover1 | 0:0b799af9d58e | 412 | |
rgrover1 | 0:0b799af9d58e | 413 | SimpleString StringFrom(const SimpleString& value) |
rgrover1 | 0:0b799af9d58e | 414 | { |
rgrover1 | 0:0b799af9d58e | 415 | return SimpleString(value); |
rgrover1 | 0:0b799af9d58e | 416 | } |
rgrover1 | 0:0b799af9d58e | 417 | |
rgrover1 | 0:0b799af9d58e | 418 | SimpleString StringFromFormat(const char* format, ...) |
rgrover1 | 0:0b799af9d58e | 419 | { |
rgrover1 | 0:0b799af9d58e | 420 | SimpleString resultString; |
rgrover1 | 0:0b799af9d58e | 421 | va_list arguments; |
rgrover1 | 0:0b799af9d58e | 422 | va_start(arguments, format); |
rgrover1 | 0:0b799af9d58e | 423 | |
rgrover1 | 0:0b799af9d58e | 424 | resultString = VStringFromFormat(format, arguments); |
rgrover1 | 0:0b799af9d58e | 425 | va_end(arguments); |
rgrover1 | 0:0b799af9d58e | 426 | return resultString; |
rgrover1 | 0:0b799af9d58e | 427 | } |
rgrover1 | 0:0b799af9d58e | 428 | |
rgrover1 | 0:0b799af9d58e | 429 | SimpleString StringFrom(unsigned int i) |
rgrover1 | 0:0b799af9d58e | 430 | { |
rgrover1 | 0:0b799af9d58e | 431 | return StringFromFormat("%10u (0x%08x)", i, i); |
rgrover1 | 0:0b799af9d58e | 432 | } |
rgrover1 | 0:0b799af9d58e | 433 | |
rgrover1 | 0:0b799af9d58e | 434 | #if CPPUTEST_USE_STD_CPP_LIB |
rgrover1 | 0:0b799af9d58e | 435 | |
rgrover1 | 0:0b799af9d58e | 436 | #include <string> |
rgrover1 | 0:0b799af9d58e | 437 | |
rgrover1 | 0:0b799af9d58e | 438 | SimpleString StringFrom(const std::string& value) |
rgrover1 | 0:0b799af9d58e | 439 | { |
rgrover1 | 0:0b799af9d58e | 440 | return SimpleString(value.c_str()); |
rgrover1 | 0:0b799af9d58e | 441 | } |
rgrover1 | 0:0b799af9d58e | 442 | |
rgrover1 | 0:0b799af9d58e | 443 | SimpleString StringFrom(unsigned long i) |
rgrover1 | 0:0b799af9d58e | 444 | { |
rgrover1 | 0:0b799af9d58e | 445 | return StringFromFormat("%lu (0x%lx)", i, i); |
rgrover1 | 0:0b799af9d58e | 446 | } |
rgrover1 | 0:0b799af9d58e | 447 | |
rgrover1 | 0:0b799af9d58e | 448 | #endif |
rgrover1 | 0:0b799af9d58e | 449 | |
rgrover1 | 0:0b799af9d58e | 450 | //Kludge to get a va_copy in VC++ V6 |
rgrover1 | 0:0b799af9d58e | 451 | #ifndef va_copy |
rgrover1 | 0:0b799af9d58e | 452 | #define va_copy(copy, original) copy = original; |
rgrover1 | 0:0b799af9d58e | 453 | #endif |
rgrover1 | 0:0b799af9d58e | 454 | |
rgrover1 | 0:0b799af9d58e | 455 | SimpleString VStringFromFormat(const char* format, va_list args) |
rgrover1 | 0:0b799af9d58e | 456 | { |
rgrover1 | 0:0b799af9d58e | 457 | va_list argsCopy; |
rgrover1 | 0:0b799af9d58e | 458 | va_copy(argsCopy, args); |
rgrover1 | 0:0b799af9d58e | 459 | enum |
rgrover1 | 0:0b799af9d58e | 460 | { |
rgrover1 | 0:0b799af9d58e | 461 | sizeOfdefaultBuffer = 100 |
rgrover1 | 0:0b799af9d58e | 462 | }; |
rgrover1 | 0:0b799af9d58e | 463 | char defaultBuffer[sizeOfdefaultBuffer]; |
rgrover1 | 0:0b799af9d58e | 464 | SimpleString resultString; |
rgrover1 | 0:0b799af9d58e | 465 | |
rgrover1 | 0:0b799af9d58e | 466 | size_t size = (size_t)PlatformSpecificVSNprintf(defaultBuffer, sizeOfdefaultBuffer, format, args); |
rgrover1 | 0:0b799af9d58e | 467 | if (size < sizeOfdefaultBuffer) { |
rgrover1 | 0:0b799af9d58e | 468 | resultString = SimpleString(defaultBuffer); |
rgrover1 | 0:0b799af9d58e | 469 | } |
rgrover1 | 0:0b799af9d58e | 470 | else { |
rgrover1 | 0:0b799af9d58e | 471 | size_t newBufferSize = size + 1; |
rgrover1 | 0:0b799af9d58e | 472 | char* newBuffer = SimpleString::allocStringBuffer(newBufferSize); |
rgrover1 | 0:0b799af9d58e | 473 | PlatformSpecificVSNprintf(newBuffer, newBufferSize, format, argsCopy); |
rgrover1 | 0:0b799af9d58e | 474 | resultString = SimpleString(newBuffer); |
rgrover1 | 0:0b799af9d58e | 475 | |
rgrover1 | 0:0b799af9d58e | 476 | SimpleString::deallocStringBuffer(newBuffer); |
rgrover1 | 0:0b799af9d58e | 477 | } |
rgrover1 | 0:0b799af9d58e | 478 | va_end(argsCopy); |
rgrover1 | 0:0b799af9d58e | 479 | return resultString; |
rgrover1 | 0:0b799af9d58e | 480 | } |
rgrover1 | 0:0b799af9d58e | 481 | |
rgrover1 | 0:0b799af9d58e | 482 | SimpleStringCollection::SimpleStringCollection() |
rgrover1 | 0:0b799af9d58e | 483 | { |
rgrover1 | 0:0b799af9d58e | 484 | collection_ = 0; |
rgrover1 | 0:0b799af9d58e | 485 | size_ = 0; |
rgrover1 | 0:0b799af9d58e | 486 | } |
rgrover1 | 0:0b799af9d58e | 487 | |
rgrover1 | 0:0b799af9d58e | 488 | void SimpleStringCollection::allocate(size_t _size) |
rgrover1 | 0:0b799af9d58e | 489 | { |
rgrover1 | 0:0b799af9d58e | 490 | if (collection_) delete[] collection_; |
rgrover1 | 0:0b799af9d58e | 491 | |
rgrover1 | 0:0b799af9d58e | 492 | size_ = _size; |
rgrover1 | 0:0b799af9d58e | 493 | collection_ = new SimpleString[size_]; |
rgrover1 | 0:0b799af9d58e | 494 | } |
rgrover1 | 0:0b799af9d58e | 495 | |
rgrover1 | 0:0b799af9d58e | 496 | SimpleStringCollection::~SimpleStringCollection() |
rgrover1 | 0:0b799af9d58e | 497 | { |
rgrover1 | 0:0b799af9d58e | 498 | delete[] (collection_); |
rgrover1 | 0:0b799af9d58e | 499 | } |
rgrover1 | 0:0b799af9d58e | 500 | |
rgrover1 | 0:0b799af9d58e | 501 | size_t SimpleStringCollection::size() const |
rgrover1 | 0:0b799af9d58e | 502 | { |
rgrover1 | 0:0b799af9d58e | 503 | return size_; |
rgrover1 | 0:0b799af9d58e | 504 | } |
rgrover1 | 0:0b799af9d58e | 505 | |
rgrover1 | 0:0b799af9d58e | 506 | SimpleString& SimpleStringCollection::operator[](size_t index) |
rgrover1 | 0:0b799af9d58e | 507 | { |
rgrover1 | 0:0b799af9d58e | 508 | if (index >= size_) { |
rgrover1 | 0:0b799af9d58e | 509 | empty_ = ""; |
rgrover1 | 0:0b799af9d58e | 510 | return empty_; |
rgrover1 | 0:0b799af9d58e | 511 | } |
rgrover1 | 0:0b799af9d58e | 512 | |
rgrover1 | 0:0b799af9d58e | 513 | return collection_[index]; |
rgrover1 | 0:0b799af9d58e | 514 | } |
rgrover1 | 0:0b799af9d58e | 515 |