From 36f2d7dab1e65507841067073dd66d72b2dc663c Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周二, 04 12月 2012 17:24:30 +0800 Subject: [PATCH] Correct type refactoryng in README --- scpi/scpi_utils.c | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 206 insertions(+), 16 deletions(-) diff --git a/scpi/scpi_utils.c b/scpi/scpi_utils.c index fb3dd83..4546b35 100644 --- a/scpi/scpi_utils.c +++ b/scpi/scpi_utils.c @@ -34,11 +34,14 @@ * */ -#include "scpi.h" -#include "scpi_utils.h" #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> + +#include "scpi_utils.h" + +static size_t patternSeparatorShortPos(const char * pattern, size_t len); /** * Find the first occurrence in str of a character in set. @@ -48,18 +51,17 @@ * @return */ char * strnpbrk(const char *str, size_t size, const char *set) { - const char *scanp; - long c, sc; - const char * strend = str + size; - - while ((strend != str) && ((c = *str++) != 0)) { - for (scanp = set; (sc = *scanp++) != '\0';) - if (sc == c) - return ((char *) (str - 1)); - } - return (NULL); -} + const char *scanp; + long c, sc; + const char * strend = str + size; + while ((strend != str) && ((c = *str++) != 0)) { + for (scanp = set; (sc = *scanp++) != '\0';) + if (sc == c) + return ((char *) (str - 1)); + } + return (NULL); +} /** * Converts signed 32b integer value to string @@ -105,7 +107,7 @@ * @return number of bytes written to str (without '\0') */ size_t doubleToStr(double val, char * str, size_t len) { - return snprintf(str, len, "%lf", val); + return snprintf(str, len, "%lg", val); } /** @@ -129,7 +131,7 @@ size_t strToDouble(const char * str, double * val) { char * endptr; *val = strtod(str, &endptr); - return endptr - str; + return endptr - str; } /** @@ -150,4 +152,192 @@ } return FALSE; -} \ No newline at end of file +} + +bool_t locateText(const char * str1, size_t len1, char ** str2, size_t * len2) { + size_t i; + int quot = 0; + 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) && !quot && (str1[i] == '"')) { + quot = 1; + continue; + } + + if (strStart < 0) { + strStart = i; + } + + if ((strStop < 0) && quot && (str1[i] == '"')) { + strStop = i; + valid = 1; + continue; + } + + if ((strStop >= 0) && quot && (str1[i] == ',')) { + break; + } + + if ((strStop >= 0) && quot && !isspace(str1[i])) { + valid = 0; + } + + if (!quot && !isspace(str1[i]) && (str1[i] != ',')) { + strStop = i; + } + + if (isspace(str1[i])) { + continue; + } + + if ((strStop >= 0) && (str1[i] == ',')) { + valid = 1; + break; + } + } + + if ((i == len1) && !quot) { + valid = 1; + if (strStop < 0) { + strStop = i; + } else { + strStop++; + } + if (strStart < 0) { + strStart = i; + } + } else if (!quot) { + strStop++; + } + + + if (valid) { + if (str2) { + *str2 = (char *) &str1[strStart]; + } + + if (len2) { + *len2 = strStop - strStart; + } + } + + 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 + * @param len - max search length + * @return number of white spaces + */ +size_t skipWhitespace(const char * cmd, size_t len) { + size_t i; + for (i = 0; i < len; i++) { + if (!isspace(cmd[i])) { + return i; + } + } + return len; +} + + +/** + * 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