From 1be423e019d9876dbfa20300a481406ad39f05f0 Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周二, 08 10月 2013 19:44:02 +0800 Subject: [PATCH] Add ifndef TRUE/FALSE --- libscpi/src/parser.c | 66 ++++++++++++++++++++++++++------ 1 files changed, 53 insertions(+), 13 deletions(-) diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c index 99de301..2a0eabf 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; @@ -340,6 +342,17 @@ return result; } +/** + * Write boolean value to the result + * @param context + * @param val + * @return + */ +size_t SCPI_ResultBool(scpi_t * context, bool_t val) { + return SCPI_ResultIntBase(context, val ? 1 : 0, 10); +} + + /* parsing parameters */ bool_t SCPI_Parameter(scpi_t * context, scpi_parameter_t * parameter, bool_t mandatory) { @@ -448,6 +461,26 @@ *len = parameter->data.len; } +/* SCPI-99 7.3 Boolean Program Data */ +bool_t SCPI_ParamGetBoolVal(scpi_t * context, scpi_parameter_t * parameter) { + switch (parameter->type) { + case TokDecimalNumericProgramData: + return parameter->number.value ? 1 : 0; + case TokProgramMnemonic: + if (compareStr("ON", 2, parameter->data.ptr, parameter->data.len)) { + return TRUE; + } else if (compareStr("OFF", 3, parameter->data.ptr, parameter->data.len)) { + return FALSE; + } else { + SCPI_ErrorPush(context, SCPI_ERROR_INVALID_PARAMETER); + return FALSE; + } + default: + SCPI_ErrorPush(context, SCPI_ERROR_INVALID_PARAMETER); + return FALSE; + } +} + int SCPI_ParseProgramData(lex_state_t * state, token_t * token) { token_t tmp; int result = 0; @@ -523,6 +556,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 +569,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 +578,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