From 3b962be2730265dd27220b801fc9bceb92220977 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Mon, 2 Jan 2012 13:49:59 -0500 Subject: Fixing findUntil() problem with repeated initial characters. (Jeffery.zksun) http://code.google.com/p/arduino/issues/detail?id=768 --- cores/arduino/Stream.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'cores/arduino/Stream.cpp') diff --git a/cores/arduino/Stream.cpp b/cores/arduino/Stream.cpp index 5fad8dd..3d5b905 100644 --- a/cores/arduino/Stream.cpp +++ b/cores/arduino/Stream.cpp @@ -99,25 +99,27 @@ bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t size_t index = 0; // maximum target string length is 64k bytes! size_t termIndex = 0; int c; - + if( *target == 0) - return true; // return true if target is a null string + return true; // return true if target is a null string while( (c = timedRead()) > 0){ + + if(c != target[index]) + index = 0; // reset index if any char does not match + if( c == target[index]){ - //////Serial.print("found "); Serial.write(c); Serial.print("index now"); Serial.println(index+1); + //////Serial.print("found "); Serial.write(c); Serial.print("index now"); Serial.println(index+1); if(++index >= targetLen){ // return true if all chars in the target match return true; } } - else{ - index = 0; // reset index if any char does not match - } + if(termLen > 0 && c == terminator[termIndex]){ - if(++termIndex >= termLen) - return false; // return false if terminate string found before target string + if(++termIndex >= termLen) + return false; // return false if terminate string found before target string } else - termIndex = 0; + termIndex = 0; } return false; } -- cgit v1.2.3-18-g5258 From b495294aa32ca838180af57efdb1f04727487d55 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Wed, 16 May 2012 15:39:34 -0400 Subject: Adding readString() and readStringUntil() to Stream (Adrian McEwen). This isn't necessarily a particularly efficient implementation (it allocates memory one character at a time and so may lead to fragmentation) but it seems to work. http://code.google.com/p/arduino/issues/detail?id=454 --- cores/arduino/Stream.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'cores/arduino/Stream.cpp') diff --git a/cores/arduino/Stream.cpp b/cores/arduino/Stream.cpp index 3d5b905..aafb7fc 100644 --- a/cores/arduino/Stream.cpp +++ b/cores/arduino/Stream.cpp @@ -244,3 +244,27 @@ size_t Stream::readBytesUntil(char terminator, char *buffer, size_t length) return index; // return number of characters, not including null terminator } +String Stream::readString() +{ + String ret; + int c = timedRead(); + while (c >= 0) + { + ret += (char)c; + c = timedRead(); + } + return ret; +} + +String Stream::readStringUntil(char terminator) +{ + String ret; + int c = timedRead(); + while (c >= 0 && c != terminator) + { + ret += (char)c; + c = timedRead(); + } + return ret; +} + -- cgit v1.2.3-18-g5258