1
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7 #ifndef _NXT_STRING_H_INCLUDED_
8 #define _NXT_STRING_H_INCLUDED_
9
10
11 #define nxt_lowcase(c) \
12 (u_char) ((c >= 'A' && c <= 'Z') ? c | 0x20 : c)
13
14 #define nxt_upcase(c) \
15 (u_char) ((c >= 'a' && c <= 'z') ? c & ~0x20 : c)
16
17 #define nxt_isdigit(c) \
18 ((u_char) ((c) - '0') <= 9)
19
20 #define nxt_strtod(s, endptr) \
21 strtod((char *) s, (char **) endptr)
22
23
24 #define nxt_strlen(s) \
25 strlen((char *) s)
26
27
28 #define nxt_strdup(s) \
29 strdup((char *) s)
30
31
32 #define nxt_strchr(buf, delim) \
33 (u_char *) strchr((char *) buf, delim)
34
35
36 #define nxt_memzero(buf, length) \
37 (void) memset(buf, 0, length)
38
39
40 #define nxt_memset(buf, c, length) \
41 (void) memset(buf, c, length)
42
43
44 #define nxt_memcpy(dst, src, length) \
45 (void) memcpy(dst, src, length)
46
47
48 NXT_EXPORT void nxt_memcpy_lowcase(u_char *dst, const u_char *src,
49 size_t length);
50 NXT_EXPORT void nxt_memcpy_upcase(u_char *dst, const u_char *src,
51 size_t length);
52
53
54 /*
55 * nxt_cpymem() is an inline function but not a macro to
56 * eliminate possible double evaluation of length "length".
57 */
58 nxt_inline void *
nxt_cpymem(void * dst,const void * src,size_t length)59 nxt_cpymem(void *dst, const void *src, size_t length)
60 {
61 return ((u_char *) memcpy(dst, src, length)) + length;
62 }
63
64
65 #define nxt_memmove(dst, src, length) \
66 (void) memmove(dst, src, length)
67
68
69 #define nxt_strcmp(s1, s2) \
70 strcmp((char *) s1, (char *) s2)
71
72
73 #define nxt_strncmp(s1, s2, length) \
74 strncmp((char *) s1, (char *) s2, length)
75
76
77 NXT_EXPORT u_char *nxt_cpystr(u_char *dst, const u_char *src);
78 NXT_EXPORT u_char *nxt_cpystrn(u_char *dst, const u_char *src, size_t length);
79 NXT_EXPORT nxt_int_t nxt_strcasecmp(const u_char *s1, const u_char *s2);
80 NXT_EXPORT nxt_int_t nxt_strncasecmp(const u_char *s1, const u_char *s2,
81 size_t length);
82 NXT_EXPORT nxt_int_t nxt_memcasecmp(const void *p1, const void *p2,
83 size_t length);
84
85 NXT_EXPORT u_char *nxt_memstrn(const u_char *s, const u_char *end,
86 const char *ss, size_t length);
87 NXT_EXPORT u_char *nxt_memcasestrn(const u_char *s, const u_char *end,
88 const char *ss, size_t length);
89 NXT_EXPORT u_char *nxt_rmemstrn(const u_char *s, const u_char *end,
90 const char *ss, size_t length);
91 NXT_EXPORT size_t nxt_str_strip(const u_char *start, u_char *end);
92
93
94 typedef struct {
95 size_t length;
96 u_char *start;
97 } nxt_str_t;
98
99
100 #define nxt_string(str) { nxt_length(str), (u_char *) str }
101 #define nxt_string_zero(str) { sizeof(str), (u_char *) str }
102 #define nxt_null_string { 0, NULL }
103
104
105 #define nxt_str_set(str, text) \
106 do { \
107 (str)->length = nxt_length(text); \
108 (str)->start = (u_char *) text; \
109 } while (0)
110
111
112 #define nxt_str_null(str) \
113 do { \
114 (str)->length = 0; \
115 (str)->start = NULL; \
116 } while (0)
117
118
119 NXT_EXPORT nxt_str_t *nxt_str_alloc(nxt_mp_t *mp, size_t length);
120 NXT_EXPORT nxt_str_t *nxt_str_dup(nxt_mp_t *mp, nxt_str_t *dst,
121 const nxt_str_t *src);
122 NXT_EXPORT char *nxt_str_cstrz(nxt_mp_t *mp, const nxt_str_t *src);
123
124
125 #define nxt_strstr_eq(s1, s2) \
126 (((s1)->length == (s2)->length) \
127 && (memcmp((s1)->start, (s2)->start, (s1)->length) == 0))
128
129
130 #define nxt_strcasestr_eq(s1, s2) \
131 (((s1)->length == (s2)->length) \
132 && (nxt_memcasecmp((s1)->start, (s2)->start, (s1)->length) == 0))
133
134
135 #define nxt_str_eq(s, p, _length) \
136 (((s)->length == _length) && (memcmp((s)->start, p, _length) == 0))
137
138
139 #define nxt_str_start(s, p, _length) \
140 (((s)->length >= _length) && (memcmp((s)->start, p, _length) == 0))
141
142
143 #define nxt_strchr_eq(s, c) \
144 (((s)->length == 1) && ((s)->start[0] == c))
145
146
147 #define nxt_strchr_start(s, c) \
148 (((s)->length != 0) && ((s)->start[0] == c))
149
150
151 NXT_EXPORT nxt_int_t nxt_strverscmp(const u_char *s1, const u_char *s2);
152 NXT_EXPORT nxt_bool_t nxt_strvers_match(u_char *version, u_char *prefix,
153 size_t length);
154
155 NXT_EXPORT u_char *nxt_decode_uri(u_char *dst, u_char *src, size_t length);
156 NXT_EXPORT u_char *nxt_decode_uri_plus(u_char *dst, u_char *src, size_t length);
157 NXT_EXPORT uintptr_t nxt_encode_uri(u_char *dst, u_char *src, size_t length);
158 NXT_EXPORT uintptr_t nxt_encode_complex_uri(u_char *dst, u_char *src,
159 size_t length);
160 NXT_EXPORT nxt_bool_t nxt_is_complex_uri_encoded(u_char *s, size_t length);
161
162 NXT_EXPORT ssize_t nxt_base64_decode(u_char *dst, u_char *src, size_t length);
163
164 extern const uint8_t nxt_hex2int[256];
165
166
167 #endif /* _NXT_STRING_H_INCLUDED_ */
168