fork

Fork of cpputest by Rohit Grover

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?

UserRevisionLine numberNew 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