From 71c6c18189be9b7bf995d6e71b7ec5eb88161823 Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周日, 24 4月 2016 23:18:58 +0800 Subject: [PATCH] Add support for array parameters represened as text (#52) --- libscpi/src/expression.c | 33 +++++++++++++++++---------------- 1 files changed, 17 insertions(+), 16 deletions(-) diff --git a/libscpi/src/expression.c b/libscpi/src/expression.c index ffbdf39..702835c 100644 --- a/libscpi/src/expression.c +++ b/libscpi/src/expression.c @@ -49,8 +49,7 @@ * SCPI_EXPR_ERROR - parser error * SCPI_EXPR_NO_MORE - no more data */ -static scpi_expr_result_t numericRange(lex_state_t * state, scpi_bool_t * isRange, scpi_token_t * valueFrom, scpi_token_t * valueTo) -{ +static scpi_expr_result_t numericRange(lex_state_t * state, scpi_bool_t * isRange, scpi_token_t * valueFrom, scpi_token_t * valueTo) { if (scpiLex_DecimalNumericProgramData(state, valueFrom)) { if (scpiLex_Colon(state, valueTo)) { *isRange = TRUE; @@ -81,8 +80,7 @@ * SCPI_EXPR_NO_MORE - no more data * @see SCPI_ExprNumericListEntryInt, SCPI_ExprNumericListEntryDouble */ -scpi_expr_result_t SCPI_ExprNumericListEntry(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, scpi_parameter_t * valueFrom, scpi_parameter_t * valueTo) -{ +scpi_expr_result_t SCPI_ExprNumericListEntry(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, scpi_parameter_t * valueFrom, scpi_parameter_t * valueTo) { lex_state_t lex; int i; scpi_expr_result_t res = SCPI_EXPR_OK; @@ -133,8 +131,7 @@ * SCPI_EXPR_NO_MORE - no more data * @see SCPI_ExprNumericListEntry, SCPI_ExprNumericListEntryDouble */ -scpi_expr_result_t SCPI_ExprNumericListEntryInt(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, int32_t * valueFrom, int32_t * valueTo) -{ +scpi_expr_result_t SCPI_ExprNumericListEntryInt(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, int32_t * valueFrom, int32_t * valueTo) { scpi_expr_result_t res; scpi_bool_t range = FALSE; scpi_parameter_t paramFrom; @@ -165,8 +162,7 @@ * SCPI_EXPR_NO_MORE - no more data * @see SCPI_ExprNumericListEntry, SCPI_ExprNumericListEntryInt */ -scpi_expr_result_t SCPI_ExprNumericListEntryDouble(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, double * valueFrom, double * valueTo) -{ +scpi_expr_result_t SCPI_ExprNumericListEntryDouble(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, double * valueFrom, double * valueTo) { scpi_expr_result_t res; scpi_bool_t range = FALSE; scpi_parameter_t paramFrom; @@ -192,13 +188,12 @@ * @param length length of values array * @param dimensions real number of dimensions */ -static scpi_expr_result_t channelSpec(scpi_t * context, lex_state_t * state, int32_t * values, size_t length, size_t * dimensions) -{ +static scpi_expr_result_t channelSpec(scpi_t * context, lex_state_t * state, int32_t * values, size_t length, size_t * dimensions) { scpi_parameter_t param; size_t i = 0; - while(scpiLex_DecimalNumericProgramData(state, ¶m)) { + while (scpiLex_DecimalNumericProgramData(state, ¶m)) { if (i < length) { - SCPI_ParamToInt(context, ¶m, &values[i]); + SCPI_ParamToInt32(context, ¶m, &values[i]); } if (scpiLex_SpecificCharacter(state, ¶m, '!')) { @@ -227,8 +222,7 @@ * @param length length of values arrays * @param dimensions real number of dimensions */ -static scpi_expr_result_t channelRange(scpi_t * context, lex_state_t * state, scpi_bool_t * isRange, int32_t * valuesFrom, int32_t * valuesTo, size_t length, size_t * dimensions) -{ +static scpi_expr_result_t channelRange(scpi_t * context, lex_state_t * state, scpi_bool_t * isRange, int32_t * valuesFrom, int32_t * valuesTo, size_t length, size_t * dimensions) { scpi_token_t token; scpi_expr_result_t err; size_t fromDimensions; @@ -251,6 +245,8 @@ *dimensions = fromDimensions; return SCPI_EXPR_OK; } + } else if (err == SCPI_EXPR_NO_MORE) { + err = SCPI_EXPR_ERROR; } return err; @@ -267,8 +263,7 @@ * @param length length of values arrays * @param dimensions real number of dimensions */ -scpi_expr_result_t SCPI_ExprChannelListEntry(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, int32_t * valuesFrom, int32_t * valuesTo, size_t length, size_t * dimensions) -{ +scpi_expr_result_t SCPI_ExprChannelListEntry(scpi_t * context, scpi_parameter_t * param, int index, scpi_bool_t * isRange, int32_t * valuesFrom, int32_t * valuesTo, size_t length, size_t * dimensions) { lex_state_t lex; int i; scpi_expr_result_t res = SCPI_EXPR_OK; @@ -310,5 +305,11 @@ if (res == SCPI_EXPR_ERROR) { SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR); } + if (res == SCPI_EXPR_NO_MORE) { + if (!scpiLex_IsEos(&lex)) { + res = SCPI_EXPR_ERROR; + SCPI_ErrorPush(context, SCPI_ERROR_EXPRESSION_PARSING_ERROR); + } + } return res; } -- Gitblit v1.9.1