From 2df8ee6c6f411e5fa0b774874e759c5e7b045121 Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周二, 27 11月 2012 19:52:23 +0800 Subject: [PATCH] Units parsing completition --- scpi/scpi_utils.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 98 insertions(+), 2 deletions(-) diff --git a/scpi/scpi_utils.c b/scpi/scpi_utils.c index 0815a8c..94aaf8f 100644 --- a/scpi/scpi_utils.c +++ b/scpi/scpi_utils.c @@ -41,6 +41,8 @@ #include <string.h> #include <ctype.h> +static size_t patternSeparatorShortPos(const char * pattern, size_t len); + /** * Find the first occurrence in str of a character in set. * @param str @@ -152,7 +154,7 @@ return FALSE; } -bool_t locateStr(const char * str1, size_t len1, char ** str2, size_t * len2) { +bool_t locateText(const char * str1, size_t len1, char ** str2, size_t * len2) { size_t i; int quot = 0; int32_t strStart = -1; @@ -230,6 +232,68 @@ return valid; } +bool_t locateStr(const char * str1, size_t len1, char ** str2, size_t * len2) { + size_t i; + int32_t strStart = -1; + int32_t strStop = -1; + int valid = 0; + + + for (i = 0; i < len1; i++) { + if ((strStart < 0) && isspace(str1[i])) { + continue; + } + + if (strStart < 0) { + strStart = i; + } + + if (!isspace(str1[i]) && (str1[i] != ',')) { + strStop = i; + } + + if (isspace(str1[i])) { + continue; + } + + if (str1[i] == ',') { + valid = 1; + + if (strStop < 0) { + strStop = i; + } + break; + } + } + + if (i == len1) { + valid = 1; + if (strStop < 0) { + strStop = i; + } else { + strStop++; + } + if (strStart < 0) { + strStart = i; + } + } else { + strStop++; + } + + + if (valid) { + if (str2) { + *str2 = (char *) &str1[strStart]; + } + + if (len2) { + *len2 = strStop - strStart; + } + } + + return valid; +} + /** * Count white spaces from the beggining * @param cmd - command @@ -244,4 +308,36 @@ } } return len; -} \ No newline at end of file +} + + +/** + * Pattern is composed from upper case an lower case letters. This function + * search the first lowercase letter + * @param pattern + * @param len - max search length + * @return position of separator or len + */ +size_t patternSeparatorShortPos(const char * pattern, size_t len) { + size_t i; + for (i = 0; (i < len) && pattern[i]; i++) { + if (islower(pattern[i])) { + return i; + } + } + return i; +} + +/** + * Match pattern and str. Pattern is in format UPPERCASElowercase + * @param pattern + * @param pattern_len + * @param str + * @param str_len + * @return + */ +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); +} -- Gitblit v1.9.1