Jan Breuer
2015-10-16 e816026faa1ae11f0e9d26d27f420a304d4ad210
libscpi/src/utils.c
@@ -4,7 +4,7 @@
 * Copyright (c) 2012 Jan Breuer
 *
 * All Rights Reserved
 *
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
@@ -13,7 +13,7 @@
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@@ -30,10 +30,10 @@
/**
 * @file   scpi_utils.c
 * @date   Thu Nov 15 10:58:45 UTC 2012
 *
 *
 * @brief  Conversion routines and string manipulation routines
 *
 *
 *
 *
 */
#include <stdio.h>
@@ -53,7 +53,7 @@
 * @param str
 * @param size
 * @param set
 * @return
 * @return
 */
char * strnpbrk(const char *str, size_t size, const char *set) {
    const char *scanp;
@@ -74,7 +74,7 @@
 * @param str   converted textual representation
 * @param len   string buffer length
 * @param base  output base
 * @param sign
 * @param sign
 * @return number of bytes written to str (without '\0')
 */
size_t UInt32ToStrBaseSign(uint32_t val, char * str, size_t len, int8_t base, scpi_bool_t sign) {
@@ -162,7 +162,7 @@
 * @param str   converted textual representation
 * @param len   string buffer length
 * @param base  output base
 * @param sign
 * @param sign
 * @return number of bytes written to str (without '\0')
 */
size_t UInt64ToStrBaseSign(uint64_t val, char * str, size_t len, int8_t base, scpi_bool_t sign) {
@@ -475,7 +475,7 @@
 * @param pattern_len
 * @param str
 * @param str_len
 * @return
 * @return
 */
scpi_bool_t matchPattern(const char * pattern, size_t pattern_len, const char * str, size_t str_len, int32_t * num) {
    int pattern_sep_pos_short;
@@ -508,8 +508,7 @@
#define SKIP_CMD(n) do {cmd_ptr += (n);  cmd_len -= (n);} while(0)
    scpi_bool_t result = FALSE;
    int leftFlag = 0; // flag for '[' on left
    int rightFlag = 0; // flag for ']' on right
    int brackets = 0;
    int cmd_sep_pos = 0;
    size_t numbers_idx = 0;
@@ -534,7 +533,7 @@
    /* now support optional keywords in pattern style, e.g. [:MEASure]:VOLTage:DC? */
    if (pattern_ptr[0] == '[') { // skip first '['
        SKIP_PATTERN(1);
        leftFlag++;
        brackets++;
    }
    if (pattern_ptr[0] == ':') { // skip first ':'
        SKIP_PATTERN(1);
@@ -554,10 +553,6 @@
    while (1) {
        int pattern_sep_pos = patternSeparatorPos(pattern_ptr, pattern_len);
        if ((leftFlag > 0) && (rightFlag > 0)) {
            leftFlag--;
            rightFlag--;
        }
        cmd_sep_pos = cmdSeparatorPos(cmd_ptr, cmd_len);
        if ((pattern_sep_pos > 0) && pattern_ptr[pattern_sep_pos - 1] == '#') {
@@ -595,16 +590,16 @@
                    pattern_sep_pos = patternSeparatorPos(pattern_ptr, pattern_len);
                    switch (pattern_ptr[pattern_sep_pos]) {
                        case '[':
                            leftFlag++;
                            brackets++;
                            break;
                        case ']':
                            leftFlag--;
                            brackets--;
                            break;
                        default:
                            break;
                    }
                    SKIP_PATTERN(pattern_sep_pos + 1);
                    if (leftFlag == 0) {
                    if (brackets == 0) {
                        if ((pattern_len > 0) && (pattern_ptr[0] == '[')) {
                            continue;
                        } else {
@@ -630,14 +625,14 @@
                    && (pattern_ptr[1] == ':')) {
                SKIP_PATTERN(2); // for skip '[' in "[:"
                SKIP_CMD(1);
                leftFlag++;
                brackets++;
            } else if ((pattern_len > 1)
                    && (pattern_ptr[1] == cmd_ptr[0])
                    && (pattern_ptr[0] == ']')
                    && (pattern_ptr[1] == ':')) {
                SKIP_PATTERN(2); // for skip ']' in "]:"
                SKIP_CMD(1);
                rightFlag++;
                brackets--;
            } else if ((pattern_len > 2)
                    && (pattern_ptr[2] == cmd_ptr[0])
                    && (pattern_ptr[0] == ']')
@@ -645,8 +640,8 @@
                    && (pattern_ptr[2] == ':')) {
                SKIP_PATTERN(3); // for skip '][' in "][:"
                SKIP_CMD(1);
                leftFlag++;
                rightFlag++;
                //brackets++;
                //brackets--;
            } else {
                result = FALSE;
                break;
@@ -655,13 +650,13 @@
            SKIP_PATTERN(pattern_sep_pos);
            if ((pattern_ptr[0] == ']') && (pattern_ptr[1] == ':')) {
                SKIP_PATTERN(2); // for skip ']' in "]:" , pattern_ptr continue, while cmd_ptr remain unchanged
                rightFlag++;
                brackets--;
            } else if ((pattern_len > 2) && (pattern_ptr[0] == ']')
                    && (pattern_ptr[1] == '[')
                    && (pattern_ptr[2] == ':')) {
                SKIP_PATTERN(3); // for skip ']' in "][:" , pattern_ptr continue, while cmd_ptr remain unchanged
                leftFlag++;
                rightFlag++;
                //brackets++;
                //brackets--;
            } else {
                result = FALSE;
                break;