From e7d3092dd149ce455eaa934cc63104b6273302f5 Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周一, 22 2月 2016 08:19:09 +0800 Subject: [PATCH] Add all possible units from IEEE488.2 to address some points of #26 --- libscpi/src/expression.c | 38 ++++++++++++++++++++------------------ 1 files changed, 20 insertions(+), 18 deletions(-) diff --git a/libscpi/src/expression.c b/libscpi/src/expression.c index c70d244..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; @@ -143,9 +140,9 @@ res = SCPI_ExprNumericListEntry(context, param, index, &range, ¶mFrom, ¶mTo); if (res == SCPI_EXPR_OK) { *isRange = range; - SCPI_ParamToInt(context, ¶mFrom, valueFrom); + SCPI_ParamToInt32(context, ¶mFrom, valueFrom); if (range) { - SCPI_ParamToInt(context, ¶mTo, valueTo); + SCPI_ParamToInt32(context, ¶mTo, valueTo); } } @@ -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; @@ -248,8 +242,11 @@ *dimensions = fromDimensions; } else { *isRange = FALSE; + *dimensions = fromDimensions; return SCPI_EXPR_OK; } + } else if (err == SCPI_EXPR_NO_MORE) { + err = SCPI_EXPR_ERROR; } return err; @@ -266,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; @@ -309,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