Own fork of MbedSmartRest

Dependents:   MbedSmartRestMain MbedSmartRestMain

Fork of MbedSmartRest by Cumulocity Official

Revision:
20:505d29d5bdfc
Parent:
11:e1bee9a77652
--- a/Parser.cpp	Fri Mar 20 14:26:52 2015 +0000
+++ b/Parser.cpp	Mon Apr 13 14:24:44 2015 +0000
@@ -26,8 +26,10 @@
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#include <assert.h>
+#include <stdio.h>
+#include <ctype.h>
 #include "Parser.h"
-#include <assert.h>
 
 #define STATE_BLANK 0
 #define STATE_STRUCTURE 1
@@ -46,139 +48,113 @@
 /*-------------------------------------------------------------------------*/
 uint8_t Parser::readFrom(AbstractDataSource& source, ParsedRecord& record)
 {
-	int status = -1;
-	char read;
-
 	reset();
 	record.clear();
 
-	while ((_state < STATE_COMPLETE) &&
-			(((read = source.read()) > 0) ||
-			 ((status = source.status()) == DS_STATUS_OK)))
-		parse(read);
-
-	// successfully read record
-	if (_state == STATE_COMPLETE)
-	{
+	int status = -1;
+	char read;
+	while (_state < STATE_COMPLETE) {
+		read = source.read();
+		status = source.status();
+//		if (isprint(read)) {
+//			printf("%4c: %u\n", read, status);
+//		} else {
+//			printf("#%04x: %u\n", read, status);
+//		}
+		if (read > 0 || status == DS_STATUS_OK)
+			parse(read);
+		else
+			break;
+	}
+//	printf("Parser: [E]while! %u, %d\r\n", _state, status);
+	if (_state == STATE_COMPLETE) { // successfully read record
 		if (!record.set(_buffer, _count))
 			return PARSER_INTERNAL_ERROR;
-		return PARSER_SUCCESS;
-	}
-
-	if (_state == STATE_BLANK)
-	{
-		assert(status >= 0);
+		else
+			return PARSER_SUCCESS;
+	} else if (_state == STATE_BLANK) {
 		if (status == DS_STATUS_CLOSED)
 			return PARSER_END_OF_RESPONSE;
 		else if (status == DS_STATUS_TIMEOUT)
 			return PARSER_TIMEOUT_ERROR;
 		else
 			return PARSER_INTERNAL_ERROR;
+	} else {
+		if (status == DS_STATUS_TIMEOUT)
+			return PARSER_TIMEOUT_ERROR;
+		else if (status == DS_STATUS_ERROR)
+			return PARSER_INTERNAL_ERROR;
+		else
+			return PARSER_PARSE_ERROR;
 	}
-
-	assert(status >= 0);
-	if (status == DS_STATUS_TIMEOUT)
-		return PARSER_TIMEOUT_ERROR;
-	else if (status == DS_STATUS_ERROR)
-		return PARSER_INTERNAL_ERROR;
-	else
-		return PARSER_PARSE_ERROR;
 }
 /*-------------------------------------------------------------------------*/
 void Parser::parse(char c)
 {
-	if (_ptr-_buffer >= SMARTREST_PARSER_BUFFER_SIZE)
-	{
+	if (_ptr-_buffer >= SMARTREST_PARSER_BUFFER_SIZE) {
 		_state = STATE_ERROR;
 		return;
 	}
 
 	switch (_state)
 	{
-		case STATE_BLANK:
-			_state = STATE_STRUCTURE;
-		case STATE_STRUCTURE:
-			switch (c)
-			{
-				case ' ':
-				case '\t':
-				case '\r':
-					break;
-				case '"':
-					_state = STATE_INQUOTES;
-					break;
-				case ',':
-					close();
-					break;
-				case '\0':
-				case '\n':
-					if ((_count == 0) && (_length == 0))
-					{
-						_state = STATE_BLANK;
-					}
-					else
-					{
-						close();
-						_state = STATE_COMPLETE;
-					}
-					break;
-				default:
-					if (_length > 0)
-					{
-						_state = STATE_ERROR;
-					}
-					else
-					{
-						_state = STATE_VALUE;
-						parse(c);
-					}
-					break;
+	case STATE_BLANK: _state = STATE_STRUCTURE;
+	case STATE_STRUCTURE:
+		switch (c)
+		{
+		case ' ':
+		case '\t':
+		case '\r': break;
+		case '"': _state = STATE_INQUOTES; break;
+		case ',': close(); break;
+		case '\0':
+		case '\n':
+			if (_count==0 && _length==0) {
+				_state = STATE_BLANK;
+			} else {
+				close();
+				_state = STATE_COMPLETE;
+			}
+			break;
+		default:
+			if (_length > 0) {
+				_state = STATE_ERROR;
+			} else {
+				_state = STATE_VALUE;
+				parse(c);
 			}
 			break;
-		case STATE_VALUE:
-			switch (c)
-			{
-				case ',':
-				case '\n':
-					_state = STATE_STRUCTURE;
-					parse(c);
-					break;
-				case '"':
-					_state = STATE_ERROR;
-					break;
-				default:
-					if ((c == ' ') || (c == '\t') || (c == '\r'))
-						_trailing++;
-					else
-						_trailing = 0;
-					append(c);
-					break;
-			}
+		}
+		break;
+	case STATE_VALUE:
+		switch (c)
+		{
+		case ',':
+		case '\n':	_state = STATE_STRUCTURE; parse(c); break;
+		case '"': 	_state = STATE_ERROR; break;
+		default:
+			if ((c == ' ') || (c == '\t') || (c == '\r'))
+				_trailing++;
+			else
+				_trailing = 0;
+			append(c);
 			break;
-		case STATE_INQUOTES:
-			switch (c)
-			{
-				case '"':
-					_state = STATE_AFTERQUOTE;
-					break;
-				default:
-					append(c);
-					break;
-			}
-			break;
-		case STATE_AFTERQUOTE:
-			switch (c)
-			{
-				case '"':
-					append(c);
-					_state = STATE_INQUOTES;
-					break;
-				default:
-					_state = STATE_STRUCTURE;
-					parse(c);
-					break;
-			}
-			break;
+		}
+		break;
+	case STATE_INQUOTES:
+		switch (c)
+		{
+		case '"': _state = STATE_AFTERQUOTE; break;
+		default: append(c);	break;
+		}
+		break;
+	case STATE_AFTERQUOTE:
+		switch (c)
+		{
+		case '"': append(c); _state = STATE_INQUOTES; break;
+		default: _state = STATE_STRUCTURE; parse(c); break;
+		}
+		break;
 	}
 }
 /*-------------------------------------------------------------------------*/