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