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/inc/scpi/externinterface.h | 6 +++++- libscpi/inc/scpi/types.h | 1 - libscpi/src/parser.c | 10 ++++++---- libscpi/inc/scpi/parser.h | 2 +- CMakeLists.txt | 2 +- libscpi/src/externinterface.cpp | 25 +++++++++++++++++++++---- 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 58b4f6d..e2b7e79 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/libscpi/inc>" ) -target_link_libraries(scpi_static PRIVATE Qt::Core) + project(scpi_static LANGUAGES CXX) diff --git a/libscpi/inc/scpi/externinterface.h b/libscpi/inc/scpi/externinterface.h index 9fc8280..d38a740 100644 --- a/libscpi/inc/scpi/externinterface.h +++ b/libscpi/inc/scpi/externinterface.h @@ -1,6 +1,5 @@ #ifndef EXTERNINTERFACE_H #define EXTERNINTERFACE_H - //杩欎釜绫荤敤鍦ㄥ仛SCPI鍛戒护鐨勮娉曞垎鏋�,浼氬皢璇嶆硶鍖归厤鐨勭粨鏋滆繑鍥炵粰SCPI搴� #ifdef __cplusplus extern "C" @@ -20,6 +19,8 @@ { CSegment* segments; int segments_count; + char* commandData; + } CPatternResult; @@ -27,7 +28,10 @@ void parse_pattern_global(const char* pattern); int get_pattern_count(); void clear_global_patterns(); +void clearCurrentGroup(); +void setCurrentIndex(int index); +char* currentPattern(); #ifdef __cplusplus } diff --git a/libscpi/inc/scpi/parser.h b/libscpi/inc/scpi/parser.h index 5cade1e..de89f7c 100644 --- a/libscpi/inc/scpi/parser.h +++ b/libscpi/inc/scpi/parser.h @@ -64,7 +64,7 @@ #if USE_DEVICE_DEPENDENT_ERROR_INFORMATION && !USE_MEMORY_ALLOCATION_FREE void SCPI_InitHeap(scpi_t * context, char * error_info_heap, size_t error_info_heap_length); #endif - scpi_bool_t findCommandHeader(scpi_t * context, const char * header,int len); + scpi_bool_t findCommandHeader(scpi_t * context, const char * header); scpi_bool_t SCPI_Input(scpi_t * context, const char * data, int len); scpi_bool_t SCPI_Parse(scpi_t * context, char * data, int len); diff --git a/libscpi/inc/scpi/types.h b/libscpi/inc/scpi/types.h index d2fe6d2..c595f68 100644 --- a/libscpi/inc/scpi/types.h +++ b/libscpi/inc/scpi/types.h @@ -475,7 +475,6 @@ int SCPIerror; //澧炲姞浜嗕竴涓懡浠ゅ垪琛ㄧ殑闀垮害 闃叉闈炴硶瓒婄晫 int cmdlistSize; - }; enum _scpi_array_format_t { diff --git a/libscpi/src/externinterface.cpp b/libscpi/src/externinterface.cpp index 15153ed..1713166 100644 --- a/libscpi/src/externinterface.cpp +++ b/libscpi/src/externinterface.cpp @@ -8,7 +8,12 @@ #include <sstream> CPatternResult* g_pattern_results = new (std::nothrow) CPatternResult(); + int g_pattern_count = 0; + +//static std::vector<std::string_view> currentCommandGroup; + +static int currentIndex; class Segment { public: @@ -221,8 +226,12 @@ } }; +char* currentPattern() +{ + return g_pattern_results[currentIndex].commandData; +} // 鍏ㄥ眬绠$悊鍑芥暟瀹炵幇 -void add_pattern_to_global(const std::vector<Segment>& segments) +void add_pattern_to_global(const char* pattern, const std::vector<Segment>& segments) { // 閲嶆柊鍒嗛厤鍐呭瓨 CPatternResult* new_results = new CPatternResult[g_pattern_count + 1]; @@ -237,7 +246,6 @@ CPatternResult& new_item = new_results[g_pattern_count]; new_item.segments_count = static_cast<int>(segments.size()); new_item.segments = new CSegment[segments.size()]; - for (size_t i = 0; i < segments.size(); ++i) { const auto& seg = segments[i]; @@ -281,14 +289,23 @@ int get_pattern_count() { return g_pattern_count; } - +void clearCurrentGroup() +{ + currentIndex = -1; + //currentCommandGroup.clear(); +} void parse_pattern_global(const char* pattern) { auto segments = PatternParser::extract_all_segments(pattern); - add_pattern_to_global(segments); + add_pattern_to_global(pattern,segments); } +void setCurrentIndex(int index) +{ + currentIndex = index; +} +//pattern_index 鍖归厤缁勭殑涓嬫爣 int match_segments_global(const char* input, int pattern_index) { if (pattern_index < 0 || pattern_index >= g_pattern_count) diff --git a/libscpi/src/parser.c b/libscpi/src/parser.c index 8530871..5e34d1c 100644 --- a/libscpi/src/parser.c +++ b/libscpi/src/parser.c @@ -57,7 +57,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); + return context->interface->write(context, data, len); } else { return 0; } @@ -180,7 +180,7 @@ * @param context * @result TRUE if context->paramlist is filled with correct values */ -scpi_bool_t findCommandHeader(scpi_t * context, const char * header,int len) +scpi_bool_t findCommandHeader(scpi_t * context, const char * header) { //鍙傛暟宸茬粡鍦ㄥ墠闈㈤儴鍒嗚В鏋愬畬鎴�,鍖归厤鍛戒护鏃跺氨涓嶅啀闇�瑕佸弬鏁伴儴鍒� 灏嗗懡浠ゆ媶闄ゅ嵆鍙� char *header_copy = strdup(header); @@ -190,12 +190,13 @@ { 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; + context->SCPIerror = RETURN_NotFind; return FALSE; } @@ -245,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; @@ -361,6 +362,7 @@ */ 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; -- Gitblit v1.9.1