Skip to content

Instantly share code, notes, and snippets.

@bnoordhuis
Created November 8, 2010 11:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bnoordhuis/667592 to your computer and use it in GitHub Desktop.
Save bnoordhuis/667592 to your computer and use it in GitHub Desktop.
0001-Backport-base64-encoder-decoder-changes-from-master-.patch
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment