Own fork of MbedSmartRest
Dependents: MbedSmartRestMain MbedSmartRestMain
Fork of MbedSmartRest by
Diff: Parser.cpp
- Revision:
- 11:e1bee9a77652
- Parent:
- 6:cd7ba1ddb664
- Child:
- 20:505d29d5bdfc
--- a/Parser.cpp Thu Oct 23 14:41:58 2014 +0200 +++ b/Parser.cpp Sat Nov 15 11:21:01 2014 +0100 @@ -27,6 +27,7 @@ */ #include "Parser.h" +#include <assert.h> #define STATE_BLANK 0 #define STATE_STRUCTURE 1 @@ -36,152 +37,172 @@ #define STATE_COMPLETE 5 #define STATE_ERROR 6 + +/*-------------------------------------------------------------------------*/ Parser::Parser() { - reset(); + reset(); } - +/*-------------------------------------------------------------------------*/ uint8_t Parser::readFrom(AbstractDataSource& source, ParsedRecord& record) { - uint8_t status; char read; + int status = -1; + char read; - reset(); - record.clear(); + reset(); + record.clear(); - while ((_state < STATE_COMPLETE) && - (((read = source.read()) > 0) || - ((status = source.status()) == DS_STATUS_OK))) - parse(read); + while ((_state < STATE_COMPLETE) && + (((read = source.read()) > 0) || + ((status = source.status()) == DS_STATUS_OK))) + parse(read); - // successfully read record - if (_state == STATE_COMPLETE) { - if (!record.set(_buffer, _count)) - return PARSER_INTERNAL_ERROR; - return PARSER_SUCCESS; - } + // successfully read record + if (_state == STATE_COMPLETE) + { + if (!record.set(_buffer, _count)) + return PARSER_INTERNAL_ERROR; + return PARSER_SUCCESS; + } - 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; - } + if (_state == STATE_BLANK) + { + assert(status >= 0); + 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; + } - 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) { - _state = STATE_ERROR; - return; - } + 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; - } - 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_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; - } + 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; + } + 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_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; + } } - +/*-------------------------------------------------------------------------*/ void Parser::append(char c) { - *_ptr++ = c; - _length++; + *_ptr++ = c; + _length++; } - +/*-------------------------------------------------------------------------*/ void Parser::close() { - _ptr -= _trailing; - *_ptr++ = 0; - _trailing = 0; - _length = 0; - _count++; + _ptr -= _trailing; + *_ptr++ = 0; + _trailing = 0; + _length = 0; + _count++; } - +/*-------------------------------------------------------------------------*/ void Parser::reset() { - _state = STATE_BLANK; - _ptr = _buffer; - _count = 0; - _trailing = 0; - _length = 0; + _state = STATE_BLANK; + _ptr = _buffer; + _count = 0; + _trailing = 0; + _length = 0; } +/*-------------------------------------------------------------------------*/