| | |
| | | #include <string.h> |
| | | #include <ctype.h> |
| | | |
| | | #include "utils.h" |
| | | #include "utils_private.h" |
| | | |
| | | static size_t patternSeparatorShortPos(const char * pattern, size_t len); |
| | | static size_t patternSeparatorPos(const char * pattern, size_t len); |
| | |
| | | * @param len2 |
| | | * @return TRUE if len1==len2 and "len" characters of both strings are equal |
| | | */ |
| | | bool_t compareStr(const char * str1, size_t len1, const char * str2, size_t len2) { |
| | | scpi_bool_t compareStr(const char * str1, size_t len1, const char * str2, size_t len2) { |
| | | if (len1 != len2) { |
| | | return FALSE; |
| | | } |
| | |
| | | * @param str_len |
| | | * @return |
| | | */ |
| | | bool_t matchPattern(const char * pattern, size_t pattern_len, const char * str, size_t str_len) { |
| | | scpi_bool_t matchPattern(const char * pattern, size_t pattern_len, const char * str, size_t str_len) { |
| | | int pattern_sep_pos_short = patternSeparatorShortPos(pattern, pattern_len); |
| | | return compareStr(pattern, pattern_len, str, str_len) || |
| | | compareStr(pattern, pattern_sep_pos_short, str, str_len); |
| | |
| | | |
| | | /** |
| | | * 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 |
| | | */ |
| | | bool_t matchCommand(const char * pattern, const char * cmd, size_t len) { |
| | | bool_t result = FALSE; |
| | | scpi_bool_t matchCommand(const char * pattern, const char * cmd, size_t len) { |
| | | scpi_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); |
| | |
| | | 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++; |
| | |
| | | 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--; |