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