From b97d4493b3c997477b85a35de0a4ffa15cf742eb Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周三, 23 10月 2013 22:46:57 +0800 Subject: [PATCH] Correct optional command pattern matching --- libscpi/test/test_scpi_utils.c | 8 ++++++++ libscpi/src/utils.c | 16 +++++++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/libscpi/src/utils.c b/libscpi/src/utils.c index 78b7efe..5007ebc 100644 --- a/libscpi/src/utils.c +++ b/libscpi/src/utils.c @@ -243,7 +243,7 @@ /** * Compare pattern and command - * @param pattern + * @param pattern eg. [:MEASure]:VOLTage:DC? * @param cmd - command * @param len - max search length * @return TRUE if pattern matches, FALSE otherwise @@ -252,6 +252,7 @@ bool_t result = FALSE; int leftFlag = 0; // flag for '[' on left int rightFlag = 0; // flag for ']' on right + int cmd_sep_pos = 0; const char * pattern_ptr = pattern; int pattern_len = strlen(pattern); @@ -261,7 +262,7 @@ size_t cmd_len = SCPI_strnlen(cmd, len); const char * cmd_end = cmd + cmd_len; - /* TODO: now support optional keywords in pattern style, e.g. [:MEASure]:VOLTage:DC? */ + /* now support optional keywords in pattern style, e.g. [:MEASure]:VOLTage:DC? */ if (pattern_ptr[0] == '[') { // skip first '[' pattern_len--; pattern_ptr++; @@ -272,16 +273,17 @@ pattern_ptr++; } - /* errornouse ":*IDN?" is handled in parser */ if (cmd_ptr[0] == ':') { - cmd_len--; - cmd_ptr++; + /* handle errornouse ":*IDN?" */ + if((cmd_len >= 2) && (cmd_ptr[1] != '*')) { + cmd_len--; + cmd_ptr++; + } } while (1) { int pattern_sep_pos = patternSeparatorPos(pattern_ptr, pattern_end - pattern_ptr); - int cmd_sep_pos; - + if ((leftFlag > 0) && (rightFlag > 0)) { leftFlag--; rightFlag--; diff --git a/libscpi/test/test_scpi_utils.c b/libscpi/test/test_scpi_utils.c index c54d79d..ac07ce0 100644 --- a/libscpi/test/test_scpi_utils.c +++ b/libscpi/test/test_scpi_utils.c @@ -281,6 +281,14 @@ TEST_MATCH_COMMAND("ABc[:BCd][:CDe][:DEf]?", "ab:cd", FALSE); // test optional keyword TEST_MATCH_COMMAND("ABc[:BCd][:CDe][:DEf]?", "ab:de", FALSE); // test optional keyword TEST_MATCH_COMMAND("ABc[:BCd][:CDe][:DEf]?", "ab", FALSE); // test optional keyword + TEST_MATCH_COMMAND("*IDN?", "idn", FALSE); // common command + TEST_MATCH_COMMAND("*IDN?", "idn?", FALSE); // common command + TEST_MATCH_COMMAND("*IDN?", "*idn", FALSE); // common command + TEST_MATCH_COMMAND("*IDN?", "*idn?", TRUE); // common command + TEST_MATCH_COMMAND("*IDN?", ":idn", FALSE); // common command + TEST_MATCH_COMMAND("*IDN?", ":idn?", FALSE); // common command + TEST_MATCH_COMMAND("*IDN?", ":*idn", FALSE); // common command + TEST_MATCH_COMMAND("*IDN?", ":*idn?", FALSE); // common command } int main() { -- Gitblit v1.9.1