From 77a92c3204b95eaf2870605718b9099ab6ece56a Mon Sep 17 00:00:00 2001 From: nancy.liao <huihui.liao@greentest.com.cn> Date: 周一, 26 5月 2025 08:41:11 +0800 Subject: [PATCH] 匹配时添加了一个当前索引项 --- libscpi/src/parser.c | 47 +++++++++++++++++++++++++++++++++-------------- 1 files changed, 33 insertions(+), 14 deletions(-) diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c index 37ca85c..5e34d1c 100644 --- a/libscpi/src/parser.c +++ b/libscpi/src/parser.c @@ -37,6 +37,7 @@ #include <ctype.h> #include <string.h> +#include "scpi/externinterface.h" #include "scpi/config.h" #include "scpi/parser.h" @@ -45,7 +46,7 @@ #include "scpi/error.h" #include "scpi/constants.h" #include "scpi/utils.h" - +#include "scpi/externinterface.h" /** * Write data to SCPI output * @param context @@ -55,6 +56,7 @@ */ static size_t writeData(scpi_t * context, const char * data, size_t len) { if ((len > 0) && (data != NULL)) { + return 0; return context->interface->write(context, data, len); } else { return 0; @@ -125,7 +127,8 @@ */ //璐熷懡浠ゅ洖璋冪殑鎵ц銆佸弬鏁板鐞嗗拰閿欒绠$悊 -static scpi_bool_t processCommand(scpi_t * context) { +static scpi_bool_t processCommand(scpi_t * context) +{ const scpi_command_t * cmd = context->param_list.cmd; lex_state_t * state = &context->param_list.lex_state; scpi_bool_t result = TRUE; @@ -177,17 +180,23 @@ * @param context * @result TRUE if context->paramlist is filled with correct values */ -static scpi_bool_t findCommandHeader(scpi_t * context, const char * header, int len) { - int32_t i; - const scpi_command_t * cmd; +scpi_bool_t findCommandHeader(scpi_t * context, const char * header) +{ + //鍙傛暟宸茬粡鍦ㄥ墠闈㈤儴鍒嗚В鏋愬畬鎴�,鍖归厤鍛戒护鏃跺氨涓嶅啀闇�瑕佸弬鏁伴儴鍒� 灏嗗懡浠ゆ媶闄ゅ嵆鍙� + char *header_copy = strdup(header); + char *first_part = strtok(header_copy, " "); - for (i = 0; context->cmdlist[i].pattern != NULL; i++) { - cmd = &context->cmdlist[i]; - if (matchCommand(cmd->pattern, header, len, NULL, 0, 0)) { - context->param_list.cmd = cmd; + for(int i=0;i<get_pattern_count();i++) + { + if( match_segments_global(first_part,i) ) + { + setCurrentIndex(i); + context->param_list.cmd = &context->cmdlist[i]; + free(header_copy); return TRUE; } } + context->SCPIerror = RETURN_NotFind; return FALSE; } @@ -229,6 +238,7 @@ if (state->programHeader.type == SCPI_TOKEN_INVALID) { SCPI_ErrorPush(context, SCPI_ERROR_INVALID_CHARACTER); + context->SCPIerror = RETURN_IllegalCommand; result = FALSE; } else if (state->programHeader.len > 0) @@ -236,7 +246,7 @@ //鍛戒护鏈夋晥寮�濮嬪鐞� composeCompoundCommand(&cmd_prev, &state->programHeader); //鏌ユ壘鍛戒护鍚庡苟涓旇缃В鏋愮姸鎬佸苟涓旀墽琛屽懡浠� - if (findCommandHeader(context, state->programHeader.ptr, state->programHeader.len)) { + if (findCommandHeader(context, state->programHeader.ptr)) { context->param_list.lex_state.buffer = state->programData.ptr; context->param_list.lex_state.pos = context->param_list.lex_state.buffer; @@ -254,6 +264,7 @@ size_t r2 = r; while (r2 > 0 && (data[r2 - 1] == '\r' || data[r2 - 1] == '\n')) r2--; SCPI_ErrorPushEx(context, SCPI_ERROR_UNDEFINED_HEADER, data, r2); + context->SCPIerror = RETURN_UnDefine; result = FALSE; } } @@ -310,6 +321,8 @@ context->buffer.data = input_buffer; context->buffer.length = input_buffer_length; context->buffer.position = 0; + + SCPI_ErrorInit(context, error_queue_data, error_queue_size); } @@ -347,7 +360,9 @@ data锛氳緭鍏ョ殑鏁版嵁 len锛氳緭鍏ユ暟鎹殑闀垮害 */ -scpi_bool_t SCPI_Input(scpi_t * context, const char * data, int len) { +scpi_bool_t SCPI_Input(scpi_t * context, const char * data, int len) +{ + clearCurrentGroup(); scpi_bool_t result = FALSE; size_t totcmdlen = 0; int cmdlen = 0; @@ -371,7 +386,8 @@ context->buffer.position = 0; context->buffer.data[context->buffer.position] = 0; SCPI_ErrorPush(context, SCPI_ERROR_INPUT_BUFFER_OVERRUN); - return FALSE; + context->SCPIerror = RETURN_LengthOverFlow; + return result; } memcpy(&context->buffer.data[context->buffer.position], data, len); context->buffer.position += len; @@ -1050,6 +1066,9 @@ return result; } + + + /** * Read signed/unsigned 32 bit integer parameter * @param context @@ -1479,8 +1498,8 @@ */ //璇嗗埆瀹屾暣鐨凷CPI鍛戒护 int scpiParser_detectProgramMessageUnit(scpi_parser_state_t * state, char * buffer, int len) { - lex_state_t lex_state; - scpi_token_t tmp; + lex_state_t lex_state = {}; + scpi_token_t tmp = {}; int result = 0; // 鍒濆鍖栬瘝娉曞垎鏋� lex_state.buffer = lex_state.pos = buffer; -- Gitblit v1.9.1