From a10c0e97ef3e2792574e143c8fd9c6b9f4784381 Mon Sep 17 00:00:00 2001 From: localvar Date: Sat, 24 Aug 2019 08:14:41 +0800 Subject: [PATCH] fix strtolower --- src/inc/tutil.h | 2 +- src/util/src/tutil.c | 43 +++++++++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/inc/tutil.h b/src/inc/tutil.h index 901810c44e..a9de168fae 100644 --- a/src/inc/tutil.h +++ b/src/inc/tutil.h @@ -184,7 +184,7 @@ char *strnchr(char *haystack, char needle, int32_t len, bool skipquote); char **strsplit(char *src, const char *delim, int32_t *num); -void strtolower(char *dst, const char *src); +char* strtolower(char *dst, const char *src); int64_t strnatoi(char *num, int32_t len); diff --git a/src/util/src/tutil.c b/src/util/src/tutil.c index f9bd6aace4..d2865ec31d 100644 --- a/src/util/src/tutil.c +++ b/src/util/src/tutil.c @@ -140,28 +140,31 @@ char *strnchr(char *haystack, char needle, int32_t len, bool skipquote) { return NULL; } -void strtolower(char *dst, const char *z) { - int quote = 0; - char *str = z; - if (dst == NULL) { - return; +char* strtolower(char *dst, const char *src) { + int esc = 0; + char quote = 0, *p = dst, c; + + assert(dst != NULL); + + for (c = *src++; c; c = *src++) { + if (esc) { + esc = 0; + } else if (quote) { + if (c == '\\') { + esc = 1; + } else if (c == quote) { + quote = 0; + } + } else if (c >= 'A' && c <= 'Z') { + c -= 'A' - 'a'; + } else if (c == '\'' || c == '"') { + quote = c; + } + *p++ = c; } - while (*str) { - if (*str == '\'' || *str == '"') { - quote = quote ^ 1; - } - - if ((!quote) && (*str >= 'A' && *str <= 'Z')) { - *dst++ = *str | 0x20; - } else { - *dst++ = *str; - } - - str++; - } - - *dst = 0; + *p = 0; + return dst; } char *paGetToken(char *string, char **token, int32_t *tokenLen) {