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