xref: /unit/src/nxt_string.h (revision 2139:99d792169ffb)
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 
112084Salx.manpages@gmail.com #define nxt_lowcase(c)                                                        \
120Sigor@sysoev.ru     (u_char) ((c >= 'A' && c <= 'Z') ? c | 0x20 : c)
130Sigor@sysoev.ru 
142084Salx.manpages@gmail.com #define nxt_upcase(c)                                                         \
150Sigor@sysoev.ru     (u_char) ((c >= 'a' && c <= 'z') ? c & ~0x20 : c)
160Sigor@sysoev.ru 
172084Salx.manpages@gmail.com #define nxt_isdigit(c)                                                        \
18354Svbart@nginx.com     ((u_char) ((c) - '0') <= 9)
19354Svbart@nginx.com 
202084Salx.manpages@gmail.com #define nxt_strtod(s, endptr)                                                 \
211439Svbart@nginx.com     strtod((char *) s, (char **) endptr)
221439Svbart@nginx.com 
230Sigor@sysoev.ru 
242084Salx.manpages@gmail.com #define nxt_strlen(s)                                                         \
250Sigor@sysoev.ru     strlen((char *) s)
260Sigor@sysoev.ru 
270Sigor@sysoev.ru 
282084Salx.manpages@gmail.com #define nxt_strdup(s)                                                         \
291580St.nateldemoura@f5.com     strdup((char *) s)
301580St.nateldemoura@f5.com 
311580St.nateldemoura@f5.com 
322084Salx.manpages@gmail.com #define nxt_strchr(buf, delim)                                                \
331580St.nateldemoura@f5.com     (u_char *) strchr((char *) buf, delim)
341580St.nateldemoura@f5.com 
351580St.nateldemoura@f5.com 
362084Salx.manpages@gmail.com #define nxt_memzero(buf, length)                                              \
3710Sigor@sysoev.ru     (void) memset(buf, 0, length)
380Sigor@sysoev.ru 
390Sigor@sysoev.ru 
402084Salx.manpages@gmail.com #define nxt_memset(buf, c, length)                                            \
4110Sigor@sysoev.ru     (void) memset(buf, c, length)
420Sigor@sysoev.ru 
430Sigor@sysoev.ru 
442084Salx.manpages@gmail.com #define nxt_memcpy(dst, src, length)                                          \
4510Sigor@sysoev.ru     (void) memcpy(dst, src, length)
460Sigor@sysoev.ru 
470Sigor@sysoev.ru 
4810Sigor@sysoev.ru NXT_EXPORT void nxt_memcpy_lowcase(u_char *dst, const u_char *src,
4910Sigor@sysoev.ru     size_t length);
50963Sigor@sysoev.ru NXT_EXPORT void nxt_memcpy_upcase(u_char *dst, const u_char *src,
51963Sigor@sysoev.ru     size_t length);
520Sigor@sysoev.ru 
530Sigor@sysoev.ru 
540Sigor@sysoev.ru /*
5510Sigor@sysoev.ru  * nxt_cpymem() is an inline function but not a macro to
5610Sigor@sysoev.ru  * eliminate possible double evaluation of length "length".
570Sigor@sysoev.ru  */
580Sigor@sysoev.ru nxt_inline void *
nxt_cpymem(void * dst,const void * src,size_t length)5910Sigor@sysoev.ru nxt_cpymem(void *dst, const void *src, size_t length)
600Sigor@sysoev.ru {
6110Sigor@sysoev.ru     return ((u_char *) memcpy(dst, src, length)) + length;
620Sigor@sysoev.ru }
630Sigor@sysoev.ru 
640Sigor@sysoev.ru 
652084Salx.manpages@gmail.com #define nxt_memmove(dst, src, length)                                         \
6610Sigor@sysoev.ru     (void) memmove(dst, src, length)
670Sigor@sysoev.ru 
680Sigor@sysoev.ru 
692084Salx.manpages@gmail.com #define nxt_memcmp(s1, s2, length)                                            \
7010Sigor@sysoev.ru     memcmp((char *) s1, (char *) s2, length)
710Sigor@sysoev.ru 
720Sigor@sysoev.ru 
732084Salx.manpages@gmail.com #define nxt_memchr(s, c, length)                                              \
7410Sigor@sysoev.ru     memchr((char *) s, c, length)
750Sigor@sysoev.ru 
760Sigor@sysoev.ru 
772084Salx.manpages@gmail.com #define nxt_strcmp(s1, s2)                                                    \
780Sigor@sysoev.ru     strcmp((char *) s1, (char *) s2)
790Sigor@sysoev.ru 
800Sigor@sysoev.ru 
812084Salx.manpages@gmail.com #define nxt_strncmp(s1, s2, length)                                           \
8210Sigor@sysoev.ru     strncmp((char *) s1, (char *) s2, length)
830Sigor@sysoev.ru 
840Sigor@sysoev.ru 
851439Svbart@nginx.com NXT_EXPORT u_char *nxt_cpystr(u_char *dst, const u_char *src);
8610Sigor@sysoev.ru NXT_EXPORT u_char *nxt_cpystrn(u_char *dst, const u_char *src, size_t length);
870Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_strcasecmp(const u_char *s1, const u_char *s2);
880Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_strncasecmp(const u_char *s1, const u_char *s2,
8910Sigor@sysoev.ru     size_t length);
901234Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_memcasecmp(const void *p1, const void *p2,
9110Sigor@sysoev.ru     size_t length);
920Sigor@sysoev.ru 
930Sigor@sysoev.ru NXT_EXPORT u_char *nxt_memstrn(const u_char *s, const u_char *end,
9410Sigor@sysoev.ru     const char *ss, size_t length);
950Sigor@sysoev.ru NXT_EXPORT u_char *nxt_memcasestrn(const u_char *s, const u_char *end,
9610Sigor@sysoev.ru     const char *ss, size_t length);
970Sigor@sysoev.ru NXT_EXPORT u_char *nxt_rmemstrn(const u_char *s, const u_char *end,
9810Sigor@sysoev.ru     const char *ss, size_t length);
99*2139Sandrew@digital-domain.net NXT_EXPORT size_t nxt_str_strip(const u_char *start, u_char *end);
1000Sigor@sysoev.ru 
1010Sigor@sysoev.ru 
1020Sigor@sysoev.ru typedef struct {
10310Sigor@sysoev.ru     size_t                    length;
10410Sigor@sysoev.ru     u_char                    *start;
1050Sigor@sysoev.ru } nxt_str_t;
1060Sigor@sysoev.ru 
1070Sigor@sysoev.ru 
108703Svbart@nginx.com #define nxt_string(str)       { nxt_length(str), (u_char *) str }
1090Sigor@sysoev.ru #define nxt_string_zero(str)  { sizeof(str), (u_char *) str }
1100Sigor@sysoev.ru #define nxt_null_string       { 0, NULL }
1110Sigor@sysoev.ru 
1120Sigor@sysoev.ru 
1132084Salx.manpages@gmail.com #define nxt_str_set(str, text)                                                \
1140Sigor@sysoev.ru     do {                                                                      \
115703Svbart@nginx.com         (str)->length = nxt_length(text);                                     \
11610Sigor@sysoev.ru         (str)->start = (u_char *) text;                                       \
1170Sigor@sysoev.ru     } while (0)
1180Sigor@sysoev.ru 
1190Sigor@sysoev.ru 
1202084Salx.manpages@gmail.com #define nxt_str_null(str)                                                     \
1210Sigor@sysoev.ru     do {                                                                      \
12210Sigor@sysoev.ru         (str)->length = 0;                                                    \
12310Sigor@sysoev.ru         (str)->start = NULL;                                                  \
1240Sigor@sysoev.ru     } while (0)
1250Sigor@sysoev.ru 
1260Sigor@sysoev.ru 
12765Sigor@sysoev.ru NXT_EXPORT nxt_str_t *nxt_str_alloc(nxt_mp_t *mp, size_t length);
12865Sigor@sysoev.ru NXT_EXPORT nxt_str_t *nxt_str_dup(nxt_mp_t *mp, nxt_str_t *dst,
1290Sigor@sysoev.ru     const nxt_str_t *src);
130212Svbart@nginx.com NXT_EXPORT char *nxt_str_cstrz(nxt_mp_t *mp, const nxt_str_t *src);
1310Sigor@sysoev.ru 
1320Sigor@sysoev.ru 
1332084Salx.manpages@gmail.com #define nxt_strstr_eq(s1, s2)                                                 \
13410Sigor@sysoev.ru     (((s1)->length == (s2)->length)                                           \
13510Sigor@sysoev.ru       && (nxt_memcmp((s1)->start, (s2)->start, (s1)->length) == 0))
1360Sigor@sysoev.ru 
1370Sigor@sysoev.ru 
1382084Salx.manpages@gmail.com #define nxt_strcasestr_eq(s1, s2)                                             \
13910Sigor@sysoev.ru     (((s1)->length == (s2)->length)                                           \
14010Sigor@sysoev.ru       && (nxt_memcasecmp((s1)->start, (s2)->start, (s1)->length) == 0))
1410Sigor@sysoev.ru 
1420Sigor@sysoev.ru 
1432084Salx.manpages@gmail.com #define nxt_str_eq(s, p, _length)                                             \
14410Sigor@sysoev.ru     (((s)->length == _length) && (nxt_memcmp((s)->start, p, _length) == 0))
1450Sigor@sysoev.ru 
1460Sigor@sysoev.ru 
1472084Salx.manpages@gmail.com #define nxt_str_start(s, p, _length)                                          \
148216Sigor@sysoev.ru     (((s)->length >= _length) && (nxt_memcmp((s)->start, p, _length) == 0))
1490Sigor@sysoev.ru 
1500Sigor@sysoev.ru 
1512084Salx.manpages@gmail.com #define nxt_strchr_eq(s, c)                                                   \
15210Sigor@sysoev.ru     (((s)->length == 1) && ((s)->start[0] == c))
1530Sigor@sysoev.ru 
1540Sigor@sysoev.ru 
1552084Salx.manpages@gmail.com #define nxt_strchr_start(s, c)                                                \
15610Sigor@sysoev.ru     (((s)->length != 0) && ((s)->start[0] == c))
1570Sigor@sysoev.ru 
1580Sigor@sysoev.ru 
159354Svbart@nginx.com NXT_EXPORT nxt_int_t nxt_strverscmp(const u_char *s1, const u_char *s2);
160354Svbart@nginx.com NXT_EXPORT nxt_bool_t nxt_strvers_match(u_char *version, u_char *prefix,
161354Svbart@nginx.com     size_t length);
162354Svbart@nginx.com 
1631167Svbart@nginx.com NXT_EXPORT u_char *nxt_decode_uri(u_char *dst, u_char *src, size_t length);
1641474Saxel.duch@nginx.com NXT_EXPORT u_char *nxt_decode_uri_plus(u_char *dst, u_char *src, size_t length);
1651183Svbart@nginx.com NXT_EXPORT uintptr_t nxt_encode_uri(u_char *dst, u_char *src, size_t length);
1661431Svbart@nginx.com NXT_EXPORT uintptr_t nxt_encode_complex_uri(u_char *dst, u_char *src,
1671431Svbart@nginx.com     size_t length);
1681431Svbart@nginx.com NXT_EXPORT nxt_bool_t nxt_is_complex_uri_encoded(u_char *s, size_t length);
1691167Svbart@nginx.com 
1701975Svbart@nginx.com NXT_EXPORT ssize_t nxt_base64_decode(u_char *dst, u_char *src, size_t length);
1711975Svbart@nginx.com 
1721481Svbart@nginx.com extern const uint8_t  nxt_hex2int[256];
1731474Saxel.duch@nginx.com 
174354Svbart@nginx.com 
1750Sigor@sysoev.ru #endif /* _NXT_STRING_H_INCLUDED_ */
176