diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2007-02-14 18:51:19 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2007-02-14 18:51:19 +0000 |
| commit | 722231f40788d1243bf302227ed7b6fdfeaea492 (patch) | |
| tree | f408767af10da88546a8d2b518601aef67ffdfb0 /src/core | |
| parent | 0ddd9d6e5ebe8cf3fddaf5f017992f0740dd7996 (diff) | |
| download | nginx-722231f40788d1243bf302227ed7b6fdfeaea492.tar.gz nginx-722231f40788d1243bf302227ed7b6fdfeaea492.tar.bz2 | |
ngx_strcasecmp()/ngx_strncasecmp()
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/ngx_conf_file.c | 4 | ||||
| -rw-r--r-- | src/core/ngx_inet.c | 2 | ||||
| -rw-r--r-- | src/core/ngx_string.c | 62 | ||||
| -rw-r--r-- | src/core/ngx_string.h | 28 |
4 files changed, 72 insertions, 24 deletions
diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c index 9e4b30a08..e06315ee5 100644 --- a/src/core/ngx_conf_file.c +++ b/src/core/ngx_conf_file.c @@ -883,10 +883,10 @@ ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) value = cf->args->elts; - if (ngx_strcasecmp(value[1].data, "on") == 0) { + if (ngx_strcasecmp(value[1].data, (u_char *) "on") == 0) { *fp = 1; - } else if (ngx_strcasecmp(value[1].data, "off") == 0) { + } else if (ngx_strcasecmp(value[1].data, (u_char *) "off") == 0) { *fp = 0; } else { diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index 09ff01418..de4cae280 100644 --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -233,7 +233,7 @@ ngx_parse_url(ngx_conf_t *cf, ngx_url_t *u) len = u->url.len; p = u->url.data; - if (ngx_strncasecmp(p, "unix:", 5) == 0) { + if (ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) { #if (NGX_HAVE_UNIX_DOMAIN) diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c index e12edbd74..fe8cfacdd 100644 --- a/src/core/ngx_string.c +++ b/src/core/ngx_string.c @@ -428,6 +428,68 @@ ngx_vsnprintf(u_char *buf, size_t max, const char *fmt, va_list args) } +/* + * We use ngx_strcasecmp()/ngx_strncasecmp() for 7-bit ASCII string only, + * and implement our own ngx_strcasecmp()/ngx_strncasecmp() + * to avoid libc locale overhead. Besides, we use the ngx_uint_t's + * instead of the u_char's, because they are slightly faster. + */ + +ngx_int_t +ngx_strcasecmp(u_char *s1, u_char *s2) +{ + ngx_uint_t c1, c2; + + for ( ;; ) { + c1 = (ngx_uint_t) *s1++; + c2 = (ngx_uint_t) *s2++; + + c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1; + c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2; + + if (c1 == c2) { + + if (c1) { + continue; + } + + return 0; + } + + return c1 - c2; + } +} + + +ngx_int_t +ngx_strncasecmp(u_char *s1, u_char *s2, size_t n) +{ + ngx_uint_t c1, c2; + + while (n) { + c1 = (ngx_uint_t) *s1++; + c2 = (ngx_uint_t) *s2++; + + c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1; + c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2; + + if (c1 == c2) { + + if (c1) { + n--; + continue; + } + + return 0; + } + + return c1 - c2; + } + + return 0; +} + + ngx_int_t ngx_rstrncmp(u_char *s1, u_char *s2, size_t n) { diff --git a/src/core/ngx_string.h b/src/core/ngx_string.h index 670063915..15650009c 100644 --- a/src/core/ngx_string.h +++ b/src/core/ngx_string.h @@ -24,29 +24,12 @@ typedef struct { } ngx_keyval_t; -#define ngx_string(str) { sizeof(str) - 1, (u_char *) str } -#define ngx_null_string { 0, NULL } +#define ngx_string(str) { sizeof(str) - 1, (u_char *) str } +#define ngx_null_string { 0, NULL } -#define ngx_tolower(c) (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c) -#define ngx_toupper(c) (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c) - - -#if (NGX_WIN32) - -#define ngx_strncasecmp(s1, s2, n) \ - strnicmp((const char *) s1, (const char *) s2, n) -#define ngx_strcasecmp(s1, s2) \ - stricmp((const char *) s1, (const char *) s2) - -#else - -#define ngx_strncasecmp(s1, s2, n) \ - strncasecmp((const char *) s1, (const char *) s2, n) -#define ngx_strcasecmp(s1, s2) \ - strcasecmp((const char *) s1, (const char *) s2) - -#endif +#define ngx_tolower(c) (u_char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c) +#define ngx_toupper(c) (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c) #define ngx_strncmp(s1, s2, n) strncmp((const char *) s1, (const char *) s2, n) @@ -128,6 +111,9 @@ u_char * ngx_cdecl ngx_sprintf(u_char *buf, const char *fmt, ...); u_char * ngx_cdecl ngx_snprintf(u_char *buf, size_t max, const char *fmt, ...); u_char *ngx_vsnprintf(u_char *buf, size_t max, const char *fmt, va_list args); +ngx_int_t ngx_strcasecmp(u_char *s1, u_char *s2); +ngx_int_t ngx_strncasecmp(u_char *s1, u_char *s2, size_t n); + ngx_int_t ngx_rstrncmp(u_char *s1, u_char *s2, size_t n); ngx_int_t ngx_rstrncasecmp(u_char *s1, u_char *s2, size_t n); ngx_int_t ngx_memn2cmp(u_char *s1, u_char *s2, size_t n1, size_t n2); |
