commit e04d15c865cea683b14bcea29f603b56e2a01cd9
Author: Tom Hughes <tom@compton.nu>
Date: Tue Nov 24 14:13:26 2015 +0000
Use system iconv
diff --git a/binding.gyp b/binding.gyp
index f3d0940..91b927e 100644
--- a/binding.gyp
+++ b/binding.gyp
@@ -2,7 +2,6 @@
'targets': [
{
'target_name': 'iconv',
- 'dependencies': ['libiconv'],
'include_dirs': ['<!(node -e "require(\'nan\')")'],
'sources': ['src/binding.cc'],
'cflags': [
@@ -18,46 +17,6 @@
'GCC_ENABLE_CPP_RTTI': 'NO',
'WARNING_CFLAGS': ['-Wall', '-Wextra', '-Wno-unused-parameter'],
},
- },
-
- {
- 'target_name': 'libiconv',
- 'type': 'static_library',
- 'direct_dependent_settings': {
- 'include_dirs': ['support'],
- },
- 'defines': ['ICONV_CONST=const', 'ENABLE_EXTRA=1'],
- 'include_dirs': [
- 'deps/libiconv/srclib',
- 'support',
- ],
- 'sources': ['deps/libiconv/lib/iconv.c'],
- 'conditions': [
- ['OS == "win"', {
- 'defines': ['WIN32_NATIVE=1'],
- }, {
- 'defines': ['HAVE_WORKING_O_NOFOLLOW=1'],
- 'cflags!': ['-W', '-Wall', '-Wextra'],
- }],
- ],
- 'msvs_settings': {
- 'VCCLCompilerTool': {
- 'DisableSpecificWarnings': [
- '4018', # Signed/unsigned comparison.
- '4090', # Const/non-const mismatch.
- '4244', # Narrowing cast.
- '4267', # Narrowing cast.
- ],
- },
- },
- 'xcode_settings': {
- 'WARNING_CFLAGS!': ['-W', '-Wall', '-Wextra'],
- 'WARNING_CFLAGS': [
- '-Wno-parentheses-equality',
- '-Wno-static-in-inline',
- '-Wno-tautological-compare',
- ],
- },
}
]
}
diff --git a/lib/iconv.js b/lib/iconv.js
index 693fd38..9c34b3e 100644
--- a/lib/iconv.js
+++ b/lib/iconv.js
@@ -49,7 +49,8 @@ function Iconv(fromEncoding, toEncoding)
fixEncoding(toEncoding));
if (conv === null) throw new Error('Conversion not supported.');
- var convert_ = convert.bind({ conv_: conv });
+ var ignore_ = toEncoding.match(/\/\/IGNORE(\/|$)/i);
+ var convert_ = convert.bind({ conv_: conv, ignore_: ignore_ });
var context_ = { trailer: null };
this.convert = function(input, encoding) {
@@ -129,7 +130,7 @@ function convert(input, context) {
input_size -= input_consumed;
output_start += output_consumed;
output_size -= output_consumed;
- if (errno) {
+ if (errno && !(errno === EILSEQ && this.ignore_)) {
if (errno === E2BIG) {
output_size += output.length;
var newbuf = new Buffer(output.length * 2);
diff --git a/src/binding.cc b/src/binding.cc
index 57a6756..36be3e6 100644
--- a/src/binding.cc
+++ b/src/binding.cc
@@ -97,7 +97,7 @@ struct Iconv
Iconv* iv = static_cast<Iconv*>(
Nan::GetInternalFieldPointer(info[0].As<Object>(), 0));
const bool is_flush = info[8]->BooleanValue();
- const char* input_buf =
+ char* input_buf =
is_flush ? NULL : node::Buffer::Data(info[1].As<Object>());
size_t input_start = info[2]->Uint32Value();
size_t input_size = info[3]->Uint32Value();
diff --git a/test/test-basic.js b/test/test-basic.js
index d933e74..135b67d 100644
--- a/test/test-basic.js
+++ b/test/test-basic.js
@@ -107,22 +107,22 @@ iconv = new Iconv('utf-8', 'ascii//ignore');
assert.equal(iconv.convert('ça va').toString(), 'a va');
iconv = new Iconv('utf-8', 'ascii//translit');
-assert.equal(iconv.convert('ça va').toString(), 'ca va');
+assert.equal(iconv.convert('ça va').toString(), '?a va');
iconv = new Iconv('utf-8', 'ascii//translit');
-assert.throws(function() { iconv.convert('ça va が'); }); // untranslatable
+assert.equal(iconv.convert('ça va が').toString(), '?a va ?');
iconv = new Iconv('utf-8', 'ascii//translit//ignore');
-assert.equal(iconv.convert('ça va が').toString(), 'ca va ');
+assert.equal(iconv.convert('ça va が').toString(), '?a va ?');
iconv = Iconv('utf-8', 'iso-8859-1');
assert.equal(iconv.convert('b2s=', 'base64').toString(), 'ok');
var aixEncodings =
- 'CP856 CP922 CP943 CP1046 CP1124 CP1129 CP1161 CP1162 CP1163';
+ 'CP856 CP922 CP1046 CP1124 CP1129 CP1161 CP1162 CP1163';
var dosEncodings =
- 'CP437 CP737 CP775 CP852 CP853 CP855 CP857 CP858 CP860 CP861 ' +
+ 'CP437 CP737 CP775 CP852 CP855 CP857 CP860 CP861 ' +
'CP863 CP864 CP865 CP869 CP1125';
// Check that AIX and DOS encodings are available.