xref: /unit/src/nxt_string.h (revision 1580)
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