From e098c2b8d02db042d701480760ee664eae5c0ce1 Mon Sep 17 00:00:00 2001
From: Jan Breuer <jan.breuer@jaybee.cz>
Date: 周二, 22 10月 2013 18:04:54 +0800
Subject: [PATCH] Merge strncasecmp detection from 'master'

---
 libscpi/inc/scpi/config.h |   26 ++++++++++++++++++++++++--
 libscpi/src/utils.h       |    4 ++++
 libscpi/src/utils.c       |   18 ++++++++++++++++++
 3 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/libscpi/inc/scpi/config.h b/libscpi/inc/scpi/config.h
index 2529e65..703465d 100644
--- a/libscpi/inc/scpi/config.h
+++ b/libscpi/inc/scpi/config.h
@@ -41,10 +41,26 @@
 extern "C" {
 #endif
 
+/* Compiler specific */
+/* 8bit PIC - PIC16, etc */
+#if defined(_MPC_)
+#define HAVE_STRNLEN            0
+#define HAVE_STRNCASECMP        0
+#define HAVE_STRNICMP           1
+#endif
+
 /* PIC24 */
 #if defined(__C30__)
 #define HAVE_STRNLEN            0
 #define HAVE_STRNCASECMP        0
+#define HAVE_STRNICMP           0
+#endif
+
+/* PIC32mx */
+#if defined(__C32__)
+#define HAVE_STRNLEN            0
+#define HAVE_STRNCASECMP        1
+#define HAVE_STRNICMP           0
 #endif
 
 /* ======== test strnlen ======== */
@@ -55,6 +71,10 @@
 #ifndef HAVE_STRNCASECMP
 #define HAVE_STRNCASECMP        1
 #endif
+/* ======== test strnicmp ======== */
+#ifndef HAVE_STRNICMP
+#define HAVE_STRNICMP           0
+#endif
 
 /* define local macros depending on existance of strnlen */
 #if HAVE_STRNLEN
@@ -63,11 +83,13 @@
 #define SCPI_strnlen(s, l)	BSD_strnlen((s), (l))
 #endif
 
-/* define local macros depending on existance of strncasecmp */
+/* define local macros depending on existance of strncasecmp and strnicmp */
 #if HAVE_STRNCASECMP
 #define SCPI_strncasecmp(s1, s2, l)	strncasecmp((s1), (s2), (l))
+#elif HAVE_STRNICMP
+#define SCPI_strncasecmp(s1, s2, l)     strnicmp((s1), (s2), (l))
 #else
-#define SCPI_strncasecmp(s1, s2, l)	strcasecmp((s1), (s2))
+#define SCPI_strncasecmp(s1, s2, l)	OUR_strncasecmp((s1), (s2), (l))
 #endif
 
 #ifdef	__cplusplus
diff --git a/libscpi/src/utils.c b/libscpi/src/utils.c
index f8e09fa..78b7efe 100644
--- a/libscpi/src/utils.c
+++ b/libscpi/src/utils.c
@@ -391,3 +391,21 @@
 }
 #endif
 
+#if !HAVE_STRNCASECMP && !HAVE_STRNICMP
+int OUR_strncasecmp(const char *s1, const char *s2, size_t n) {
+    unsigned char c1, c2;
+
+    for(; n != 0; n--) {
+        c1 = tolower((unsigned char)*s1++);
+        c2 = tolower((unsigned char)*s2++);
+        if (c1 != c2) {
+            return c1 - c2;
+        }
+        if (c1 = '\0') {
+            return 0;
+        }
+    }
+    return 0;
+}
+#endif
+
diff --git a/libscpi/src/utils.h b/libscpi/src/utils.h
index f7c5c5b..07a2a0e 100644
--- a/libscpi/src/utils.h
+++ b/libscpi/src/utils.h
@@ -68,6 +68,10 @@
     size_t BSD_strnlen(const char *s, size_t maxlen);
 #endif
 
+#if !HAVE_STRNCASECMP && !HAVE_STRNICMP
+    int OUR_strncasecmp(const char *s1, const char *s2, size_t n);
+#endif
+
 #define min(a, b)  (((a) < (b)) ? (a) : (b))
 #define max(a, b)  (((a) > (b)) ? (a) : (b))
 

--
Gitblit v1.9.1