Mercurial > hg > nginx
comparison src/core/ngx_string.c @ 409:8ac40cae79f0
nginx-0.0.10-2004-08-29-07:55:41 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 29 Aug 2004 03:55:41 +0000 |
parents | d6e2b445c1b8 |
children | da8c5707af39 |
comparison
equal
deleted
inserted
replaced
408:d6e2b445c1b8 | 409:8ac40cae79f0 |
---|---|
121 | 121 |
122 *text = '\0'; | 122 *text = '\0'; |
123 } | 123 } |
124 | 124 |
125 | 125 |
126 ngx_int_t ngx_encode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) | 126 void ngx_encode_base64(ngx_str_t *src, ngx_str_t *dst) |
127 { | 127 { |
128 u_char *d, *s; | 128 u_char *d, *s; |
129 size_t len; | 129 size_t len; |
130 static u_char basis64[] = | 130 static u_char basis64[] = |
131 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | 131 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
132 | 132 |
133 if (!(d = ngx_palloc(pool, ((src->len + 2) / 3) * 4 + 1))) { | 133 len = src->len; |
134 return NGX_ERROR; | |
135 } | |
136 | |
137 dst->data = d; | |
138 s = src->data; | 134 s = src->data; |
139 len = src->len; | 135 d = dst->data; |
140 | 136 |
141 while (len > 2) { | 137 while (len > 2) { |
142 *d++ = basis64[(s[0] >> 2) & 0x3f]; | 138 *d++ = basis64[(s[0] >> 2) & 0x3f]; |
143 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)]; | 139 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)]; |
144 *d++ = basis64[((s[1] & 0x0f) << 2) | (s[2] >> 6)]; | 140 *d++ = basis64[((s[1] & 0x0f) << 2) | (s[2] >> 6)]; |
162 | 158 |
163 *d++ = '='; | 159 *d++ = '='; |
164 } | 160 } |
165 | 161 |
166 dst->len = d - dst->data; | 162 dst->len = d - dst->data; |
167 *d++ = '\0'; | 163 } |
168 | 164 |
169 return NGX_OK; | 165 |
170 } | 166 ngx_int_t ngx_decode_base64(ngx_str_t *src, ngx_str_t *dst) |
171 | |
172 | |
173 ngx_int_t ngx_decode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) | |
174 { | 167 { |
175 size_t len; | 168 size_t len; |
176 u_char *d, *s; | 169 u_char *d, *s; |
177 static u_char basis64[] = | 170 static u_char basis64[] = |
178 { 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, | 171 { 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, |
205 | 198 |
206 if (len % 4 == 1) { | 199 if (len % 4 == 1) { |
207 return NGX_ERROR; | 200 return NGX_ERROR; |
208 } | 201 } |
209 | 202 |
210 if (!(d = ngx_palloc(pool, ((len + 3) / 4) * 3 + 1))) { | |
211 return NGX_ABORT; | |
212 } | |
213 | |
214 dst->data = d; | |
215 | |
216 s = src->data; | 203 s = src->data; |
204 d = dst->data; | |
217 | 205 |
218 while (len > 3) { | 206 while (len > 3) { |
219 *d++ = basis64[s[0]] << 2 | basis64[s[1]] >> 4; | 207 *d++ = (u_char) (basis64[s[0]] << 2 | basis64[s[1]] >> 4); |
220 *d++ = basis64[s[1]] << 4 | basis64[s[2]] >> 2; | 208 *d++ = (u_char) (basis64[s[1]] << 4 | basis64[s[2]] >> 2); |
221 *d++ = basis64[s[2]] << 6 | basis64[s[3]]; | 209 *d++ = (u_char) (basis64[s[2]] << 6 | basis64[s[3]]); |
222 | 210 |
223 s += 4; | 211 s += 4; |
224 len -= 4; | 212 len -= 4; |
225 } | 213 } |
226 | 214 |
227 if (len > 1) { | 215 if (len > 1) { |
228 *d++ = basis64[s[0]] << 2 | basis64[s[1]] >> 4; | 216 *d++ = (u_char) (basis64[s[0]] << 2 | basis64[s[1]] >> 4); |
229 } | 217 } |
230 | 218 |
231 if (len > 2) { | 219 if (len > 2) { |
232 *d++ = basis64[s[1]] << 4 | basis64[s[2]] >> 2; | 220 *d++ = (u_char) (basis64[s[1]] << 4 | basis64[s[2]] >> 2); |
233 } | 221 } |
234 | 222 |
235 dst->len = d - dst->data; | 223 dst->len = d - dst->data; |
236 *d++ = '\0'; | |
237 | 224 |
238 return NGX_OK; | 225 return NGX_OK; |
239 } | 226 } |
240 | 227 |
241 | 228 |