UNPKG

ref-wchar

Version:

A ref "type" implementation of `wchar_t *` (a.k.a. wide string) backed by "node-iconv"

90 lines (76 loc) 2.3 kB
/** * Module dependencies. */ var ref = require('ref'); var Iconv = require('iconv').Iconv; /** * On Windows they're UTF-16 (2-bytes), * but on Unix platform they're UTF-32 (4-bytes). * * TODO: add a way to optionally enable `-fshort-wchar` for Unix (gcc option). */ var size; if ('win32' == process.platform) { size = 2; } else { size = 4; } var getter = new Iconv('UTF-' + (8 * size) + ref.endianness, 'UTF-8'); var setter = new Iconv('UTF-8', 'UTF-' + (8 * size) + ref.endianness); /** * The `wchar_t` type. */ exports = module.exports = Object.create(ref.types['int' + (8 * size)]); exports.name = 'wchar_t'; exports.size = size; exports.indirection = 1; exports.get = function get (buf, offset) { if (offset > 0 || buf.length !== exports.size) { offset = offset | 0; buf = buf.slice(offset, offset + size); } return exports.toString(buf); }; exports.set = function set (buf, offset, val) { var _buf = val; // assume val is a Buffer by default if (typeof val === 'string') { _buf = setter.convert(val[0]); } else if (typeof val === 'number') { _buf = setter.convert(String.fromCharCode(val)); } else if (!_buf) { throw new TypeError('muss pass a String, Number, or Buffer for `wchar_t`'); } return _buf.copy(buf, offset, 0, size); }; /** * The "wchar_t *" type. * * We use the "CString" type as a base since it's pretty close to what we * actually want. We just have to define custom "get" and "set" functions. */ exports.string = Object.create(ref.types.CString); exports.string.name = 'WCString'; exports.string.get = function get (buf, offset) { var _buf = buf.readPointer(offset); if (_buf.isNull()) { return null; } var stringBuf = _buf.reinterpretUntilZeros(exports.size); return exports.toString(stringBuf); }; exports.string.set = function set (buf, offset, val) { var _buf = val; // val is a Buffer? it better be \0 terminated... if ('string' == typeof val) { _buf = setter.convert(val + '\0'); } return buf.writePointer(_buf, offset); }; /** * Turns a `wchar_t *` Buffer instance into a JavaScript String instance. * * @param {Buffer} buffer - buffer instance to serialize * @public */ exports.toString = function toString (buffer) { return getter.convert(buffer).toString('utf8'); };