diff options
author | Chris--A <chris@genx.biz> | 2015-06-16 22:50:59 +1000 |
---|---|---|
committer | Sandeep Mistry <s.mistry@arduino.cc> | 2015-11-23 15:46:24 -0500 |
commit | db295bda6a74fddbf44520a0bb1af3ef2af3a5de (patch) | |
tree | 97037562c99e5f477fd466e575911b02a7d66fc8 /cores/arduino/Stream.cpp | |
parent | 475bcd1d4fe686931a041e479f2870f7d754557c (diff) |
This adds control of Stream::parseInt/float lookahead.
Its default is SKIP_ALL which reflects previous versions.
However SKIP_NONE, and SKIP_WHITESPACE can refine this behaviour.
A parameter used in the protected overloads of parseInt/Float has been
changed from `skipChar` to `ignore`.
Diffstat (limited to 'cores/arduino/Stream.cpp')
-rw-r--r-- | cores/arduino/Stream.cpp | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/cores/arduino/Stream.cpp b/cores/arduino/Stream.cpp index f67b431..61ad678 100644 --- a/cores/arduino/Stream.cpp +++ b/cores/arduino/Stream.cpp @@ -54,7 +54,7 @@ int Stream::timedPeek() // returns peek of the next digit in the stream or -1 if timeout // discards non-numeric characters -int Stream::peekNextDigit( bool detectDecimal ) +int Stream::peekNextDigit(LookaheadMode lookahead, bool detectDecimal) { int c; while (1) { @@ -65,6 +65,17 @@ int Stream::peekNextDigit( bool detectDecimal ) c >= '0' && c <= '9' || detectDecimal && c == '.') return c; + switch( lookahead ){ + case SKIP_NONE: return -1; // Fail code. + case SKIP_WHITESPACE: + switch( c ){ + case ' ': + case '\t': + case '\r': + case '\n': break; + default: return -1; // Fail code. + } + } read(); // discard non-numeric } } @@ -114,26 +125,26 @@ bool Stream::findUntil(char *target, size_t targetLen, char *terminator, size_t // returns the first valid (long) integer value from the current position. // initial characters that are not digits (or the minus sign) are skipped // function is terminated by the first character that is not a digit. -long Stream::parseInt() +long Stream::parseInt(LookaheadMode lookahead) { - return parseInt(NO_SKIP_CHAR); // terminate on first non-digit character (or timeout) + return parseInt(lookahead, NO_SKIP_CHAR); // terminate on first non-digit character (or timeout) } -// as above but a given skipChar is ignored +// as above but 'ignore' is ignored // this allows format characters (typically commas) in values to be ignored -long Stream::parseInt(char skipChar) +long Stream::parseInt(LookaheadMode lookahead, char ignore) { bool isNegative = false; long value = 0; int c; - c = peekNextDigit(false); + c = peekNextDigit(lookahead, false); // ignore non numeric leading characters if(c < 0) return 0; // zero returned if timeout do{ - if(c == skipChar) + if(c == ignore) ; // ignore this charactor else if(c == '-') isNegative = true; @@ -142,7 +153,7 @@ long Stream::parseInt(char skipChar) read(); // consume the character we got with peek c = timedPeek(); } - while( (c >= '0' && c <= '9') || c == skipChar ); + while( (c >= '0' && c <= '9') || c == ignore ); if(isNegative) value = -value; @@ -151,27 +162,27 @@ long Stream::parseInt(char skipChar) // as parseInt but returns a floating point value -float Stream::parseFloat() +float Stream::parseFloat(LookaheadMode lookahead) { - return parseFloat(NO_SKIP_CHAR); + return parseFloat(lookahead, NO_SKIP_CHAR); } -// as above but the given skipChar is ignored +// as above but the given ignore is ignored // this allows format characters (typically commas) in values to be ignored -float Stream::parseFloat(char skipChar){ +float Stream::parseFloat(LookaheadMode lookahead, char ignore){ bool isNegative = false; bool isFraction = false; long value = 0; char c; float fraction = 1.0; - c = peekNextDigit(true); + c = peekNextDigit(lookahead, true); // ignore non numeric leading characters if(c < 0) return 0; // zero returned if timeout do{ - if(c == skipChar) + if(c == ignore) ; // ignore else if(c == '-') isNegative = true; @@ -185,7 +196,7 @@ float Stream::parseFloat(char skipChar){ read(); // consume the character we got with peek c = timedPeek(); } - while( (c >= '0' && c <= '9') || c == '.' && !isFraction || c == skipChar ); + while( (c >= '0' && c <= '9') || c == '.' && !isFraction || c == ignore ); if(isNegative) value = -value; |