From ba22a750093f5b918aefd58ba698f38dff6a14e1 Mon Sep 17 00:00:00 2001
From: Jan Breuer <jan.breuer@jaybee.cz>
Date: 摹曛, 20 6月 2013 22:03:49 +0800
Subject: [PATCH] Unexpected character handling

---
 libscpi/src/parser.c |   35 ++++++++++++++++++++++-------------
 1 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c
index 99de301..cedce47 100644
--- a/libscpi/src/parser.c
+++ b/libscpi/src/parser.c
@@ -167,7 +167,9 @@
 
         r = SCPI_DetectProgramMessageUnit(state, data, len);
 
-        if (state->programHeader.len > 0) {
+        if (state->programHeader.type == TokInvalid) {
+            SCPI_ErrorPush(context, SCPI_ERROR_UNEXPECTED_CHARACTER);
+        } else if (state->programHeader.len > 0) {
             if (findCommandHeader(context, state->programHeader.ptr, state->programHeader.len)) {
 
                 context->param_list.lex_state.buffer = state->programData.ptr;
@@ -523,6 +525,12 @@
     return token->len;
 }
 
+static void invalidateToken(token_t * token, const char * ptr) {
+    token->len = 0;
+    token->ptr = ptr;
+    token->type = TokUnknown;
+}
+
 int SCPI_DetectProgramMessageUnit(scpi_parser_state_t * state, const char * buffer, int len) {
     lex_state_t lex_state;
     token_t tmp;
@@ -530,6 +538,7 @@
 
     lex_state.buffer = lex_state.pos = buffer;
     lex_state.len = len;
+    state->numberOfParameters = 0;
 
     /* ignore whitespace at the begginig */
     SCPI_LexWhiteSpace(&lex_state, &tmp);
@@ -538,25 +547,25 @@
         if (SCPI_LexWhiteSpace(&lex_state, &tmp) > 0) {
             SCPI_ParseAllProgramData(&lex_state, &state->programData, &state->numberOfParameters);
         } else {
-            state->programData.len = 0;
-            state->programData.ptr = lex_state.pos;
-            state->programData.type = TokUnknown;
-            state->numberOfParameters = 0;
+            invalidateToken(&state->programData, lex_state.pos);
         }
     } else {
-        state->programHeader.len = 0;
-        state->programData.ptr = lex_state.buffer;
-        state->programHeader.type = TokUnknown;
-
-        state->programData.len = 0;
-        state->programData.ptr = lex_state.buffer;
-        state->programData.type = TokUnknown;
-        state->numberOfParameters = 0;
+        invalidateToken(&state->programHeader, lex_state.buffer);
+        invalidateToken(&state->programData, lex_state.buffer);
     }
 
     if (result == 0) result = SCPI_LexNewLine(&lex_state, &tmp);
     if (result == 0) result = SCPI_LexSemicolon(&lex_state, &tmp);
 
+    if (!SCPI_LexIsEos(&lex_state) && (result == 0)) {
+        lex_state.pos++;
+
+        state->programHeader.len = 1;
+        state->programHeader.type = TokInvalid;
+
+        invalidateToken(&state->programData, lex_state.buffer);        
+    }
+
     if (TokSemicolon == tmp.type) {
         state->termination = PmutSemicolon;
     } else if (TokNewLine == tmp.type) {

--
Gitblit v1.9.1