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