Own fork of MbedSmartRest
Dependents: MbedSmartRestMain MbedSmartRestMain
Fork of MbedSmartRest by
Diff: Parser.cpp
- 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; } } /*-------------------------------------------------------------------------*/