Mercurial > hg > nginx
diff src/core/ngx_string.c @ 404:37b5381fb6d8
nginx-0.0.9-2004-07-30-21:05:14 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 30 Jul 2004 17:05:14 +0000 |
parents | 8c5b69141dfd |
children | d6e2b445c1b8 |
line wrap: on
line diff
--- a/src/core/ngx_string.c +++ b/src/core/ngx_string.c @@ -123,6 +123,83 @@ void ngx_md5_text(u_char *text, u_char * } +ngx_int_t ngx_encode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) +{ + u_char *d, *s; + ngx_uint_t i; + static u_char basis64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + if (!(d = ngx_palloc(pool, ((src->len + 2) / 3) * 4 + 1))) { + return NGX_ERROR; + } + + dst->data = d; + s = src->data; + + for (i = 0; i < src->len - 2; i += 3) { + *d++ = basis64[(s[i] >> 2) & 0x3f]; + *d++ = basis64[((s[i] & 3) << 4) | (s[i + 1] >> 4)]; + *d++ = basis64[((s[i + 1] & 0x0f) << 2) | (s[i + 2] >> 6)]; + *d++ = basis64[s[i + 2] & 0x3f]; + } + + if (i < src->len) { + *d++ = basis64[(s[i] >> 2) & 0x3f]; + + if (i == src->len - 1) { + *d++ = basis64[(s[i] & 3) << 4]; + *d++ = '='; + + } else { + *d++ = basis64[((s[i] & 3) << 4) | (s[i + 1] >> 4)]; + *d++ = basis64[(s[i + 1] & 0x0f) << 2]; + } + + *d++ = '='; + } + + dst->len = d - dst->data; + *d++ = '\0'; + + return NGX_OK; +} + + +ngx_int_t ngx_decode_base64(ngx_pool_t *pool, ngx_str_t *src, ngx_str_t *dst) +{ + u_char *d, *s, c; + + if (!(d = ngx_palloc(pool, ((src->len + 3) / 4) * 3))) { + return NGX_ABORT; + } + + dst->data = d; + s = src->data; + + if (*s == '+') { + c = 62; + + } else if (*s == '/') { + c = 63; + + } else if (*s >= '0' && *s <= '9') { + c = *s - '0' + 52; + + } else if (*s >= 'A' && *s <= 'Z') { + c = *s - 'A'; + + } else if (*s >= 'a' && *s <= 'z') { + c = *s - 'a' + 26; + + } else { + return NGX_ERROR; + } + + return NGX_OK; +} + + #if 0 char *ngx_psprintf(ngx_pool_t *p, const char *fmt, ...) {