[gnoduino: 121/237] Don't consume trailing char in parseInt() and parseFloat (Paul Stoffregen).



commit 8f1c462bdb124d287af4e7c80c7ce33ee039a17b
Author: David A. Mellis <d mellis arduino cc>
Date:   Fri Sep 9 16:24:47 2011 -0400

    Don't consume trailing char in parseInt() and parseFloat (Paul Stoffregen).
    
    http://code.google.com/p/arduino/issues/detail?id=624

 arduino/cores/arduino/Stream.cpp |   55 ++++++++++++++++++++++---------------
 arduino/cores/arduino/Stream.h   |    3 +-
 2 files changed, 35 insertions(+), 23 deletions(-)
---
diff --git a/arduino/cores/arduino/Stream.cpp b/arduino/cores/arduino/Stream.cpp
index d267bf0..8b6f1e8 100644
--- a/arduino/cores/arduino/Stream.cpp
+++ b/arduino/cores/arduino/Stream.cpp
@@ -29,30 +29,39 @@
 // private method to read stream with timeout
 int Stream::timedRead()
 {
-  //Serial.println(_timeout);
-  this->_startMillis = millis();
-  while(millis() - this->_startMillis < this->_timeout)
-  {
-    if (this->available() > 0) {
-      return this->read();
-    }
-  }
+  int c;
+  _startMillis = millis();
+  do {
+    c = read();
+    if (c >= 0) return c;
+  } while(millis() - _startMillis < _timeout);
+  return -1;     // -1 indicates timeout
+}
+
+// private method to peek stream with timeout
+int Stream::timedPeek()
+{
+  int c;
+  _startMillis = millis();
+  do {
+    c = peek();
+    if (c >= 0) return c;
+  } while(millis() - _startMillis < _timeout);
   return -1;     // -1 indicates timeout
 }
 
-// returns the next digit in the stream or -1 if timeout
+// returns peek of the next digit in the stream or -1 if timeout
 // discards non-numeric characters
-int Stream::getNextDigit()
+int Stream::peekNextDigit()
 {
   int c;
-  do{
-    c = timedRead();
-    if( c < 0)
-      return c;  // timeout
+  while (1) {
+    c = timedPeek();
+    if (c < 0) return c;  // timeout
+    if (c == '-') return c;
+    if (c >= '0' && c <= '9') return c;
+    read();  // discard non-numeric
   }
-  while( c != '-' && (c < '0' || c > '9') ) ;
-
-return c;
 }
 
 // Public Methods
@@ -130,7 +139,7 @@ long Stream::parseInt(char skipChar)
   long value = 0;
   int c;
 
-  c = getNextDigit();
+  c = peekNextDigit();
   // ignore non numeric leading characters
   if(c < 0)
     return 0; // zero returned if timeout
@@ -142,9 +151,10 @@ long Stream::parseInt(char skipChar)
       isNegative = true;
     else if(c >= '0' && c <= '9')        // is c a digit?
       value = value * 10 + c - '0';
-    c = timedRead();
+    read();  // consume the character we got with peek
+    c = timedPeek();
   }
-  while( (c >= '0' && c <= '9')  || c == skipChar );
+  while( (c >= '0' && c <= '9') || c == skipChar );
 
   if(isNegative)
     value = -value;
@@ -168,7 +178,7 @@ float Stream::parseFloat(char skipChar){
   char c;
   float fraction = 1.0;
 
-  c = getNextDigit();
+  c = peekNextDigit();
     // ignore non numeric leading characters
   if(c < 0)
     return 0; // zero returned if timeout
@@ -185,7 +195,8 @@ float Stream::parseFloat(char skipChar){
       if(isFraction)
          fraction *= 0.1;
     }
-    c = timedRead();
+    read();  // consume the character we got with peek
+    c = timedPeek();
   }
   while( (c >= '0' && c <= '9')  || c == '.' || c == skipChar );
 
diff --git a/arduino/cores/arduino/Stream.h b/arduino/cores/arduino/Stream.h
index 1633f15..3c6d025 100644
--- a/arduino/cores/arduino/Stream.h
+++ b/arduino/cores/arduino/Stream.h
@@ -41,7 +41,8 @@ class Stream : public Print
     long _timeout;      // number of milliseconds to wait for the next char before aborting timed read
     long _startMillis;  // used for timeout measurement
     int timedRead();    // private method to read stream with timeout
-    int getNextDigit(); // returns the next numeric digit in the stream or -1 if timeout
+    int timedPeek();    // private method to peek stream with timeout
+    int peekNextDigit(); // returns the next numeric digit in the stream or -1 if timeout
 
   public:
     virtual int available() = 0;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]