Jan Breuer
2012-11-27 11ffa4398643ff42bd5a1b9d887992cc789a3468
scpi/scpi_utils.c
@@ -39,6 +39,9 @@
#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.
@@ -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;
}
}
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);
}