#include #define NAPI_EXPERIMENTAL #include #define NAPI_CALL(call) \ do { \ napi_status status = call; \ assert(status == napi_ok && #call " failed"); \ } while (0); #define EXPORT_FUNC(env, exports, name, func) \ do { \ napi_value js_func; \ NAPI_CALL(napi_create_function( \ (env), (name), NAPI_AUTO_LENGTH, (func), NULL, &js_func)); \ NAPI_CALL(napi_set_named_property((env), (exports), (name), js_func)); \ } while (0); const char* one_byte_string = "The Quick Brown Fox Jumped Over The Lazy Dog."; const char16_t* two_byte_string = u"The Quick Brown Fox Jumped Over The Lazy Dog."; #define DECLARE_BINDING(CapName, lowercase_name, var_name) \ static napi_value CreateString##CapName(napi_env env, \ napi_callback_info info) { \ size_t argc = 4; \ napi_value argv[4]; \ uint32_t n; \ uint32_t index; \ napi_handle_scope scope; \ napi_value js_string; \ \ NAPI_CALL(napi_get_cb_info(env, info, &argc, argv, NULL, NULL)); \ NAPI_CALL(napi_get_value_uint32(env, argv[0], &n)); \ NAPI_CALL(napi_open_handle_scope(env, &scope)); \ NAPI_CALL(napi_call_function(env, argv[1], argv[2], 0, NULL, NULL)); \ for (index = 0; index < n; index++) { \ NAPI_CALL(napi_create_string_##lowercase_name( \ env, (var_name), NAPI_AUTO_LENGTH, &js_string)); \ } \ NAPI_CALL(napi_call_function(env, argv[1], argv[3], 1, &argv[0], NULL)); \ NAPI_CALL(napi_close_handle_scope(env, scope)); \ \ return NULL; \ } DECLARE_BINDING(Latin1, latin1, one_byte_string) DECLARE_BINDING(Utf8, utf8, one_byte_string) DECLARE_BINDING(Utf16, utf16, two_byte_string) NAPI_MODULE_INIT() { EXPORT_FUNC(env, exports, "createStringLatin1", CreateStringLatin1); EXPORT_FUNC(env, exports, "createStringUtf8", CreateStringUtf8); EXPORT_FUNC(env, exports, "createStringUtf16", CreateStringUtf16); return exports; }