comparison src/core/ngx_string.c @ 408:d6e2b445c1b8

nginx-0.0.10-2004-08-27-19:40:59 import
author Igor Sysoev <igor@sysoev.ru>
date Fri, 27 Aug 2004 15:40:59 +0000
parents 37b5381fb6d8
children 8ac40cae79f0
comparison
equal deleted inserted replaced
407:35fe251cd231 408:d6e2b445c1b8
124 124
125 125
126 ngx_int_t ngx_encode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) 126 ngx_int_t ngx_encode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst)
127 { 127 {
128 u_char *d, *s; 128 u_char *d, *s;
129 ngx_uint_t i; 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 if (!(d = ngx_palloc(pool, ((src->len + 2) / 3) * 4 + 1))) {
134 return NGX_ERROR; 134 return NGX_ERROR;
135 } 135 }
136 136
137 dst->data = d; 137 dst->data = d;
138 s = src->data; 138 s = src->data;
139 139 len = src->len;
140 for (i = 0; i < src->len - 2; i += 3) { 140
141 *d++ = basis64[(s[i] >> 2) & 0x3f]; 141 while (len > 2) {
142 *d++ = basis64[((s[i] & 3) << 4) | (s[i + 1] >> 4)]; 142 *d++ = basis64[(s[0] >> 2) & 0x3f];
143 *d++ = basis64[((s[i + 1] & 0x0f) << 2) | (s[i + 2] >> 6)]; 143 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
144 *d++ = basis64[s[i + 2] & 0x3f]; 144 *d++ = basis64[((s[1] & 0x0f) << 2) | (s[2] >> 6)];
145 } 145 *d++ = basis64[s[2] & 0x3f];
146 146
147 if (i < src->len) { 147 s += 3;
148 *d++ = basis64[(s[i] >> 2) & 0x3f]; 148 len -= 3;
149 149 }
150 if (i == src->len - 1) { 150
151 *d++ = basis64[(s[i] & 3) << 4]; 151 if (len) {
152 *d++ = basis64[(s[0] >> 2) & 0x3f];
153
154 if (len == 1) {
155 *d++ = basis64[(s[0] & 3) << 4];
152 *d++ = '='; 156 *d++ = '=';
153 157
154 } else { 158 } else {
155 *d++ = basis64[((s[i] & 3) << 4) | (s[i + 1] >> 4)]; 159 *d++ = basis64[((s[0] & 3) << 4) | (s[1] >> 4)];
156 *d++ = basis64[(s[i + 1] & 0x0f) << 2]; 160 *d++ = basis64[(s[1] & 0x0f) << 2];
157 } 161 }
158 162
159 *d++ = '='; 163 *d++ = '=';
160 } 164 }
161 165
166 } 170 }
167 171
168 172
169 ngx_int_t ngx_decode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) 173 ngx_int_t ngx_decode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst)
170 { 174 {
171 u_char *d, *s, c; 175 size_t len;
172 176 u_char *d, *s;
173 if (!(d = ngx_palloc(pool, ((src->len + 3) / 4) * 3))) { 177 static u_char basis64[] =
178 { 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
179 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
180 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77, 77, 63,
181 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,
182 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
183 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 77,
184 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
185 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,
186
187 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
188 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
189 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
190 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
191 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
192 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
193 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
194 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 };
195
196 for (len = 0; len < src->len; len++) {
197 if (src->data[len] == '=') {
198 break;
199 }
200
201 if (basis64[src->data[len]] == 77) {
202 return NGX_ERROR;
203 }
204 }
205
206 if (len % 4 == 1) {
207 return NGX_ERROR;
208 }
209
210 if (!(d = ngx_palloc(pool, ((len + 3) / 4) * 3 + 1))) {
174 return NGX_ABORT; 211 return NGX_ABORT;
175 } 212 }
176 213
177 dst->data = d; 214 dst->data = d;
215
178 s = src->data; 216 s = src->data;
179 217
180 if (*s == '+') { 218 while (len > 3) {
181 c = 62; 219 *d++ = basis64[s[0]] << 2 | basis64[s[1]] >> 4;
182 220 *d++ = basis64[s[1]] << 4 | basis64[s[2]] >> 2;
183 } else if (*s == '/') { 221 *d++ = basis64[s[2]] << 6 | basis64[s[3]];
184 c = 63; 222
185 223 s += 4;
186 } else if (*s >= '0' && *s <= '9') { 224 len -= 4;
187 c = *s - '0' + 52; 225 }
188 226
189 } else if (*s >= 'A' && *s <= 'Z') { 227 if (len > 1) {
190 c = *s - 'A'; 228 *d++ = basis64[s[0]] << 2 | basis64[s[1]] >> 4;
191 229 }
192 } else if (*s >= 'a' && *s <= 'z') { 230
193 c = *s - 'a' + 26; 231 if (len > 2) {
194 232 *d++ = basis64[s[1]] << 4 | basis64[s[2]] >> 2;
195 } else { 233 }
196 return NGX_ERROR; 234
197 } 235 dst->len = d - dst->data;
236 *d++ = '\0';
198 237
199 return NGX_OK; 238 return NGX_OK;
200 } 239 }
201 240
202 241