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