xref: /unit/src/nxt_string.h (revision 2232:1fb2182a4d03)
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_strcmp(s1, s2)                                                    \
700Sigor@sysoev.ru     strcmp((char *) s1, (char *) s2)
710Sigor@sysoev.ru 
720Sigor@sysoev.ru 
732084Salx.manpages@gmail.com #define nxt_strncmp(s1, s2, length)                                           \
7410Sigor@sysoev.ru     strncmp((char *) s1, (char *) s2, length)
750Sigor@sysoev.ru 
760Sigor@sysoev.ru 
771439Svbart@nginx.com NXT_EXPORT u_char *nxt_cpystr(u_char *dst, const u_char *src);
7810Sigor@sysoev.ru NXT_EXPORT u_char *nxt_cpystrn(u_char *dst, const u_char *src, size_t length);
790Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_strcasecmp(const u_char *s1, const u_char *s2);
800Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_strncasecmp(const u_char *s1, const u_char *s2,
8110Sigor@sysoev.ru     size_t length);
821234Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_memcasecmp(const void *p1, const void *p2,
8310Sigor@sysoev.ru     size_t length);
840Sigor@sysoev.ru 
850Sigor@sysoev.ru NXT_EXPORT u_char *nxt_memstrn(const u_char *s, const u_char *end,
8610Sigor@sysoev.ru     const char *ss, size_t length);
870Sigor@sysoev.ru NXT_EXPORT u_char *nxt_memcasestrn(const u_char *s, const u_char *end,
8810Sigor@sysoev.ru     const char *ss, size_t length);
890Sigor@sysoev.ru NXT_EXPORT u_char *nxt_rmemstrn(const u_char *s, const u_char *end,
9010Sigor@sysoev.ru     const char *ss, size_t length);
912139Sandrew@digital-domain.net NXT_EXPORT size_t nxt_str_strip(const u_char *start, u_char *end);
920Sigor@sysoev.ru 
930Sigor@sysoev.ru 
940Sigor@sysoev.ru typedef struct {
9510Sigor@sysoev.ru     size_t                    length;
9610Sigor@sysoev.ru     u_char                    *start;
970Sigor@sysoev.ru } nxt_str_t;
980Sigor@sysoev.ru 
990Sigor@sysoev.ru 
100703Svbart@nginx.com #define nxt_string(str)       { nxt_length(str), (u_char *) str }
1010Sigor@sysoev.ru #define nxt_string_zero(str)  { sizeof(str), (u_char *) str }
1020Sigor@sysoev.ru #define nxt_null_string       { 0, NULL }
1030Sigor@sysoev.ru 
1040Sigor@sysoev.ru 
1052084Salx.manpages@gmail.com #define nxt_str_set(str, text)                                                \
1060Sigor@sysoev.ru     do {                                                                      \
107703Svbart@nginx.com         (str)->length = nxt_length(text);                                     \
10810Sigor@sysoev.ru         (str)->start = (u_char *) text;                                       \
1090Sigor@sysoev.ru     } while (0)
1100Sigor@sysoev.ru 
1110Sigor@sysoev.ru 
1122084Salx.manpages@gmail.com #define nxt_str_null(str)                                                     \
1130Sigor@sysoev.ru     do {                                                                      \
11410Sigor@sysoev.ru         (str)->length = 0;                                                    \
11510Sigor@sysoev.ru         (str)->start = NULL;                                                  \
1160Sigor@sysoev.ru     } while (0)
1170Sigor@sysoev.ru 
1180Sigor@sysoev.ru 
11965Sigor@sysoev.ru NXT_EXPORT nxt_str_t *nxt_str_alloc(nxt_mp_t *mp, size_t length);
12065Sigor@sysoev.ru NXT_EXPORT nxt_str_t *nxt_str_dup(nxt_mp_t *mp, nxt_str_t *dst,
1210Sigor@sysoev.ru     const nxt_str_t *src);
122212Svbart@nginx.com NXT_EXPORT char *nxt_str_cstrz(nxt_mp_t *mp, const nxt_str_t *src);
1230Sigor@sysoev.ru 
1240Sigor@sysoev.ru 
1252084Salx.manpages@gmail.com #define nxt_strstr_eq(s1, s2)                                                 \
12610Sigor@sysoev.ru     (((s1)->length == (s2)->length)                                           \
127*2231Salx@nginx.com       && (memcmp((s1)->start, (s2)->start, (s1)->length) == 0))
1280Sigor@sysoev.ru 
1290Sigor@sysoev.ru 
1302084Salx.manpages@gmail.com #define nxt_strcasestr_eq(s1, s2)                                             \
13110Sigor@sysoev.ru     (((s1)->length == (s2)->length)                                           \
13210Sigor@sysoev.ru       && (nxt_memcasecmp((s1)->start, (s2)->start, (s1)->length) == 0))
1330Sigor@sysoev.ru 
1340Sigor@sysoev.ru 
1352084Salx.manpages@gmail.com #define nxt_str_eq(s, p, _length)                                             \
136*2231Salx@nginx.com     (((s)->length == _length) && (memcmp((s)->start, p, _length) == 0))
1370Sigor@sysoev.ru 
1380Sigor@sysoev.ru 
1392084Salx.manpages@gmail.com #define nxt_str_start(s, p, _length)                                          \
140*2231Salx@nginx.com     (((s)->length >= _length) && (memcmp((s)->start, p, _length) == 0))
1410Sigor@sysoev.ru 
1420Sigor@sysoev.ru 
1432084Salx.manpages@gmail.com #define nxt_strchr_eq(s, c)                                                   \
14410Sigor@sysoev.ru     (((s)->length == 1) && ((s)->start[0] == c))
1450Sigor@sysoev.ru 
1460Sigor@sysoev.ru 
1472084Salx.manpages@gmail.com #define nxt_strchr_start(s, c)                                                \
14810Sigor@sysoev.ru     (((s)->length != 0) && ((s)->start[0] == c))
1490Sigor@sysoev.ru 
1500Sigor@sysoev.ru 
151354Svbart@nginx.com NXT_EXPORT nxt_int_t nxt_strverscmp(const u_char *s1, const u_char *s2);
152354Svbart@nginx.com NXT_EXPORT nxt_bool_t nxt_strvers_match(u_char *version, u_char *prefix,
153354Svbart@nginx.com     size_t length);
154354Svbart@nginx.com 
1551167Svbart@nginx.com NXT_EXPORT u_char *nxt_decode_uri(u_char *dst, u_char *src, size_t length);
1561474Saxel.duch@nginx.com NXT_EXPORT u_char *nxt_decode_uri_plus(u_char *dst, u_char *src, size_t length);
1571183Svbart@nginx.com NXT_EXPORT uintptr_t nxt_encode_uri(u_char *dst, u_char *src, size_t length);
1581431Svbart@nginx.com NXT_EXPORT uintptr_t nxt_encode_complex_uri(u_char *dst, u_char *src,
1591431Svbart@nginx.com     size_t length);
1601431Svbart@nginx.com NXT_EXPORT nxt_bool_t nxt_is_complex_uri_encoded(u_char *s, size_t length);
1611167Svbart@nginx.com 
1621975Svbart@nginx.com NXT_EXPORT ssize_t nxt_base64_decode(u_char *dst, u_char *src, size_t length);
1631975Svbart@nginx.com 
1641481Svbart@nginx.com extern const uint8_t  nxt_hex2int[256];
1651474Saxel.duch@nginx.com 
166354Svbart@nginx.com 
1670Sigor@sysoev.ru #endif /* _NXT_STRING_H_INCLUDED_ */
168