Guest User

Untitled

a guest
Jun 21st, 2018
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.15 KB | None | 0 0
  1. From 047a5e55a0ec54ff517fb2f0f6eac426e26f4127 Mon Sep 17 00:00:00 2001
  2. From: Ben Noordhuis <info@bnoordhuis.nl>
  3. Date: Mon, 8 Nov 2010 11:57:47 +0100
  4. Subject: [PATCH] Backport base64 encoder/decoder changes from master to v0.2.
  5.  
  6. ---
  7. src/node_buffer.cc | 78 ++++++++++++++++++++++++++++++++++++---------------
  8. 1 files changed, 55 insertions(+), 23 deletions(-)
  9.  
  10. diff --git a/src/node_buffer.cc b/src/node_buffer.cc
  11. index 599c83b..dbe8940 100644
  12. --- a/src/node_buffer.cc
  13. +++ b/src/node_buffer.cc
  14. @@ -317,15 +317,24 @@ static const char *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  15. "abcdefghijklmnopqrstuvwxyz"
  16. "0123456789+/";
  17. static const int unbase64_table[] =
  18. - {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  19. + {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,-1,-1,-2,-1,-1
  20. ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  21. - ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63
  22. + ,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63
  23. ,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1
  24. ,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14
  25. ,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1
  26. ,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40
  27. ,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1
  28. + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  29. + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  30. + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  31. + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  32. + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  33. + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  34. + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  35. + ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  36. };
  37. +#define unbase64(x) unbase64_table[(uint8_t)(x)]
  38.  
  39.  
  40. Handle<Value> Buffer::Base64Slice(const Arguments &args) {
  41. @@ -367,12 +376,12 @@ Handle<Value> Buffer::Base64Slice(const Arguments &args) {
  42.  
  43. c = bitbuf[0] >> 2;
  44. assert(c < 64);
  45. - out[j++] = base64_table[c];
  46. + out[j++] = base64_table[(int)c];
  47. assert(j < out_len);
  48.  
  49. c = ((bitbuf[0] & 0x03) << 4) | (bitbuf[1] >> 4);
  50. assert(c < 64);
  51. - out[j++] = base64_table[c];
  52. + out[j++] = base64_table[(int)c];
  53. assert(j < out_len);
  54.  
  55. if (b1_oob) {
  56. @@ -380,7 +389,7 @@ Handle<Value> Buffer::Base64Slice(const Arguments &args) {
  57. } else {
  58. c = ((bitbuf[1] & 0x0F) << 2) | (bitbuf[2] >> 6);
  59. assert(c < 64);
  60. - out[j++] = base64_table[c];
  61. + out[j++] = base64_table[(int)c];
  62. }
  63. assert(j < out_len);
  64.  
  65. @@ -389,7 +398,7 @@ Handle<Value> Buffer::Base64Slice(const Arguments &args) {
  66. } else {
  67. c = bitbuf[2] & 0x3F;
  68. assert(c < 64);
  69. - out[j++] = base64_table[c];
  70. + out[j++] = base64_table[(int)c];
  71. }
  72. assert(j <= out_len);
  73. }
  74. @@ -535,16 +544,21 @@ Handle<Value> Buffer::AsciiWrite(const Arguments &args) {
  75. return scope.Close(Integer::New(written));
  76. }
  77.  
  78. -// var bytesWritten = buffer.base64Write(string, offset);
  79. +
  80. +// var bytesWritten = buffer.base64Write(string, offset, [maxLength]);
  81. Handle<Value> Buffer::Base64Write(const Arguments &args) {
  82. HandleScope scope;
  83.  
  84. - assert(unbase64_table['/'] == 63);
  85. - assert(unbase64_table['+'] == 62);
  86. - assert(unbase64_table['T'] == 19);
  87. - assert(unbase64_table['Z'] == 25);
  88. - assert(unbase64_table['t'] == 45);
  89. - assert(unbase64_table['z'] == 51);
  90. + assert(unbase64('/') == 63);
  91. + assert(unbase64('+') == 62);
  92. + assert(unbase64('T') == 19);
  93. + assert(unbase64('Z') == 25);
  94. + assert(unbase64('t') == 45);
  95. + assert(unbase64('z') == 51);
  96. +
  97. + assert(unbase64(' ') == -2);
  98. + assert(unbase64('\n') == -2);
  99. + assert(unbase64('\r') == -2);
  100.  
  101. Buffer *buffer = ObjectWrap::Unwrap<Buffer>(args.This());
  102.  
  103. @@ -574,29 +588,47 @@ Handle<Value> Buffer::Base64Write(const Arguments &args) {
  104. }
  105.  
  106. char a, b, c, d;
  107. - char *dst = buffer->data();
  108. + char* start = buffer->data() + offset;
  109. + char* dst = start;
  110. const char *src = *s;
  111. const char *const srcEnd = src + s.length();
  112.  
  113. while (src < srcEnd) {
  114. - const int remaining = srcEnd - src;
  115. + int remaining = srcEnd - src;
  116. +
  117. + while (unbase64(*src) < 0 && src < srcEnd) {
  118. + src++;
  119. + remaining--;
  120. + }
  121. if (remaining == 0 || *src == '=') break;
  122. - a = unbase64_table[*src++];
  123. + a = unbase64(*src++);
  124.  
  125. - if (remaining == 1 || *src == '=') break;
  126. - b = unbase64_table[*src++];
  127. + while (unbase64(*src) < 0 && src < srcEnd) {
  128. + src++;
  129. + remaining--;
  130. + }
  131. + if (remaining <= 1 || *src == '=') break;
  132. + b = unbase64(*src++);
  133. *dst++ = (a << 2) | ((b & 0x30) >> 4);
  134.  
  135. - if (remaining == 2 || *src == '=') break;
  136. - c = unbase64_table[*src++];
  137. + while (unbase64(*src) < 0 && src < srcEnd) {
  138. + src++;
  139. + remaining--;
  140. + }
  141. + if (remaining <= 2 || *src == '=') break;
  142. + c = unbase64(*src++);
  143. *dst++ = ((b & 0x0F) << 4) | ((c & 0x3C) >> 2);
  144.  
  145. - if (remaining == 3 || *src == '=') break;
  146. - d = unbase64_table[*src++];
  147. + while (unbase64(*src) < 0 && src < srcEnd) {
  148. + src++;
  149. + remaining--;
  150. + }
  151. + if (remaining <= 3 || *src == '=') break;
  152. + d = unbase64(*src++);
  153. *dst++ = ((c & 0x03) << 6) | (d & 0x3F);
  154. }
  155.  
  156. - return scope.Close(Integer::New(size));
  157. + return scope.Close(Integer::New(dst - start));
  158. }
  159.  
  160.  
  161. --
  162. 1.7.0.4
Add Comment
Please, Sign In to add comment