| | |
| | | #include <stdio.h> |
| | | #include <stdlib.h> |
| | | #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. |
| | |
| | | * @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 |
| | |
| | | * @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); |
| | | } |
| | | |
| | | /** |
| | |
| | | size_t strToDouble(const char * str, double * val) { |
| | | char * endptr; |
| | | *val = strtod(str, &endptr); |
| | | return endptr - str; |
| | | return endptr - str; |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | return FALSE; |
| | | } |
| | | } |
| | | |
| | | 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); |
| | | } |