Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- From 047a5e55a0ec54ff517fb2f0f6eac426e26f4127 Mon Sep 17 00:00:00 2001
- From: Ben Noordhuis <info@bnoordhuis.nl>
- Date: Mon, 8 Nov 2010 11:57:47 +0100
- Subject: [PATCH] Backport base64 encoder/decoder changes from master to v0.2.
- ---
- src/node_buffer.cc | 78 ++++++++++++++++++++++++++++++++++++---------------
- 1 files changed, 55 insertions(+), 23 deletions(-)
- diff --git a/src/node_buffer.cc b/src/node_buffer.cc
- index 599c83b..dbe8940 100644
- --- a/src/node_buffer.cc
- +++ b/src/node_buffer.cc
- @@ -317,15 +317,24 @@ static const char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz"
- "0123456789+/";
- static const int unbase64_table[] =
- - {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- + {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-2,-1,-1
- ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63
- + ,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63
- ,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1
- ,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14
- ,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1
- ,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
- ,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1
- + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
- };
- +#define unbase64(x) unbase64_table[(uint8_t)(x)]
- Handle<Value> Buffer::Base64Slice(const Arguments &args) {
- @@ -367,12 +376,12 @@ Handle<Value> Buffer::Base64Slice(const Arguments &args) {
- c = bitbuf[0] >> 2;
- assert(c < 64);
- - out[j++] = base64_table[c];
- + out[j++] = base64_table[(int)c];
- assert(j < out_len);
- c = ((bitbuf[0] & 0x03) << 4) | (bitbuf[1] >> 4);
- assert(c < 64);
- - out[j++] = base64_table[c];
- + out[j++] = base64_table[(int)c];
- assert(j < out_len);
- if (b1_oob) {
- @@ -380,7 +389,7 @@ Handle<Value> Buffer::Base64Slice(const Arguments &args) {
- } else {
- c = ((bitbuf[1] & 0x0F) << 2) | (bitbuf[2] >> 6);
- assert(c < 64);
- - out[j++] = base64_table[c];
- + out[j++] = base64_table[(int)c];
- }
- assert(j < out_len);
- @@ -389,7 +398,7 @@ Handle<Value> Buffer::Base64Slice(const Arguments &args) {
- } else {
- c = bitbuf[2] & 0x3F;
- assert(c < 64);
- - out[j++] = base64_table[c];
- + out[j++] = base64_table[(int)c];
- }
- assert(j <= out_len);
- }
- @@ -535,16 +544,21 @@ Handle<Value> Buffer::AsciiWrite(const Arguments &args) {
- return scope.Close(Integer::New(written));
- }
- -// var bytesWritten = buffer.base64Write(string, offset);
- +
- +// var bytesWritten = buffer.base64Write(string, offset, [maxLength]);
- Handle<Value> Buffer::Base64Write(const Arguments &args) {
- HandleScope scope;
- - assert(unbase64_table['/'] == 63);
- - assert(unbase64_table['+'] == 62);
- - assert(unbase64_table['T'] == 19);
- - assert(unbase64_table['Z'] == 25);
- - assert(unbase64_table['t'] == 45);
- - assert(unbase64_table['z'] == 51);
- + assert(unbase64('/') == 63);
- + assert(unbase64('+') == 62);
- + assert(unbase64('T') == 19);
- + assert(unbase64('Z') == 25);
- + assert(unbase64('t') == 45);
- + assert(unbase64('z') == 51);
- +
- + assert(unbase64(' ') == -2);
- + assert(unbase64('\n') == -2);
- + assert(unbase64('\r') == -2);
- Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args.This());
- @@ -574,29 +588,47 @@ Handle<Value> Buffer::Base64Write(const Arguments &args) {
- }
- char a, b, c, d;
- - char *dst = buffer->data();
- + char* start = buffer->data() + offset;
- + char* dst = start;
- const char *src = *s;
- const char *const srcEnd = src + s.length();
- while (src < srcEnd) {
- - const int remaining = srcEnd - src;
- + int remaining = srcEnd - src;
- +
- + while (unbase64(*src) < 0 && src < srcEnd) {
- + src++;
- + remaining--;
- + }
- if (remaining == 0 || *src == '=') break;
- - a = unbase64_table[*src++];
- + a = unbase64(*src++);
- - if (remaining == 1 || *src == '=') break;
- - b = unbase64_table[*src++];
- + while (unbase64(*src) < 0 && src < srcEnd) {
- + src++;
- + remaining--;
- + }
- + if (remaining <= 1 || *src == '=') break;
- + b = unbase64(*src++);
- *dst++ = (a << 2) | ((b & 0x30) >> 4);
- - if (remaining == 2 || *src == '=') break;
- - c = unbase64_table[*src++];
- + while (unbase64(*src) < 0 && src < srcEnd) {
- + src++;
- + remaining--;
- + }
- + if (remaining <= 2 || *src == '=') break;
- + c = unbase64(*src++);
- *dst++ = ((b & 0x0F) << 4) | ((c & 0x3C) >> 2);
- - if (remaining == 3 || *src == '=') break;
- - d = unbase64_table[*src++];
- + while (unbase64(*src) < 0 && src < srcEnd) {
- + src++;
- + remaining--;
- + }
- + if (remaining <= 3 || *src == '=') break;
- + d = unbase64(*src++);
- *dst++ = ((c & 0x03) << 6) | (d & 0x3F);
- }
- - return scope.Close(Integer::New(size));
- + return scope.Close(Integer::New(dst - start));
- }
- --
- 1.7.0.4
Add Comment
Please, Sign In to add comment