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