Jan Breuer
2013-06-20 ba22a750093f5b918aefd58ba698f38dff6a14e1
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) {