10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru #ifndef _NXT_STRING_H_INCLUDED_ 80Sigor@sysoev.ru #define _NXT_STRING_H_INCLUDED_ 90Sigor@sysoev.ru 100Sigor@sysoev.ru 110Sigor@sysoev.ru #define \ 120Sigor@sysoev.ru nxt_lowcase(c) \ 130Sigor@sysoev.ru (u_char) ((c >= 'A' && c <= 'Z') ? c | 0x20 : c) 140Sigor@sysoev.ru 150Sigor@sysoev.ru #define \ 160Sigor@sysoev.ru nxt_upcase(c) \ 170Sigor@sysoev.ru (u_char) ((c >= 'a' && c <= 'z') ? c & ~0x20 : c) 180Sigor@sysoev.ru 19354Svbart@nginx.com #define \ 20354Svbart@nginx.com nxt_isdigit(c) \ 21354Svbart@nginx.com ((u_char) ((c) - '0') <= 9) 22354Svbart@nginx.com 231439Svbart@nginx.com #define \ 241439Svbart@nginx.com nxt_strtod(s, endptr) \ 251439Svbart@nginx.com strtod((char *) s, (char **) endptr) 261439Svbart@nginx.com 270Sigor@sysoev.ru 280Sigor@sysoev.ru #define \ 290Sigor@sysoev.ru nxt_strlen(s) \ 300Sigor@sysoev.ru strlen((char *) s) 310Sigor@sysoev.ru 320Sigor@sysoev.ru 330Sigor@sysoev.ru #define \ 34*1580St.nateldemoura@f5.com nxt_strdup(s) \ 35*1580St.nateldemoura@f5.com strdup((char *) s) 36*1580St.nateldemoura@f5.com 37*1580St.nateldemoura@f5.com 38*1580St.nateldemoura@f5.com #define \ 39*1580St.nateldemoura@f5.com nxt_strchr(buf, delim) \ 40*1580St.nateldemoura@f5.com (u_char *) strchr((char *) buf, delim) 41*1580St.nateldemoura@f5.com 42*1580St.nateldemoura@f5.com 43*1580St.nateldemoura@f5.com #define \ 4410Sigor@sysoev.ru nxt_memzero(buf, length) \ 4510Sigor@sysoev.ru (void) memset(buf, 0, length) 460Sigor@sysoev.ru 470Sigor@sysoev.ru 480Sigor@sysoev.ru #define \ 4910Sigor@sysoev.ru nxt_memset(buf, c, length) \ 5010Sigor@sysoev.ru (void) memset(buf, c, length) 510Sigor@sysoev.ru 520Sigor@sysoev.ru 530Sigor@sysoev.ru #define \ 5410Sigor@sysoev.ru nxt_memcpy(dst, src, length) \ 5510Sigor@sysoev.ru (void) memcpy(dst, src, length) 560Sigor@sysoev.ru 570Sigor@sysoev.ru 5810Sigor@sysoev.ru NXT_EXPORT void nxt_memcpy_lowcase(u_char *dst, const u_char *src, 5910Sigor@sysoev.ru size_t length); 60963Sigor@sysoev.ru NXT_EXPORT void nxt_memcpy_upcase(u_char *dst, const u_char *src, 61963Sigor@sysoev.ru size_t length); 620Sigor@sysoev.ru 630Sigor@sysoev.ru 640Sigor@sysoev.ru /* 6510Sigor@sysoev.ru * nxt_cpymem() is an inline function but not a macro to 6610Sigor@sysoev.ru * eliminate possible double evaluation of length "length". 670Sigor@sysoev.ru */ 680Sigor@sysoev.ru nxt_inline void * 6910Sigor@sysoev.ru nxt_cpymem(void *dst, const void *src, size_t length) 700Sigor@sysoev.ru { 7110Sigor@sysoev.ru return ((u_char *) memcpy(dst, src, length)) + length; 720Sigor@sysoev.ru } 730Sigor@sysoev.ru 740Sigor@sysoev.ru 750Sigor@sysoev.ru #define \ 7610Sigor@sysoev.ru nxt_memmove(dst, src, length) \ 7710Sigor@sysoev.ru (void) memmove(dst, src, length) 780Sigor@sysoev.ru 790Sigor@sysoev.ru 800Sigor@sysoev.ru #define \ 8110Sigor@sysoev.ru nxt_memcmp(s1, s2, length) \ 8210Sigor@sysoev.ru memcmp((char *) s1, (char *) s2, length) 830Sigor@sysoev.ru 840Sigor@sysoev.ru 850Sigor@sysoev.ru #define \ 8610Sigor@sysoev.ru nxt_memchr(s, c, length) \ 8710Sigor@sysoev.ru memchr((char *) s, c, length) 880Sigor@sysoev.ru 890Sigor@sysoev.ru 900Sigor@sysoev.ru #define \ 910Sigor@sysoev.ru nxt_strcmp(s1, s2) \ 920Sigor@sysoev.ru strcmp((char *) s1, (char *) s2) 930Sigor@sysoev.ru 940Sigor@sysoev.ru 950Sigor@sysoev.ru #define \ 9610Sigor@sysoev.ru nxt_strncmp(s1, s2, length) \ 9710Sigor@sysoev.ru strncmp((char *) s1, (char *) s2, length) 980Sigor@sysoev.ru 990Sigor@sysoev.ru 1001439Svbart@nginx.com NXT_EXPORT u_char *nxt_cpystr(u_char *dst, const u_char *src); 10110Sigor@sysoev.ru NXT_EXPORT u_char *nxt_cpystrn(u_char *dst, const u_char *src, size_t length); 1020Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_strcasecmp(const u_char *s1, const u_char *s2); 1030Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_strncasecmp(const u_char *s1, const u_char *s2, 10410Sigor@sysoev.ru size_t length); 1051234Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_memcasecmp(const void *p1, const void *p2, 10610Sigor@sysoev.ru size_t length); 1070Sigor@sysoev.ru 1080Sigor@sysoev.ru NXT_EXPORT u_char *nxt_memstrn(const u_char *s, const u_char *end, 10910Sigor@sysoev.ru const char *ss, size_t length); 1100Sigor@sysoev.ru NXT_EXPORT u_char *nxt_memcasestrn(const u_char *s, const u_char *end, 11110Sigor@sysoev.ru const char *ss, size_t length); 1120Sigor@sysoev.ru NXT_EXPORT u_char *nxt_rmemstrn(const u_char *s, const u_char *end, 11310Sigor@sysoev.ru const char *ss, size_t length); 1140Sigor@sysoev.ru NXT_EXPORT size_t nxt_str_strip(u_char *start, u_char *end); 1150Sigor@sysoev.ru 1160Sigor@sysoev.ru 1170Sigor@sysoev.ru typedef struct { 11810Sigor@sysoev.ru size_t length; 11910Sigor@sysoev.ru u_char *start; 1200Sigor@sysoev.ru } nxt_str_t; 1210Sigor@sysoev.ru 1220Sigor@sysoev.ru 123703Svbart@nginx.com #define nxt_string(str) { nxt_length(str), (u_char *) str } 1240Sigor@sysoev.ru #define nxt_string_zero(str) { sizeof(str), (u_char *) str } 1250Sigor@sysoev.ru #define nxt_null_string { 0, NULL } 1260Sigor@sysoev.ru 1270Sigor@sysoev.ru 1280Sigor@sysoev.ru #define \ 1290Sigor@sysoev.ru nxt_str_set(str, text) \ 1300Sigor@sysoev.ru do { \ 131703Svbart@nginx.com (str)->length = nxt_length(text); \ 13210Sigor@sysoev.ru (str)->start = (u_char *) text; \ 1330Sigor@sysoev.ru } while (0) 1340Sigor@sysoev.ru 1350Sigor@sysoev.ru 1360Sigor@sysoev.ru #define \ 1370Sigor@sysoev.ru nxt_str_null(str) \ 1380Sigor@sysoev.ru do { \ 13910Sigor@sysoev.ru (str)->length = 0; \ 14010Sigor@sysoev.ru (str)->start = NULL; \ 1410Sigor@sysoev.ru } while (0) 1420Sigor@sysoev.ru 1430Sigor@sysoev.ru 14465Sigor@sysoev.ru NXT_EXPORT nxt_str_t *nxt_str_alloc(nxt_mp_t *mp, size_t length); 14565Sigor@sysoev.ru NXT_EXPORT nxt_str_t *nxt_str_dup(nxt_mp_t *mp, nxt_str_t *dst, 1460Sigor@sysoev.ru const nxt_str_t *src); 147212Svbart@nginx.com NXT_EXPORT char *nxt_str_cstrz(nxt_mp_t *mp, const nxt_str_t *src); 1480Sigor@sysoev.ru 1490Sigor@sysoev.ru 1500Sigor@sysoev.ru #define \ 1510Sigor@sysoev.ru nxt_strstr_eq(s1, s2) \ 15210Sigor@sysoev.ru (((s1)->length == (s2)->length) \ 15310Sigor@sysoev.ru && (nxt_memcmp((s1)->start, (s2)->start, (s1)->length) == 0)) 1540Sigor@sysoev.ru 1550Sigor@sysoev.ru 1560Sigor@sysoev.ru #define \ 1570Sigor@sysoev.ru nxt_strcasestr_eq(s1, s2) \ 15810Sigor@sysoev.ru (((s1)->length == (s2)->length) \ 15910Sigor@sysoev.ru && (nxt_memcasecmp((s1)->start, (s2)->start, (s1)->length) == 0)) 1600Sigor@sysoev.ru 1610Sigor@sysoev.ru 1620Sigor@sysoev.ru #define \ 16310Sigor@sysoev.ru nxt_str_eq(s, p, _length) \ 16410Sigor@sysoev.ru (((s)->length == _length) && (nxt_memcmp((s)->start, p, _length) == 0)) 1650Sigor@sysoev.ru 1660Sigor@sysoev.ru 1670Sigor@sysoev.ru #define \ 16810Sigor@sysoev.ru nxt_str_start(s, p, _length) \ 169216Sigor@sysoev.ru (((s)->length >= _length) && (nxt_memcmp((s)->start, p, _length) == 0)) 1700Sigor@sysoev.ru 1710Sigor@sysoev.ru 1720Sigor@sysoev.ru #define \ 1730Sigor@sysoev.ru nxt_strchr_eq(s, c) \ 17410Sigor@sysoev.ru (((s)->length == 1) && ((s)->start[0] == c)) 1750Sigor@sysoev.ru 1760Sigor@sysoev.ru 1770Sigor@sysoev.ru #define \ 1780Sigor@sysoev.ru nxt_strchr_start(s, c) \ 17910Sigor@sysoev.ru (((s)->length != 0) && ((s)->start[0] == c)) 1800Sigor@sysoev.ru 1810Sigor@sysoev.ru 182354Svbart@nginx.com NXT_EXPORT nxt_int_t nxt_strverscmp(const u_char *s1, const u_char *s2); 183354Svbart@nginx.com NXT_EXPORT nxt_bool_t nxt_strvers_match(u_char *version, u_char *prefix, 184354Svbart@nginx.com size_t length); 185354Svbart@nginx.com 1861167Svbart@nginx.com NXT_EXPORT u_char *nxt_decode_uri(u_char *dst, u_char *src, size_t length); 1871474Saxel.duch@nginx.com NXT_EXPORT u_char *nxt_decode_uri_plus(u_char *dst, u_char *src, size_t length); 1881183Svbart@nginx.com NXT_EXPORT uintptr_t nxt_encode_uri(u_char *dst, u_char *src, size_t length); 1891431Svbart@nginx.com NXT_EXPORT uintptr_t nxt_encode_complex_uri(u_char *dst, u_char *src, 1901431Svbart@nginx.com size_t length); 1911431Svbart@nginx.com NXT_EXPORT nxt_bool_t nxt_is_complex_uri_encoded(u_char *s, size_t length); 1921167Svbart@nginx.com 1931481Svbart@nginx.com extern const uint8_t nxt_hex2int[256]; 1941474Saxel.duch@nginx.com 195354Svbart@nginx.com 1960Sigor@sysoev.ru #endif /* _NXT_STRING_H_INCLUDED_ */ 197