Skip to content

Commit 722b93d

Browse files
committed
Changing String::toCharArray() and getBytes() to accept a buffer, rather than return one. That way they don't expose the internal representation of the String class, allowing future optimization. Thanks to Paul Stoffregen.
1 parent f8077a9 commit 722b93d

File tree

3 files changed

+27
-8
lines changed

3 files changed

+27
-8
lines changed

hardware/arduino/cores/arduino/Print.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ void Print::write(const uint8_t *buffer, size_t size)
4545

4646
void Print::print(const String &s)
4747
{
48-
print(s.toCharArray());
48+
for (int i = 0; i < s.length(); i++) {
49+
write(s[i]);
50+
}
4951
}
5052

5153
void Print::print(const char str[])

hardware/arduino/cores/arduino/WString.cpp

+22-5
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ int String::operator==( const String &rhs ) const
169169

170170
int String::operator!=( const String &rhs ) const
171171
{
172-
return ( _length != rhs.length() || strcmp( _buffer, rhs.toCharArray() ) != 0 );
172+
return ( _length != rhs.length() || strcmp( _buffer, rhs._buffer ) != 0 );
173173
}
174174

175175
int String::operator<( const String &rhs ) const
@@ -213,7 +213,7 @@ boolean String::endsWith( const String &s2 ) const
213213
if ( _length < s2._length )
214214
return 0;
215215

216-
return strcmp( &_buffer[ _length - s2._length], s2.toCharArray() ) == 0;
216+
return strcmp( &_buffer[ _length - s2._length], s2._buffer ) == 0;
217217
}
218218

219219
boolean String::equals( const String &s2 ) const
@@ -228,7 +228,7 @@ boolean String::equalsIgnoreCase( const String &s2 ) const
228228
else if ( _length != s2._length )
229229
return false; //0;
230230

231-
return strcmp(toLowerCase().toCharArray(), s2.toLowerCase().toCharArray()) == 0;
231+
return strcmp(toLowerCase()._buffer, s2.toLowerCase()._buffer) == 0;
232232
}
233233

234234
String String::replace( char findChar, char replaceChar )
@@ -285,7 +285,7 @@ int String::indexOf( const String &s2, unsigned int fromIndex ) const
285285
if ( fromIndex >= _length )
286286
return -1;
287287

288-
const char *theFind = strstr( &_buffer[ fromIndex ], s2.toCharArray() );
288+
const char *theFind = strstr( &_buffer[ fromIndex ], s2._buffer );
289289

290290
if ( theFind == NULL )
291291
return -1;
@@ -349,7 +349,7 @@ boolean String::startsWith( const String &s2, unsigned int offset ) const
349349
if ( offset > _length - s2._length )
350350
return 0;
351351

352-
return strncmp( &_buffer[offset], s2.toCharArray(), s2._length ) == 0;
352+
return strncmp( &_buffer[offset], s2._buffer, s2._length ) == 0;
353353
}
354354

355355
String String::substring( unsigned int left ) const
@@ -417,3 +417,20 @@ String String::trim() const
417417
return temp.substring( i, j + 1);
418418
}
419419

420+
void String::getBytes(unsigned char *buf, unsigned int bufsize)
421+
{
422+
if (!bufsize || !buf) return;
423+
unsigned int len = bufsize - 1;
424+
if (len > _length) len = _length;
425+
strncpy((char *)buf, _buffer, len);
426+
buf[len] = 0;
427+
}
428+
429+
void String::toCharArray(char *buf, unsigned int bufsize)
430+
{
431+
if (!bufsize || !buf) return;
432+
unsigned int len = bufsize - 1;
433+
if (len > _length) len = _length;
434+
strncpy(buf, _buffer, len);
435+
buf[len] = 0;
436+
}

hardware/arduino/cores/arduino/WString.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ class String
7676
String toLowerCase( ) const;
7777
String toUpperCase( ) const;
7878
String trim( ) const;
79-
const unsigned char *getBytes() const { return (unsigned char*)_buffer; }
80-
const char* toCharArray() const { return _buffer; }
79+
void getBytes(unsigned char *buf, unsigned int bufsize);
80+
void toCharArray(char *buf, unsigned int bufsize);
8181
const String& concat( const String &str );
8282
String replace( char oldChar, char newChar );
8383
String replace( const String& match, const String& replace );

0 commit comments

Comments
 (0)