Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
Fix Buffer.write() with UCS-2 should not be write partial char
Browse files Browse the repository at this point in the history
closes #916.
  • Loading branch information
koichik authored and ry committed Apr 13, 2011
1 parent 301f53c commit 9533e87
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
6 changes: 5 additions & 1 deletion src/node_buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -495,14 +495,18 @@ Handle<Value> Buffer::Ucs2Write(const Arguments &args) {

size_t max_length = args[2]->IsUndefined() ? buffer->length_ - offset
: args[2]->Uint32Value();
max_length = MIN(buffer->length_ - offset, max_length);
max_length = MIN(buffer->length_ - offset, max_length) / 2;

uint16_t* p = (uint16_t*)(buffer->data_ + offset);

int written = s->Write(p,
0,
max_length,
String::HINT_MANY_WRITES_EXPECTED);

constructor_template->GetFunction()->Set(chars_written_sym,
Integer::New(written));

return scope.Close(Integer::New(written * 2));
}

Expand Down
9 changes: 9 additions & 0 deletions test/simple/test-buffer.js
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,15 @@ console.error('f.length: %d (should be 12)', f.length);
assert.deepEqual(f, new Buffer([63, 4, 64, 4, 56, 4, 50, 4, 53, 4, 66, 4]));
assert.equal(f.toString('ucs2'), 'привет');

var f = new Buffer([0, 0, 0, 0, 0]);
assert.equal(f.length, 5);
var size = f.write('あいうえお', 'ucs2');
console.error('bytes written to buffer: %d (should be 4)', size);
console.error('chars written to buffer: %d (should be 2)', Buffer._charsWritten);
assert.equal(size, 4);
assert.equal(Buffer._charsWritten, 2);
assert.deepEqual(f, new Buffer([0x42, 0x30, 0x44, 0x30, 0x00]));


var arrayIsh = {0: 0, 1: 1, 2: 2, 3: 3, length: 4};
var g = new Buffer(arrayIsh);
Expand Down

0 comments on commit 9533e87

Please sign in to comment.