From 1e139e410744eb791486dcee0ed4b1eebdf9a515 Mon Sep 17 00:00:00 2001
From: nancy.liao <huihui.liao@greentest.com.cn>
Date: 周四, 24 4月 2025 09:32:54 +0800
Subject: [PATCH] 提交修改

---
 libscpi/src/utils.c |  156 ++++++++++++++++++++++++---------------------------
 1 files changed, 74 insertions(+), 82 deletions(-)

diff --git a/libscpi/src/utils.c b/libscpi/src/utils.c
index bdde1ea..8758917 100644
--- a/libscpi/src/utils.c
+++ b/libscpi/src/utils.c
@@ -1145,107 +1145,99 @@
            ((val & 0xFF00000000000000ull) >> 56);
 }
 
-int parse_pattern(const char* pattern, Segment segments[], int max_segments) {
-    int seg_count = 0;
-    const char* p = pattern;
 
-    while (*p && seg_count < max_segments)
+// 鐢ㄤ簬鎻愬彇骞跺鐞嗛�夐」鐨勫嚱鏁�
+int extract_required_options(const char* pattern, char options[MAX_TAGS][MAX_OPTION_LEN][MAX_OPTION_LEN], int max_tags) {
+    const char* start = strchr(pattern, '<');  // 鏌ユ壘绗竴涓� '<'
+    const char* end = NULL;
+    int tag_count = 0;
+
+    // 澶勭悊 <...> 鍐呯殑閫夐」
+    while (start != NULL && tag_count < max_tags)
     {
-        if (*p == '[')
-        {
-            // 澶勭悊鍙彉娈�
-            segments[seg_count].is_variable = TRUE;
-            // 璺宠繃'['
-            p++;
+        end = strchr(start, '>');  // 鏌ユ壘瀵瑰簲鐨� '>'
 
-            int i = 0;
-            while (*p && *p != ']' && i < sizeof(segments[seg_count].text)-1)
-            {
-                segments[seg_count].text[i++] = toupper(*p++);
-            }
-            segments[seg_count].text[i] = '\0';
-
-            if (*p == ']')
-            {
-                // 璺宠繃']'
-                p++;
-            }
-        }
-        else
-        {
-            // 澶勭悊鍥哄畾娈�
-            segments[seg_count].is_variable = FALSE;
-
-            int i = 0;
-            while (*p && *p != '[' && i < sizeof(segments[seg_count].text)-1)
-            {
-                segments[seg_count].text[i++] = toupper(*p++);
-            }
-            segments[seg_count].text[i] = '\0';
+        if (end == NULL) {
+            break;  // 濡傛灉娌℃湁鎵惧埌 '>'锛屽垯閫�鍑�
         }
 
-        seg_count++;
+        // 鎻愬彇 <...> 涓殑鍐呭
+        int len = end - start - 1;
+        if (len > 0 && len < MAX_OPTION_LEN) {
+            char buffer[MAX_OPTION_LEN];
+            strncpy(buffer, start + 1, len);  // 澶嶅埗 '<' 鍜� '>' 涔嬮棿鐨勫唴瀹�
+            buffer[len] = '\0';  // 缁撴潫绗�
+
+            // 澶勭悊 | 鍒嗛殧绗︼紝鎻愬彇澶氫釜閫夐」
+            char* token = strtok(buffer, "|");
+            int option_count = 0;
+            while (token && option_count < MAX_OPTION_LEN) {
+                // 鍘婚櫎 token 涓殑 "[:", "]" 鍜岀┖鏍�
+                char* p = token;
+                while (*p == ' ' || *p == '[' || *p == ':') p++;  // 鍘婚櫎鍓嶅绌烘牸鍜� [:
+                char* q = p + strlen(p) - 1;
+                while (q > p && (*q == ' ' || *q == ']')) q--;  // 鍘婚櫎灏鹃殢绌烘牸鍜� ]
+                *(q + 1) = '\0';  // 纭繚缁撳熬鏄�'\0'
+
+                // 鎷疯礉閫夐」鍒� options 鏁扮粍
+                if (option_count < MAX_OPTION_LEN) {  // 纭繚涓嶄細瓒婄晫
+                    strncpy(options[tag_count][option_count], p, MAX_OPTION_LEN - 1);
+                    options[tag_count][option_count][MAX_OPTION_LEN - 1] = '\0';  // 纭繚缁撴潫绗�
+                    option_count++;
+                }
+                token = strtok(NULL, "|");
+            }
+        }
+
+        // 绉诲姩鍒颁笅涓�涓� '<' 浣嶇疆锛岀户缁煡鎵�
+        start = strchr(end + 1, '<');
+        tag_count++;
     }
 
-    return seg_count;
+    return tag_count;
 }
 
-// 鍖归厤鍛戒护涓庢ā寮�
-bool match_command(const char* command, Segment segments[], int seg_count)
-{
-    const char* cmd = command;
-    int current_seg = 0;
+// 鐢ㄤ簬妫�鏌ヨ緭鍏ユ槸鍚﹁兘鍖归厤姣忎竴缁勯�夐」
+int match_input_to_options(const char* input, char options[MAX_TAGS][MAX_OPTION_LEN][MAX_OPTION_LEN], int num_tags) {
+    char input_copy[MAX_INPUT_LEN];
+    strncpy(input_copy, input, MAX_INPUT_LEN - 1);
+    input_copy[MAX_INPUT_LEN - 1] = '\0';  // 纭繚缁撳熬鏄�'\0'
 
-    while (*cmd && current_seg < seg_count)
-    {
-        // 璺宠繃鍛戒护涓殑鍒嗛殧绗︼紙鍐掑彿锛�
-        if (*cmd == ':')
-        {
-            cmd++;
-            // 妯″紡涓篃搴旇鏈夊搴旂殑鍒嗛殧绗�
-            if (segments[current_seg].text[0] != ':')
-            {
-                return FALSE;
+    // 鎷嗗垎杈撳叆瀛楃涓诧紝鎸� ":" 鍒嗗壊
+    char* token = strtok(input_copy, ":");
+    int group_idx = 0;
+
+    // 瀵规瘡涓�缁勮繘琛屽尮閰�
+    while (token != NULL && group_idx < num_tags) {
+        int match_found = 0;
+        // 妫�鏌ュ綋鍓嶇粍鐨勬瘡涓�夐」鏄惁涓庤緭鍏ョ殑 token 鍖归厤
+        printf("Checking input token: '%s' against group %d options\n", token, group_idx + 1); // Debug info
+        for (int i = 0; i < MAX_OPTION_LEN && options[group_idx][i][0] != '\0'; i++) {
+            printf("  Comparing with option: '%s'\n", options[group_idx][i]); // Debug info
+            if (strcmp(options[group_idx][i], token) == 0) {
+                match_found = 1;
+                break;
             }
-            continue;
         }
 
-        // 鑾峰彇褰撳墠娈甸暱搴�
-        size_t seg_len = strlen(segments[current_seg].text);
-
-        if (segments[current_seg].is_variable)
-        {
-            // 鍙彉娈� - 璺宠繃瀵瑰簲闀垮害鐨勫瓧绗�
-            int i = 0;
-            while (*cmd && *cmd != ':' && i < seg_len)
-            {
-                cmd++;
-                i++;
-            }
-        } else
-        {
-            // 鍥哄畾娈� - 蹇呴』绮剧‘鍖归厤
-            if (strncasecmp(cmd, segments[current_seg].text, seg_len) != 0)
-            {
-                return FALSE;
-            }
-            cmd += seg_len;
+        // 濡傛灉褰撳墠缁勭殑鏌愪釜閫夐」娌℃湁鍖归厤涓婏紝杩斿洖 false
+        if (!match_found) {
+            return 0;  // 涓嶅尮閰�
         }
 
-        current_seg++;
+        // 澶勭悊涓嬩竴涓緭鍏ラ儴鍒�
+        token = strtok(NULL, ":");
+        group_idx++;
     }
 
-    // 妫�鏌ユ槸鍚﹀鐞嗗畬鎵�鏈夊懡浠ゅ拰鎵�鏈夋
-    return (*cmd == '\0') && (current_seg == seg_count);
+    return (group_idx == num_tags);
 }
 
-// 娴嬭瘯鍑芥暟
+
+// 娴嬭瘯鍖归厤鍑芥暟
 bool test_match(const char* pattern, const char* command)
 {
-    Segment segments[16];
-    int seg_count = parse_pattern(pattern, segments, 16);
-    return (match_command(command, segments, seg_count));
-
+    char options[MAX_TAGS][MAX_OPTION_LEN][MAX_OPTION_LEN] = { {{0}} };
+    int num_tags = extract_required_options(pattern, options, MAX_TAGS);
+    return match_input_to_options(command, options, num_tags);
 }
-
-

--
Gitblit v1.9.1