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, ...)
 {