koffi 1.3.2 → 1.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/CMakeLists.txt +27 -3
  2. package/ChangeLog.md +46 -14
  3. package/build/qemu/1.3.5/koffi_darwin_arm64.tar.gz +0 -0
  4. package/build/qemu/1.3.5/koffi_darwin_x64.tar.gz +0 -0
  5. package/build/qemu/1.3.5/koffi_freebsd_arm64.tar.gz +0 -0
  6. package/build/qemu/1.3.5/koffi_freebsd_ia32.tar.gz +0 -0
  7. package/build/qemu/1.3.5/koffi_freebsd_x64.tar.gz +0 -0
  8. package/build/qemu/1.3.5/koffi_linux_arm32hf.tar.gz +0 -0
  9. package/build/qemu/1.3.5/koffi_linux_arm64.tar.gz +0 -0
  10. package/build/qemu/1.3.5/koffi_linux_ia32.tar.gz +0 -0
  11. package/build/qemu/1.3.5/koffi_linux_riscv64hf64.tar.gz +0 -0
  12. package/build/qemu/1.3.5/koffi_linux_x64.tar.gz +0 -0
  13. package/build/qemu/1.3.5/koffi_openbsd_ia32.tar.gz +0 -0
  14. package/build/qemu/1.3.5/koffi_openbsd_x64.tar.gz +0 -0
  15. package/build/qemu/1.3.5/koffi_win32_arm64.tar.gz +0 -0
  16. package/build/qemu/1.3.5/koffi_win32_ia32.tar.gz +0 -0
  17. package/build/qemu/1.3.5/koffi_win32_x64.tar.gz +0 -0
  18. package/doc/_static/perf_linux_20220623.png +0 -0
  19. package/doc/_static/perf_linux_20220623_2.png +0 -0
  20. package/doc/_static/perf_windows_20220623.png +0 -0
  21. package/doc/_static/perf_windows_20220623_2.png +0 -0
  22. package/doc/benchmarks.md +40 -36
  23. package/doc/benchmarks.xlsx +0 -0
  24. package/doc/changes.md +2 -0
  25. package/doc/conf.py +10 -3
  26. package/doc/contribute.md +16 -0
  27. package/doc/dist/doctrees/benchmarks.doctree +0 -0
  28. package/doc/dist/doctrees/changes.doctree +0 -0
  29. package/doc/dist/doctrees/contribute.doctree +0 -0
  30. package/doc/dist/doctrees/environment.pickle +0 -0
  31. package/doc/dist/doctrees/functions.doctree +0 -0
  32. package/doc/dist/doctrees/index.doctree +0 -0
  33. package/doc/dist/doctrees/memory.doctree +0 -0
  34. package/doc/dist/doctrees/platforms.doctree +0 -0
  35. package/doc/dist/doctrees/start.doctree +0 -0
  36. package/doc/dist/doctrees/types.doctree +0 -0
  37. package/doc/dist/html/_sources/benchmarks.md.txt +40 -36
  38. package/doc/dist/html/_sources/changes.md.txt +2 -0
  39. package/doc/dist/html/_sources/contribute.md.txt +16 -0
  40. package/doc/dist/html/_sources/functions.md.txt +18 -14
  41. package/doc/dist/html/_sources/index.rst.txt +2 -1
  42. package/doc/dist/html/_sources/memory.md.txt +6 -3
  43. package/doc/dist/html/_sources/platforms.md.txt +2 -0
  44. package/doc/dist/html/_sources/start.md.txt +3 -3
  45. package/doc/dist/html/_sources/types.md.txt +10 -8
  46. package/doc/dist/html/_static/perf_linux_20220623.png +0 -0
  47. package/doc/dist/html/_static/perf_linux_20220623_2.png +0 -0
  48. package/doc/dist/html/_static/perf_windows_20220623.png +0 -0
  49. package/doc/dist/html/_static/perf_windows_20220623_2.png +0 -0
  50. package/doc/dist/html/_static/pygments.css +54 -54
  51. package/doc/dist/html/benchmarks.html +52 -20
  52. package/doc/dist/html/changes.html +391 -0
  53. package/doc/dist/html/contribute.html +24 -2
  54. package/doc/dist/html/functions.html +83 -84
  55. package/doc/dist/html/genindex.html +1 -0
  56. package/doc/dist/html/index.html +18 -3
  57. package/doc/dist/html/memory.html +11 -5
  58. package/doc/dist/html/objects.inv +0 -0
  59. package/doc/dist/html/platforms.html +3 -1
  60. package/doc/dist/html/search.html +1 -0
  61. package/doc/dist/html/searchindex.js +1 -1
  62. package/doc/dist/html/start.html +48 -47
  63. package/doc/dist/html/types.html +161 -159
  64. package/doc/functions.md +18 -14
  65. package/doc/index.rst +2 -1
  66. package/doc/memory.md +6 -3
  67. package/doc/platforms.md +2 -0
  68. package/doc/start.md +3 -3
  69. package/doc/types.md +10 -8
  70. package/package.json +2 -2
  71. package/qemu/qemu.js +1 -0
  72. package/qemu/registry/machines.json +6 -11
  73. package/src/abi_arm32.cc +9 -9
  74. package/src/abi_arm64.cc +9 -9
  75. package/src/abi_riscv64.cc +9 -9
  76. package/src/abi_x64_sysv.cc +9 -9
  77. package/src/abi_x64_win.cc +9 -9
  78. package/src/abi_x86.cc +9 -9
  79. package/src/call.cc +8 -7
  80. package/src/call.hh +6 -0
  81. package/src/ffi.cc +73 -22
  82. package/src/ffi.hh +11 -4
  83. package/src/parser.cc +1 -1
  84. package/src/util.hh +21 -1
  85. package/test/async.js +1 -1
  86. package/test/misc.c +20 -0
  87. package/test/sync.js +13 -3
  88. package/vendor/libcc/libcc.hh +1 -1
  89. package/build/qemu/1.3.2/koffi_darwin_arm64.tar.gz +0 -0
  90. package/build/qemu/1.3.2/koffi_darwin_x64.tar.gz +0 -0
  91. package/build/qemu/1.3.2/koffi_freebsd_arm64.tar.gz +0 -0
  92. package/build/qemu/1.3.2/koffi_freebsd_ia32.tar.gz +0 -0
  93. package/build/qemu/1.3.2/koffi_freebsd_x64.tar.gz +0 -0
  94. package/build/qemu/1.3.2/koffi_linux_arm32hf.tar.gz +0 -0
  95. package/build/qemu/1.3.2/koffi_linux_arm64.tar.gz +0 -0
  96. package/build/qemu/1.3.2/koffi_linux_ia32.tar.gz +0 -0
  97. package/build/qemu/1.3.2/koffi_linux_riscv64hf64.tar.gz +0 -0
  98. package/build/qemu/1.3.2/koffi_linux_x64.tar.gz +0 -0
  99. package/build/qemu/1.3.2/koffi_openbsd_ia32.tar.gz +0 -0
  100. package/build/qemu/1.3.2/koffi_openbsd_x64.tar.gz +0 -0
  101. package/build/qemu/1.3.2/koffi_win32_arm64.tar.gz +0 -0
  102. package/build/qemu/1.3.2/koffi_win32_ia32.tar.gz +0 -0
  103. package/build/qemu/1.3.2/koffi_win32_x64.tar.gz +0 -0
@@ -169,6 +169,7 @@
169
169
  <li class="toctree-l1"><a class="reference internal" href="memory">Memory usage</a></li>
170
170
  <li class="toctree-l1"><a class="reference internal" href="benchmarks">Benchmarks</a></li>
171
171
  <li class="toctree-l1"><a class="reference internal" href="contribute">Contributing</a></li>
172
+ <li class="toctree-l1"><a class="reference internal" href="changes">Changelog</a></li>
172
173
  </ul>
173
174
 
174
175
  </div>
@@ -431,6 +432,7 @@
431
432
  </tbody>
432
433
  </table>
433
434
  </div>
435
+ <p>Koffi also accepts BigInt values when converting from JS to C integers. If the value exceeds the range of the C type, Koffi will convert the number to an undefined value. In the reverse direction, BigInt values are automatically used when needed for big 64-bit integers.</p>
434
436
  <p>Koffi defines a few more types that can change size depending on the OS and the architecture:</p>
435
437
  <div class="table-wrapper colwidths-auto docutils container">
436
438
  <table class="docutils align-default">
@@ -476,9 +478,9 @@
476
478
  </table>
477
479
  </div>
478
480
  <p>Primitive types can be specified by name (in a string) or through <code class="docutils literal notranslate"><span class="pre">koffi.types</span></code>:</p>
479
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// These two lines do the same:</span>
480
- <span class="linenos">2</span><span class="kd">let</span> <span class="nx">struct1</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">({</span> <span class="nx">dummy</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span> <span class="p">});</span>
481
- <span class="linenos">3</span><span class="kd">let</span> <span class="nx">struct2</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">({</span> <span class="nx">dummy</span><span class="o">:</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">types</span><span class="p">.</span><span class="kr">long</span> <span class="p">});</span>
481
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// These two lines do the same:</span><span class="w"></span>
482
+ <span class="linenos">2</span><span class="kd">let</span><span class="w"> </span><span class="nx">struct1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">({</span><span class="w"> </span><span class="nx">dummy</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="w"> </span><span class="p">});</span><span class="w"></span>
483
+ <span class="linenos">3</span><span class="kd">let</span><span class="w"> </span><span class="nx">struct2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">({</span><span class="w"> </span><span class="nx">dummy</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">types</span><span class="p">.</span><span class="kr">long</span><span class="w"> </span><span class="p">});</span><span class="w"></span>
482
484
  </pre></div>
483
485
  </div>
484
486
  </section>
@@ -498,22 +500,22 @@
498
500
  <span class="linenos">9</span><span class="p">}</span><span class="w"> </span><span class="n">A</span><span class="p">;</span><span class="w"></span>
499
501
  </pre></div>
500
502
  </div>
501
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span> <span class="nx">A</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;A&#39;</span><span class="p">,</span> <span class="p">{</span>
502
- <span class="linenos">2</span> <span class="nx">a</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
503
- <span class="linenos">3</span> <span class="nx">b</span><span class="o">:</span> <span class="s1">&#39;char&#39;</span><span class="p">,</span>
504
- <span class="linenos">4</span> <span class="nx">c</span><span class="o">:</span> <span class="s1">&#39;string&#39;</span><span class="p">,</span>
505
- <span class="linenos">5</span> <span class="nx">d</span><span class="o">:</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">({</span>
506
- <span class="linenos">6</span> <span class="nx">d1</span><span class="o">:</span> <span class="s1">&#39;double&#39;</span><span class="p">,</span>
507
- <span class="linenos">7</span> <span class="nx">d2</span><span class="o">:</span> <span class="s1">&#39;double&#39;</span>
508
- <span class="linenos">8</span> <span class="p">})</span>
509
- <span class="linenos">9</span><span class="p">});</span>
503
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span><span class="w"> </span><span class="nx">A</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;A&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
504
+ <span class="linenos">2</span><span class="w"> </span><span class="nx">a</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
505
+ <span class="linenos">3</span><span class="w"> </span><span class="nx">b</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;char&#39;</span><span class="p">,</span><span class="w"></span>
506
+ <span class="linenos">4</span><span class="w"> </span><span class="nx">c</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;string&#39;</span><span class="p">,</span><span class="w"></span>
507
+ <span class="linenos">5</span><span class="w"> </span><span class="nx">d</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">({</span><span class="w"></span>
508
+ <span class="linenos">6</span><span class="w"> </span><span class="nx">d1</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;double&#39;</span><span class="p">,</span><span class="w"></span>
509
+ <span class="linenos">7</span><span class="w"> </span><span class="nx">d2</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;double&#39;</span><span class="w"></span>
510
+ <span class="linenos">8</span><span class="w"> </span><span class="p">})</span><span class="w"></span>
511
+ <span class="linenos">9</span><span class="p">});</span><span class="w"></span>
510
512
  </pre></div>
511
513
  </div>
512
514
  <p>Koffi follows the C and ABI rules regarding struct alignment and padding.</p>
513
- <p>Once a struct is declared, you can use it by name (with a string, like you can do for primitive types) or the through the value returned by the call to <code class="docutils literal notranslate"><span class="pre">koffi.struct()</span></code>. Only the latter is possible when declaring an anonymous struct.</p>
514
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// The following two function declarations are equivalent, and declare a function taking an A value and returning A</span>
515
- <span class="linenos">2</span><span class="kd">const</span> <span class="nx">Function1</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;A Function(A value)&#39;</span><span class="p">);</span>
516
- <span class="linenos">3</span><span class="kd">const</span> <span class="nx">Function2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;Function&#39;</span><span class="p">,</span> <span class="nx">A</span><span class="p">,</span> <span class="p">[</span><span class="nx">A</span><span class="p">]);</span>
515
+ <p>Once a struct is declared, you can use it by name (with a string, like you can do for primitive types) or through the value returned by the call to <code class="docutils literal notranslate"><span class="pre">koffi.struct()</span></code>. Only the latter is possible when declaring an anonymous struct.</p>
516
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// The following two function declarations are equivalent, and declare a function taking an A value and returning A</span><span class="w"></span>
517
+ <span class="linenos">2</span><span class="kd">const</span><span class="w"> </span><span class="nx">Function1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;A Function(A value)&#39;</span><span class="p">);</span><span class="w"></span>
518
+ <span class="linenos">3</span><span class="kd">const</span><span class="w"> </span><span class="nx">Function2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;Function&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">A</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="nx">A</span><span class="p">]);</span><span class="w"></span>
517
519
  </pre></div>
518
520
  </div>
519
521
  </section>
@@ -521,31 +523,31 @@
521
523
  <h2>Pointer types<a class="headerlink" href="#pointer-types" title="Permalink to this heading">#</a></h2>
522
524
  <p>In C, pointer arguments are used for differenty purposes. It is important to distinguish these use cases because Koffi provides different ways to deal with each of them:</p>
523
525
  <ul class="simple">
524
- <li><p><strong>Struct pointers</strong>: Use of struct pointers by C libraries fall in two cases: avoid (potentially) expensive copies, and to let the function change struct contents (output or input/output argument).</p></li>
525
- <li><p><strong>Opaque handles</strong>: the library does not expose the contents of the structs, and only provides you with a pointer to it (e.g. <code class="docutils literal notranslate"><span class="pre">sqlite3_stmt</span></code>). Only the functions provided by the library can do something with this pointer, in Koffi we call this a handle. This is usually done for ABI-stability reason, and to prevent library users from messing directly with library internals.</p></li>
526
- <li><p><strong>Arrays</strong>: in C, you dynamically-sized arrays are usually passed to functions with pointers, either NULL-terminated or with an additional length argument.</p></li>
526
+ <li><p><strong>Struct pointers</strong>: Use of struct pointers by C libraries fall in two cases: avoid (potentially) expensive copies, and to let the function change struct contents (output or input/output arguments).</p></li>
527
+ <li><p><strong>Opaque handles</strong>: the library does not expose the contents of the structs, and only provides you with a pointer to it (e.g. <code class="docutils literal notranslate"><span class="pre">FILE</span> <span class="pre">*</span></code>). Only the functions provided by the library can do something with this pointer, in Koffi we call this a handle. This is usually done for ABI-stability reason, and to prevent library users from messing directly with library internals.</p></li>
528
+ <li><p><strong>Arrays</strong>: in C, you dynamically-sized arrays are usually passed to functions with pointers, either NULL-terminated (or any other sentinel value) or with an additional length argument.</p></li>
527
529
  <li><p><strong>Pointers to primitive types</strong>: This is more rare, and generally used for output or input/output arguments. The Win32 API has a lot of these.</p></li>
528
530
  </ul>
529
531
  <section id="struct-pointers">
530
532
  <h3>Struct pointers<a class="headerlink" href="#struct-pointers" title="Permalink to this heading">#</a></h3>
531
533
  <p>The following Win32 example uses <code class="docutils literal notranslate"><span class="pre">GetCursorPos()</span></code> (with an output parameter) to retrieve and show the current cursor position.</p>
532
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span> <span class="nx">koffi</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span>
533
- <span class="linenos"> 2</span><span class="kd">const</span> <span class="nx">lib</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;kernel32.dll&#39;</span><span class="p">);</span>
534
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
535
+ <span class="linenos"> 2</span><span class="kd">const</span><span class="w"> </span><span class="nx">lib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;kernel32.dll&#39;</span><span class="p">);</span><span class="w"></span>
534
536
  <span class="linenos"> 3</span>
535
- <span class="linenos"> 4</span><span class="c1">// Type declarations</span>
536
- <span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">POINT</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;POINT&#39;</span><span class="p">,</span> <span class="p">{</span>
537
- <span class="linenos"> 6</span> <span class="nx">x</span><span class="o">:</span> <span class="s1">&#39;long&#39;</span><span class="p">,</span>
538
- <span class="linenos"> 7</span> <span class="nx">y</span><span class="o">:</span> <span class="s1">&#39;long&#39;</span>
539
- <span class="linenos"> 8</span><span class="p">});</span>
537
+ <span class="linenos"> 4</span><span class="c1">// Type declarations</span><span class="w"></span>
538
+ <span class="linenos"> 5</span><span class="kd">const</span><span class="w"> </span><span class="nx">POINT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;POINT&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
539
+ <span class="linenos"> 6</span><span class="w"> </span><span class="nx">x</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;long&#39;</span><span class="p">,</span><span class="w"></span>
540
+ <span class="linenos"> 7</span><span class="w"> </span><span class="nx">y</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;long&#39;</span><span class="w"></span>
541
+ <span class="linenos"> 8</span><span class="p">});</span><span class="w"></span>
540
542
  <span class="linenos"> 9</span>
541
- <span class="linenos">10</span><span class="c1">// Functions declarations</span>
542
- <span class="linenos">11</span><span class="kd">const</span> <span class="nx">GetCursorPos</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int __stdcall GetCursorPos(_Out_ POINT *pos)&#39;</span><span class="p">);</span>
543
+ <span class="linenos">10</span><span class="c1">// Functions declarations</span><span class="w"></span>
544
+ <span class="linenos">11</span><span class="kd">const</span><span class="w"> </span><span class="nx">GetCursorPos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int __stdcall GetCursorPos(_Out_ POINT *pos)&#39;</span><span class="p">);</span><span class="w"></span>
543
545
  <span class="linenos">12</span>
544
- <span class="linenos">13</span><span class="c1">// Get and show cursor position</span>
545
- <span class="linenos">14</span><span class="kd">let</span> <span class="nx">pos</span> <span class="o">=</span> <span class="p">{};</span>
546
- <span class="linenos">15</span><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">GetCursorPos</span><span class="p">(</span><span class="nx">pos</span><span class="p">))</span>
547
- <span class="linenos">16</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Failed to get cursor position&#39;</span><span class="p">);</span>
548
- <span class="linenos">17</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">pos</span><span class="p">);</span>
546
+ <span class="linenos">13</span><span class="c1">// Get and show cursor position</span><span class="w"></span>
547
+ <span class="linenos">14</span><span class="kd">let</span><span class="w"> </span><span class="nx">pos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{};</span><span class="w"></span>
548
+ <span class="linenos">15</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">GetCursorPos</span><span class="p">(</span><span class="nx">pos</span><span class="p">))</span><span class="w"></span>
549
+ <span class="linenos">16</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Failed to get cursor position&#39;</span><span class="p">);</span><span class="w"></span>
550
+ <span class="linenos">17</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">pos</span><span class="p">);</span><span class="w"></span>
549
551
  </pre></div>
550
552
  </div>
551
553
  </section>
@@ -672,54 +674,54 @@
672
674
  <span class="linenos">116</span><span class="p">}</span><span class="w"></span>
673
675
  </pre></div>
674
676
  </div>
675
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span> <span class="nx">koffi</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span>
676
- <span class="linenos"> 2</span><span class="kd">const</span> <span class="nx">lib</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;./handles.so&#39;</span><span class="p">);</span>
677
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
678
+ <span class="linenos"> 2</span><span class="kd">const</span><span class="w"> </span><span class="nx">lib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;./handles.so&#39;</span><span class="p">);</span><span class="w"></span>
677
679
  <span class="linenos"> 3</span>
678
- <span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">Concat</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">&#39;Concat&#39;</span><span class="p">);</span>
679
- <span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">ConcatNewOut</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;bool ConcatNewOut(Concat *out)&#39;</span><span class="p">);</span>
680
- <span class="linenos"> 6</span><span class="kd">const</span> <span class="nx">ConcatNew</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;Concat ConcatNew()&#39;</span><span class="p">);</span>
681
- <span class="linenos"> 7</span><span class="kd">const</span> <span class="nx">ConcatFree</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;void ConcatFree(Concat c)&#39;</span><span class="p">);</span>
682
- <span class="linenos"> 8</span><span class="kd">const</span> <span class="nx">ConcatAppend</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;bool ConcatAppend(Concat c, const char *frag)&#39;</span><span class="p">);</span>
683
- <span class="linenos"> 9</span><span class="kd">const</span> <span class="nx">ConcatBuild</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;const char *ConcatBuild(Concat c)&#39;</span><span class="p">);</span>
680
+ <span class="linenos"> 4</span><span class="kd">const</span><span class="w"> </span><span class="nx">Concat</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">&#39;Concat&#39;</span><span class="p">);</span><span class="w"></span>
681
+ <span class="linenos"> 5</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatNewOut</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;bool ConcatNewOut(Concat *out)&#39;</span><span class="p">);</span><span class="w"></span>
682
+ <span class="linenos"> 6</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatNew</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;Concat ConcatNew()&#39;</span><span class="p">);</span><span class="w"></span>
683
+ <span class="linenos"> 7</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatFree</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;void ConcatFree(Concat c)&#39;</span><span class="p">);</span><span class="w"></span>
684
+ <span class="linenos"> 8</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatAppend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;bool ConcatAppend(Concat c, const char *frag)&#39;</span><span class="p">);</span><span class="w"></span>
685
+ <span class="linenos"> 9</span><span class="kd">const</span><span class="w"> </span><span class="nx">ConcatBuild</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;const char *ConcatBuild(Concat c)&#39;</span><span class="p">);</span><span class="w"></span>
684
686
  <span class="linenos">10</span>
685
- <span class="linenos">11</span><span class="kd">let</span> <span class="nx">c</span> <span class="o">=</span> <span class="nx">ConcatNew</span><span class="p">();</span>
686
- <span class="linenos">12</span><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">c</span><span class="p">)</span> <span class="p">{</span>
687
- <span class="linenos">13</span> <span class="c1">// This is stupid, it does the same, but try both versions (return value, output parameter)</span>
688
- <span class="linenos">14</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">ConcatNewOut</span><span class="p">(</span><span class="nx">c</span><span class="p">))</span>
689
- <span class="linenos">15</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span>
690
- <span class="linenos">16</span><span class="p">}</span>
687
+ <span class="linenos">11</span><span class="kd">let</span><span class="w"> </span><span class="nx">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">ConcatNew</span><span class="p">();</span><span class="w"></span>
688
+ <span class="linenos">12</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">c</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
689
+ <span class="linenos">13</span><span class="w"> </span><span class="c1">// This is stupid, it does the same, but try both versions (return value, output parameter)</span><span class="w"></span>
690
+ <span class="linenos">14</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatNewOut</span><span class="p">(</span><span class="nx">c</span><span class="p">))</span><span class="w"></span>
691
+ <span class="linenos">15</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span><span class="w"></span>
692
+ <span class="linenos">16</span><span class="p">}</span><span class="w"></span>
691
693
  <span class="linenos">17</span>
692
- <span class="linenos">18</span><span class="k">try</span> <span class="p">{</span>
693
- <span class="linenos">19</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span> <span class="s1">&#39;Hello... &#39;</span><span class="p">))</span>
694
- <span class="linenos">20</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span>
695
- <span class="linenos">21</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span> <span class="s1">&#39;World!\n&#39;</span><span class="p">))</span>
696
- <span class="linenos">22</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span>
694
+ <span class="linenos">18</span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
695
+ <span class="linenos">19</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;Hello... &#39;</span><span class="p">))</span><span class="w"></span>
696
+ <span class="linenos">20</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span><span class="w"></span>
697
+ <span class="linenos">21</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;World!\n&#39;</span><span class="p">))</span><span class="w"></span>
698
+ <span class="linenos">22</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span><span class="w"></span>
697
699
  <span class="linenos">23</span>
698
- <span class="linenos">24</span> <span class="k">for</span> <span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mf">1</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="mf">30</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
699
- <span class="linenos">25</span> <span class="kd">let</span> <span class="nx">frag</span><span class="p">;</span>
700
- <span class="linenos">26</span> <span class="k">if</span> <span class="p">(</span><span class="nx">i</span> <span class="o">%</span> <span class="mf">15</span> <span class="o">==</span> <span class="mf">0</span><span class="p">)</span> <span class="p">{</span>
701
- <span class="linenos">27</span> <span class="nx">frag</span> <span class="o">=</span> <span class="s1">&#39;FizzBuzz&#39;</span><span class="p">;</span>
702
- <span class="linenos">28</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">i</span> <span class="o">%</span> <span class="mf">5</span> <span class="o">==</span> <span class="mf">0</span><span class="p">)</span> <span class="p">{</span>
703
- <span class="linenos">29</span> <span class="nx">frag</span> <span class="o">=</span> <span class="s1">&#39;Buzz&#39;</span><span class="p">;</span>
704
- <span class="linenos">30</span> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">i</span> <span class="o">%</span> <span class="mf">3</span> <span class="o">==</span> <span class="mf">0</span><span class="p">)</span> <span class="p">{</span>
705
- <span class="linenos">31</span> <span class="nx">frag</span> <span class="o">=</span> <span class="s1">&#39;Fizz&#39;</span><span class="p">;</span>
706
- <span class="linenos">32</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
707
- <span class="linenos">33</span> <span class="nx">frag</span> <span class="o">=</span> <span class="nb">String</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
708
- <span class="linenos">34</span> <span class="p">}</span>
700
+ <span class="linenos">24</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">let</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">1</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="mf">30</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
701
+ <span class="linenos">25</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">frag</span><span class="p">;</span><span class="w"></span>
702
+ <span class="linenos">26</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="mf">15</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
703
+ <span class="linenos">27</span><span class="w"> </span><span class="nx">frag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;FizzBuzz&#39;</span><span class="p">;</span><span class="w"></span>
704
+ <span class="linenos">28</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="mf">5</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
705
+ <span class="linenos">29</span><span class="w"> </span><span class="nx">frag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;Buzz&#39;</span><span class="p">;</span><span class="w"></span>
706
+ <span class="linenos">30</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="mf">3</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
707
+ <span class="linenos">31</span><span class="w"> </span><span class="nx">frag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;Fizz&#39;</span><span class="p">;</span><span class="w"></span>
708
+ <span class="linenos">32</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
709
+ <span class="linenos">33</span><span class="w"> </span><span class="nx">frag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">String</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span><span class="w"></span>
710
+ <span class="linenos">34</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
709
711
  <span class="linenos">35</span>
710
- <span class="linenos">36</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span> <span class="nx">frag</span><span class="p">))</span>
711
- <span class="linenos">37</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span>
712
- <span class="linenos">38</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span> <span class="s1">&#39; &#39;</span><span class="p">))</span>
713
- <span class="linenos">39</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span>
714
- <span class="linenos">40</span> <span class="p">}</span>
712
+ <span class="linenos">36</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span><span class="w"> </span><span class="nx">frag</span><span class="p">))</span><span class="w"></span>
713
+ <span class="linenos">37</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span><span class="w"></span>
714
+ <span class="linenos">38</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">ConcatAppend</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39; &#39;</span><span class="p">))</span><span class="w"></span>
715
+ <span class="linenos">39</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span><span class="w"></span>
716
+ <span class="linenos">40</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
715
717
  <span class="linenos">41</span>
716
- <span class="linenos">42</span> <span class="kd">let</span> <span class="nx">str</span> <span class="o">=</span> <span class="nx">ConcatBuild</span><span class="p">(</span><span class="nx">c</span><span class="p">);</span>
717
- <span class="linenos">43</span> <span class="k">if</span> <span class="p">(</span><span class="nx">str</span> <span class="o">==</span> <span class="kc">null</span><span class="p">)</span>
718
- <span class="linenos">44</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span>
719
- <span class="linenos">45</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">str</span><span class="p">);</span>
720
- <span class="linenos">46</span><span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
721
- <span class="linenos">47</span> <span class="nx">ConcatFree</span><span class="p">(</span><span class="nx">c</span><span class="p">);</span>
722
- <span class="linenos">48</span><span class="p">}</span>
718
+ <span class="linenos">42</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">str</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">ConcatBuild</span><span class="p">(</span><span class="nx">c</span><span class="p">);</span><span class="w"></span>
719
+ <span class="linenos">43</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">str</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"></span>
720
+ <span class="linenos">44</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;Allocation failure&#39;</span><span class="p">);</span><span class="w"></span>
721
+ <span class="linenos">45</span><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">str</span><span class="p">);</span><span class="w"></span>
722
+ <span class="linenos">46</span><span class="p">}</span><span class="w"> </span><span class="k">finally</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
723
+ <span class="linenos">47</span><span class="w"> </span><span class="nx">ConcatFree</span><span class="p">(</span><span class="nx">c</span><span class="p">);</span><span class="w"></span>
724
+ <span class="linenos">48</span><span class="p">}</span><span class="w"></span>
723
725
  </pre></div>
724
726
  </div>
725
727
  </section>
@@ -747,107 +749,107 @@
747
749
  <span class="linenos">17</span><span class="p">}</span><span class="w"></span>
748
750
  </pre></div>
749
751
  </div>
750
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span> <span class="nx">koffi</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span>
751
- <span class="linenos">2</span><span class="kd">const</span> <span class="nx">lib</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;./length.so&#39;</span><span class="p">);</span>
752
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
753
+ <span class="linenos">2</span><span class="kd">const</span><span class="w"> </span><span class="nx">lib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;./length.so&#39;</span><span class="p">);</span><span class="w"></span>
752
754
  <span class="linenos">3</span>
753
- <span class="linenos">4</span><span class="kd">const</span> <span class="nx">ComputeTotalLength</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int64_t ComputeTotalLength(const char **strings)&#39;</span><span class="p">);</span>
755
+ <span class="linenos">4</span><span class="kd">const</span><span class="w"> </span><span class="nx">ComputeTotalLength</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;int64_t ComputeTotalLength(const char **strings)&#39;</span><span class="p">);</span><span class="w"></span>
754
756
  <span class="linenos">5</span>
755
- <span class="linenos">6</span><span class="kd">let</span> <span class="nx">strings</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Get&#39;</span><span class="p">,</span> <span class="s1">&#39;Total&#39;</span><span class="p">,</span> <span class="s1">&#39;Length&#39;</span><span class="p">,</span> <span class="kc">null</span><span class="p">];</span>
756
- <span class="linenos">7</span><span class="kd">let</span> <span class="nx">total</span> <span class="o">=</span> <span class="nx">ComputeTotalLength</span><span class="p">(</span><span class="nx">strings</span><span class="p">);</span>
757
+ <span class="linenos">6</span><span class="kd">let</span><span class="w"> </span><span class="nx">strings</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;Get&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;Total&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;Length&#39;</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">];</span><span class="w"></span>
758
+ <span class="linenos">7</span><span class="kd">let</span><span class="w"> </span><span class="nx">total</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">ComputeTotalLength</span><span class="p">(</span><span class="nx">strings</span><span class="p">);</span><span class="w"></span>
757
759
  <span class="linenos">8</span>
758
- <span class="linenos">9</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">total</span><span class="p">);</span> <span class="c1">// Prints 14n (big int)</span>
760
+ <span class="linenos">9</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">total</span><span class="p">);</span><span class="w"> </span><span class="c1">// Prints 14</span><span class="w"></span>
759
761
  </pre></div>
760
762
  </div>
761
763
  <p>By default, just like for objects, array arguments are copied from JS to C but not vice-versa. You can however change the direction as documented in the section on <a class="reference internal" href="functions#output-parameters"><span class="std std-doc">output parameters</span></a>.</p>
762
764
  <p>Here is an example based on the Win32 API, listing files in the current directory with <code class="docutils literal notranslate"><span class="pre">FindFirstFileW()</span></code> and <code class="docutils literal notranslate"><span class="pre">FindNextFileW()</span></code>:</p>
763
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span> <span class="nx">koffi</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span>
764
- <span class="linenos"> 2</span><span class="kd">const</span> <span class="nx">lib</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;kernel32.dll&#39;</span><span class="p">);</span>
765
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
766
+ <span class="linenos"> 2</span><span class="kd">const</span><span class="w"> </span><span class="nx">lib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="s1">&#39;kernel32.dll&#39;</span><span class="p">);</span><span class="w"></span>
765
767
  <span class="linenos"> 3</span>
766
- <span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">HANDLE</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">&#39;HANDLE&#39;</span><span class="p">);</span>
767
- <span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">FILETIME</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;FILETIME&#39;</span><span class="p">,</span> <span class="p">{</span>
768
- <span class="linenos"> 6</span> <span class="nx">dwLowDateTime</span><span class="o">:</span> <span class="s1">&#39;uint&#39;</span><span class="p">,</span>
769
- <span class="linenos"> 7</span> <span class="nx">dwHighDateTime</span><span class="o">:</span> <span class="s1">&#39;uint&#39;</span>
770
- <span class="linenos"> 8</span><span class="p">});</span>
771
- <span class="linenos"> 9</span><span class="kd">const</span> <span class="nx">WIN32_FIND_DATA</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;WIN32_FIND_DATA&#39;</span><span class="p">,</span> <span class="p">{</span>
772
- <span class="linenos">10</span> <span class="nx">dwFileAttributes</span><span class="o">:</span> <span class="s1">&#39;uint&#39;</span><span class="p">,</span>
773
- <span class="linenos">11</span> <span class="nx">ftCreationTime</span><span class="o">:</span> <span class="nx">FILETIME</span><span class="p">,</span>
774
- <span class="linenos">12</span> <span class="nx">ftLastAccessTime</span><span class="o">:</span> <span class="nx">FILETIME</span><span class="p">,</span>
775
- <span class="linenos">13</span> <span class="nx">ftLastWriteTime</span><span class="o">:</span> <span class="nx">FILETIME</span><span class="p">,</span>
776
- <span class="linenos">14</span> <span class="nx">nFileSizeHigh</span><span class="o">:</span> <span class="s1">&#39;uint&#39;</span><span class="p">,</span>
777
- <span class="linenos">15</span> <span class="nx">nFileSizeLow</span><span class="o">:</span> <span class="s1">&#39;uint&#39;</span><span class="p">,</span>
778
- <span class="linenos">16</span> <span class="nx">dwReserved0</span><span class="o">:</span> <span class="s1">&#39;uint&#39;</span><span class="p">,</span>
779
- <span class="linenos">17</span> <span class="nx">dwReserved1</span><span class="o">:</span> <span class="s1">&#39;uint&#39;</span><span class="p">,</span>
780
- <span class="linenos">18</span> <span class="nx">cFileName</span><span class="o">:</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">&#39;char16&#39;</span><span class="p">,</span> <span class="mf">260</span><span class="p">),</span>
781
- <span class="linenos">19</span> <span class="nx">cAlternateFileName</span><span class="o">:</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">&#39;char16&#39;</span><span class="p">,</span> <span class="mf">14</span><span class="p">),</span>
782
- <span class="linenos">20</span> <span class="nx">dwFileType</span><span class="o">:</span> <span class="s1">&#39;uint&#39;</span><span class="p">,</span> <span class="c1">// Obsolete. Do not use.</span>
783
- <span class="linenos">21</span> <span class="nx">dwCreatorType</span><span class="o">:</span> <span class="s1">&#39;uint&#39;</span><span class="p">,</span> <span class="c1">// Obsolete. Do not use</span>
784
- <span class="linenos">22</span> <span class="nx">wFinderFlags</span><span class="o">:</span> <span class="s1">&#39;ushort&#39;</span> <span class="c1">// Obsolete. Do not use</span>
785
- <span class="linenos">23</span><span class="p">});</span>
768
+ <span class="linenos"> 4</span><span class="kd">const</span><span class="w"> </span><span class="nx">HANDLE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">handle</span><span class="p">(</span><span class="s1">&#39;HANDLE&#39;</span><span class="p">);</span><span class="w"></span>
769
+ <span class="linenos"> 5</span><span class="kd">const</span><span class="w"> </span><span class="nx">FILETIME</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;FILETIME&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
770
+ <span class="linenos"> 6</span><span class="w"> </span><span class="nx">dwLowDateTime</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">,</span><span class="w"></span>
771
+ <span class="linenos"> 7</span><span class="w"> </span><span class="nx">dwHighDateTime</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="w"></span>
772
+ <span class="linenos"> 8</span><span class="p">});</span><span class="w"></span>
773
+ <span class="linenos"> 9</span><span class="kd">const</span><span class="w"> </span><span class="nx">WIN32_FIND_DATA</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;WIN32_FIND_DATA&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
774
+ <span class="linenos">10</span><span class="w"> </span><span class="nx">dwFileAttributes</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">,</span><span class="w"></span>
775
+ <span class="linenos">11</span><span class="w"> </span><span class="nx">ftCreationTime</span><span class="o">:</span><span class="w"> </span><span class="nx">FILETIME</span><span class="p">,</span><span class="w"></span>
776
+ <span class="linenos">12</span><span class="w"> </span><span class="nx">ftLastAccessTime</span><span class="o">:</span><span class="w"> </span><span class="nx">FILETIME</span><span class="p">,</span><span class="w"></span>
777
+ <span class="linenos">13</span><span class="w"> </span><span class="nx">ftLastWriteTime</span><span class="o">:</span><span class="w"> </span><span class="nx">FILETIME</span><span class="p">,</span><span class="w"></span>
778
+ <span class="linenos">14</span><span class="w"> </span><span class="nx">nFileSizeHigh</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">,</span><span class="w"></span>
779
+ <span class="linenos">15</span><span class="w"> </span><span class="nx">nFileSizeLow</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">,</span><span class="w"></span>
780
+ <span class="linenos">16</span><span class="w"> </span><span class="nx">dwReserved0</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">,</span><span class="w"></span>
781
+ <span class="linenos">17</span><span class="w"> </span><span class="nx">dwReserved1</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">,</span><span class="w"></span>
782
+ <span class="linenos">18</span><span class="w"> </span><span class="nx">cFileName</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">&#39;char16&#39;</span><span class="p">,</span><span class="w"> </span><span class="mf">260</span><span class="p">),</span><span class="w"></span>
783
+ <span class="linenos">19</span><span class="w"> </span><span class="nx">cAlternateFileName</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">&#39;char16&#39;</span><span class="p">,</span><span class="w"> </span><span class="mf">14</span><span class="p">),</span><span class="w"></span>
784
+ <span class="linenos">20</span><span class="w"> </span><span class="nx">dwFileType</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">,</span><span class="w"> </span><span class="c1">// Obsolete. Do not use.</span><span class="w"></span>
785
+ <span class="linenos">21</span><span class="w"> </span><span class="nx">dwCreatorType</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">,</span><span class="w"> </span><span class="c1">// Obsolete. Do not use</span><span class="w"></span>
786
+ <span class="linenos">22</span><span class="w"> </span><span class="nx">wFinderFlags</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;ushort&#39;</span><span class="w"> </span><span class="c1">// Obsolete. Do not use</span><span class="w"></span>
787
+ <span class="linenos">23</span><span class="p">});</span><span class="w"></span>
786
788
  <span class="linenos">24</span>
787
- <span class="linenos">25</span><span class="kd">const</span> <span class="nx">FindFirstFile</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;HANDLE __stdcall FindFirstFileW(string16 path, _Out_ WIN32_FIND_DATA *data)&#39;</span><span class="p">);</span>
788
- <span class="linenos">26</span><span class="kd">const</span> <span class="nx">FindNextFile</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;bool __stdcall FindNextFileW(HANDLE h, _Out_ WIN32_FIND_DATA *data)&#39;</span><span class="p">);</span>
789
- <span class="linenos">27</span><span class="kd">const</span> <span class="nx">FindClose</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;bool __stdcall FindClose(HANDLE h)&#39;</span><span class="p">);</span>
790
- <span class="linenos">28</span><span class="kd">const</span> <span class="nx">GetLastError</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;uint GetLastError()&#39;</span><span class="p">);</span>
789
+ <span class="linenos">25</span><span class="kd">const</span><span class="w"> </span><span class="nx">FindFirstFile</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;HANDLE __stdcall FindFirstFileW(string16 path, _Out_ WIN32_FIND_DATA *data)&#39;</span><span class="p">);</span><span class="w"></span>
790
+ <span class="linenos">26</span><span class="kd">const</span><span class="w"> </span><span class="nx">FindNextFile</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;bool __stdcall FindNextFileW(HANDLE h, _Out_ WIN32_FIND_DATA *data)&#39;</span><span class="p">);</span><span class="w"></span>
791
+ <span class="linenos">27</span><span class="kd">const</span><span class="w"> </span><span class="nx">FindClose</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;bool __stdcall FindClose(HANDLE h)&#39;</span><span class="p">);</span><span class="w"></span>
792
+ <span class="linenos">28</span><span class="kd">const</span><span class="w"> </span><span class="nx">GetLastError</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;uint GetLastError()&#39;</span><span class="p">);</span><span class="w"></span>
791
793
  <span class="linenos">29</span>
792
- <span class="linenos">30</span><span class="kd">function</span> <span class="nx">list</span><span class="p">(</span><span class="nx">dirname</span><span class="p">)</span> <span class="p">{</span>
793
- <span class="linenos">31</span> <span class="kd">let</span> <span class="nx">filenames</span> <span class="o">=</span> <span class="p">[];</span>
794
+ <span class="linenos">30</span><span class="kd">function</span><span class="w"> </span><span class="nx">list</span><span class="p">(</span><span class="nx">dirname</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
795
+ <span class="linenos">31</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">filenames</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[];</span><span class="w"></span>
794
796
  <span class="linenos">32</span>
795
- <span class="linenos">33</span> <span class="kd">let</span> <span class="nx">data</span> <span class="o">=</span> <span class="p">{};</span>
796
- <span class="linenos">34</span> <span class="kd">let</span> <span class="nx">h</span> <span class="o">=</span> <span class="nx">FindFirstFile</span><span class="p">(</span><span class="nx">dirname</span> <span class="o">+</span> <span class="s1">&#39;\\*&#39;</span><span class="p">,</span> <span class="nx">data</span><span class="p">);</span>
797
+ <span class="linenos">33</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{};</span><span class="w"></span>
798
+ <span class="linenos">34</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">h</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">FindFirstFile</span><span class="p">(</span><span class="nx">dirname</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">&#39;\\*&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="p">);</span><span class="w"></span>
797
799
  <span class="linenos">35</span>
798
- <span class="linenos">36</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">h</span><span class="p">)</span> <span class="p">{</span>
799
- <span class="linenos">37</span> <span class="k">if</span> <span class="p">(</span><span class="nx">GetLastError</span><span class="p">()</span> <span class="o">==</span> <span class="mf">2</span><span class="p">)</span> <span class="c1">// ERROR_FILE_NOT_FOUND</span>
800
- <span class="linenos">38</span> <span class="k">return</span> <span class="nx">filenames</span><span class="p">;</span>
801
- <span class="linenos">39</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;FindFirstFile() failed&#39;</span><span class="p">);</span>
802
- <span class="linenos">40</span> <span class="p">}</span>
800
+ <span class="linenos">36</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">h</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
801
+ <span class="linenos">37</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">GetLastError</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">2</span><span class="p">)</span><span class="w"> </span><span class="c1">// ERROR_FILE_NOT_FOUND</span><span class="w"></span>
802
+ <span class="linenos">38</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">filenames</span><span class="p">;</span><span class="w"></span>
803
+ <span class="linenos">39</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;FindFirstFile() failed&#39;</span><span class="p">);</span><span class="w"></span>
804
+ <span class="linenos">40</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
803
805
  <span class="linenos">41</span>
804
- <span class="linenos">42</span> <span class="k">try</span> <span class="p">{</span>
805
- <span class="linenos">43</span> <span class="k">do</span> <span class="p">{</span>
806
- <span class="linenos">44</span> <span class="k">if</span> <span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">cFileName</span> <span class="o">!=</span> <span class="s1">&#39;.&#39;</span> <span class="o">&amp;&amp;</span> <span class="nx">data</span><span class="p">.</span><span class="nx">cFileName</span> <span class="o">!=</span> <span class="s1">&#39;..&#39;</span><span class="p">)</span>
807
- <span class="linenos">45</span> <span class="nx">filenames</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">cFileName</span><span class="p">);</span>
808
- <span class="linenos">46</span> <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="nx">FindNextFile</span><span class="p">(</span><span class="nx">h</span><span class="p">,</span> <span class="nx">data</span><span class="p">));</span>
806
+ <span class="linenos">42</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
807
+ <span class="linenos">43</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
808
+ <span class="linenos">44</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">cFileName</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s1">&#39;.&#39;</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nx">data</span><span class="p">.</span><span class="nx">cFileName</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s1">&#39;..&#39;</span><span class="p">)</span><span class="w"></span>
809
+ <span class="linenos">45</span><span class="w"> </span><span class="nx">filenames</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">cFileName</span><span class="p">);</span><span class="w"></span>
810
+ <span class="linenos">46</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="nx">FindNextFile</span><span class="p">(</span><span class="nx">h</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="p">));</span><span class="w"></span>
809
811
  <span class="linenos">47</span>
810
- <span class="linenos">48</span> <span class="k">if</span> <span class="p">(</span><span class="nx">GetLastError</span><span class="p">()</span> <span class="o">!=</span> <span class="mf">18</span><span class="p">)</span> <span class="c1">// ERROR_NO_MORE_FILES</span>
811
- <span class="linenos">49</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;FindNextFile() failed&#39;</span><span class="p">);</span>
812
- <span class="linenos">50</span> <span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
813
- <span class="linenos">51</span> <span class="nx">FindClose</span><span class="p">(</span><span class="nx">h</span><span class="p">);</span>
814
- <span class="linenos">52</span> <span class="p">}</span>
812
+ <span class="linenos">48</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">GetLastError</span><span class="p">()</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mf">18</span><span class="p">)</span><span class="w"> </span><span class="c1">// ERROR_NO_MORE_FILES</span><span class="w"></span>
813
+ <span class="linenos">49</span><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="ne">Error</span><span class="p">(</span><span class="s1">&#39;FindNextFile() failed&#39;</span><span class="p">);</span><span class="w"></span>
814
+ <span class="linenos">50</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">finally</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
815
+ <span class="linenos">51</span><span class="w"> </span><span class="nx">FindClose</span><span class="p">(</span><span class="nx">h</span><span class="p">);</span><span class="w"></span>
816
+ <span class="linenos">52</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
815
817
  <span class="linenos">53</span>
816
- <span class="linenos">54</span> <span class="k">return</span> <span class="nx">filenames</span><span class="p">;</span>
817
- <span class="linenos">55</span><span class="p">}</span>
818
+ <span class="linenos">54</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">filenames</span><span class="p">;</span><span class="w"></span>
819
+ <span class="linenos">55</span><span class="p">}</span><span class="w"></span>
818
820
  <span class="linenos">56</span>
819
- <span class="linenos">57</span><span class="kd">let</span> <span class="nx">filenames</span> <span class="o">=</span> <span class="nx">list</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">);</span>
820
- <span class="linenos">58</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">filenames</span><span class="p">);</span>
821
+ <span class="linenos">57</span><span class="kd">let</span><span class="w"> </span><span class="nx">filenames</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">list</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">);</span><span class="w"></span>
822
+ <span class="linenos">58</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">filenames</span><span class="p">);</span><span class="w"></span>
821
823
  </pre></div>
822
824
  </div>
823
825
  </section>
824
826
  <section id="pointers-to-primitive-types">
825
827
  <h3>Pointers to primitive types<a class="headerlink" href="#pointers-to-primitive-types" title="Permalink to this heading">#</a></h3>
826
828
  <p>In javascript, it is not possible to pass a primitive value by reference to another function. This means that you cannot call a function and expect it to modify the value of one of its number or string parameter.</p>
827
- <p>However, arrays and objects (among others) are reference type values. Assigning an array or an object from one variable to another does not invole any copy. Instead, as the following example illustrates, the new variable references the same list as the first:</p>
828
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">let</span> <span class="nx">list1</span> <span class="o">=</span> <span class="p">[</span><span class="mf">1</span><span class="p">,</span> <span class="mf">2</span><span class="p">];</span>
829
- <span class="linenos">2</span><span class="kd">let</span> <span class="nx">list2</span> <span class="o">=</span> <span class="nx">list1</span><span class="p">;</span>
829
+ <p>However, arrays and objects (among others) are reference type values. Assigning an array or an object from one variable to another does not invole any copy. Instead, as the following example illustrates, the new variable references the same array as the first:</p>
830
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">let</span><span class="w"> </span><span class="nx">list1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="mf">2</span><span class="p">];</span><span class="w"></span>
831
+ <span class="linenos">2</span><span class="kd">let</span><span class="w"> </span><span class="nx">list2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">list1</span><span class="p">;</span><span class="w"></span>
830
832
  <span class="linenos">3</span>
831
- <span class="linenos">4</span><span class="nx">list2</span><span class="p">[</span><span class="mf">1</span><span class="p">]</span> <span class="o">=</span> <span class="mf">42</span><span class="p">;</span>
833
+ <span class="linenos">4</span><span class="nx">list2</span><span class="p">[</span><span class="mf">1</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">42</span><span class="p">;</span><span class="w"></span>
832
834
  <span class="linenos">5</span>
833
- <span class="linenos">6</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">list1</span><span class="p">);</span> <span class="c1">// Prints [1, 42]</span>
835
+ <span class="linenos">6</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">list1</span><span class="p">);</span><span class="w"> </span><span class="c1">// Prints [1, 42]</span><span class="w"></span>
834
836
  </pre></div>
835
837
  </div>
836
838
  <p>All of this means that C functions that are expected to modify their primitive output values (such as an <code class="docutils literal notranslate"><span class="pre">int</span> <span class="pre">*</span></code> parameter) cannot be used directly. However, thanks to Koffi’s transparent array support, you can use Javascript arrays to approximate reference semantics with single-element arrays.</p>
837
- <p>Below, you can find an example of an addition function where the result is stored in an <code class="docutils literal notranslate"><span class="pre">int</span> <span class="pre">*</span></code> output parameter and how to use this function from Koffi.</p>
839
+ <p>Below, you can find an example of an addition function where the result is stored in an <code class="docutils literal notranslate"><span class="pre">int</span> <span class="pre">*</span></code> input/output parameter and how to use this function from Koffi.</p>
838
840
  <div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kt">void</span><span class="w"> </span><span class="nf">AddInt</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">dest</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">add</span><span class="p">)</span><span class="w"></span>
839
841
  <span class="linenos">2</span><span class="p">{</span><span class="w"></span>
840
842
  <span class="linenos">3</span><span class="w"> </span><span class="o">*</span><span class="n">dest</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">add</span><span class="p">;</span><span class="w"></span>
841
843
  <span class="linenos">4</span><span class="p">}</span><span class="w"></span>
842
844
  </pre></div>
843
845
  </div>
844
- <p>You can simply pass a single-element array as the third argument:</p>
845
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span> <span class="nx">AddInt</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;void AddInt(_Inout_ int *dest, int add)&#39;</span><span class="p">);</span>
846
+ <p>You can simply pass a single-element array as the first argument:</p>
847
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span><span class="w"> </span><span class="nx">AddInt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;void AddInt(_Inout_ int *dest, int add)&#39;</span><span class="p">);</span><span class="w"></span>
846
848
  <span class="linenos">2</span>
847
- <span class="linenos">3</span><span class="kd">let</span> <span class="nx">sum</span> <span class="o">=</span> <span class="p">[</span><span class="mf">36</span><span class="p">];</span>
848
- <span class="linenos">4</span><span class="nx">AddInt</span><span class="p">(</span><span class="nx">sum</span><span class="p">,</span> <span class="mf">6</span><span class="p">);</span>
849
+ <span class="linenos">3</span><span class="kd">let</span><span class="w"> </span><span class="nx">sum</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mf">36</span><span class="p">];</span><span class="w"></span>
850
+ <span class="linenos">4</span><span class="nx">AddInt</span><span class="p">(</span><span class="nx">sum</span><span class="p">,</span><span class="w"> </span><span class="mf">6</span><span class="p">);</span><span class="w"></span>
849
851
  <span class="linenos">5</span>
850
- <span class="linenos">6</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">[</span><span class="mf">0</span><span class="p">]);</span> <span class="c1">// Prints 42</span>
852
+ <span class="linenos">6</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">sum</span><span class="p">[</span><span class="mf">0</span><span class="p">]);</span><span class="w"> </span><span class="c1">// Prints 42</span><span class="w"></span>
851
853
  </pre></div>
852
854
  </div>
853
855
  </section>
@@ -861,24 +863,24 @@
861
863
  <li><p><strong>C to JS</strong> (return value, output parameters, callbacks): Koffi will use a TypedArray if possible. But you can change this behavior when you create the array type with the optional hint argument: <code class="docutils literal notranslate"><span class="pre">koffi.array('uint8_t',</span> <span class="pre">64,</span> <span class="pre">'array')</span></code>. For non-number types, such as arrays of strings or structs, Koffi creates normal arrays.</p></li>
862
864
  </ul>
863
865
  <p>See the example below:</p>
864
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span> <span class="nx">koffi</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span>
866
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="kd">const</span><span class="w"> </span><span class="nx">koffi</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">&#39;koffi&#39;</span><span class="p">);</span><span class="w"></span>
865
867
  <span class="linenos"> 2</span>
866
- <span class="linenos"> 3</span><span class="c1">// Those two structs are exactly the same, only the array conversion hint is different</span>
867
- <span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">Foo1</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;Foo&#39;</span><span class="p">,</span> <span class="p">{</span>
868
- <span class="linenos"> 5</span> <span class="nx">i</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
869
- <span class="linenos"> 6</span> <span class="nx">a16</span><span class="o">:</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">&#39;int16_t&#39;</span><span class="p">,</span> <span class="mf">8</span><span class="p">)</span>
870
- <span class="linenos"> 7</span><span class="p">});</span>
871
- <span class="linenos"> 8</span><span class="kd">const</span> <span class="nx">Foo2</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;Foo&#39;</span><span class="p">,</span> <span class="p">{</span>
872
- <span class="linenos"> 9</span> <span class="nx">i</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
873
- <span class="linenos">10</span> <span class="nx">a16</span><span class="o">:</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">&#39;int16_t&#39;</span><span class="p">,</span> <span class="mf">8</span><span class="p">,</span> <span class="s1">&#39;array&#39;</span><span class="p">)</span>
874
- <span class="linenos">11</span><span class="p">});</span>
868
+ <span class="linenos"> 3</span><span class="c1">// Those two structs are exactly the same, only the array conversion hint is different</span><span class="w"></span>
869
+ <span class="linenos"> 4</span><span class="kd">const</span><span class="w"> </span><span class="nx">Foo1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;Foo&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
870
+ <span class="linenos"> 5</span><span class="w"> </span><span class="nx">i</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
871
+ <span class="linenos"> 6</span><span class="w"> </span><span class="nx">a16</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">&#39;int16_t&#39;</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">)</span><span class="w"></span>
872
+ <span class="linenos"> 7</span><span class="p">});</span><span class="w"></span>
873
+ <span class="linenos"> 8</span><span class="kd">const</span><span class="w"> </span><span class="nx">Foo2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">struct</span><span class="p">(</span><span class="s1">&#39;Foo&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
874
+ <span class="linenos"> 9</span><span class="w"> </span><span class="nx">i</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
875
+ <span class="linenos">10</span><span class="w"> </span><span class="nx">a16</span><span class="o">:</span><span class="w"> </span><span class="nx">koffi</span><span class="p">.</span><span class="nx">array</span><span class="p">(</span><span class="s1">&#39;int16_t&#39;</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;array&#39;</span><span class="p">)</span><span class="w"></span>
876
+ <span class="linenos">11</span><span class="p">});</span><span class="w"></span>
875
877
  <span class="linenos">12</span>
876
- <span class="linenos">13</span><span class="c1">// Uses an hypothetical C function that just returns the struct passed as a parameter</span>
877
- <span class="linenos">14</span><span class="kd">const</span> <span class="nx">ReturnFoo1</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;Foo1 ReturnFoo(Foo1 p)&#39;</span><span class="p">);</span>
878
- <span class="linenos">15</span><span class="kd">const</span> <span class="nx">ReturnFoo2</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;Foo2 ReturnFoo(Foo2 p)&#39;</span><span class="p">);</span>
878
+ <span class="linenos">13</span><span class="c1">// Uses an hypothetical C function that just returns the struct passed as a parameter</span><span class="w"></span>
879
+ <span class="linenos">14</span><span class="kd">const</span><span class="w"> </span><span class="nx">ReturnFoo1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;Foo1 ReturnFoo(Foo1 p)&#39;</span><span class="p">);</span><span class="w"></span>
880
+ <span class="linenos">15</span><span class="kd">const</span><span class="w"> </span><span class="nx">ReturnFoo2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">lib</span><span class="p">.</span><span class="nx">func</span><span class="p">(</span><span class="s1">&#39;Foo2 ReturnFoo(Foo2 p)&#39;</span><span class="p">);</span><span class="w"></span>
879
881
  <span class="linenos">16</span>
880
- <span class="linenos">17</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ReturnFoo1</span><span class="p">({</span> <span class="nx">i</span><span class="o">:</span> <span class="mf">5</span><span class="p">,</span> <span class="nx">a16</span><span class="o">:</span> <span class="p">[</span><span class="mf">6</span><span class="p">,</span> <span class="mf">8</span><span class="p">]</span> <span class="p">}))</span> <span class="c1">// Prints { i: 5, a16: Int16Array(2) [6, 8] }</span>
881
- <span class="linenos">18</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ReturnFoo2</span><span class="p">({</span> <span class="nx">i</span><span class="o">:</span> <span class="mf">5</span><span class="p">,</span> <span class="nx">a16</span><span class="o">:</span> <span class="p">[</span><span class="mf">6</span><span class="p">,</span> <span class="mf">8</span><span class="p">]</span> <span class="p">}))</span> <span class="c1">// Prints { i: 5, a16: [6, 8] }</span>
882
+ <span class="linenos">17</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ReturnFoo1</span><span class="p">({</span><span class="w"> </span><span class="nx">i</span><span class="o">:</span><span class="w"> </span><span class="mf">5</span><span class="p">,</span><span class="w"> </span><span class="nx">a16</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="mf">6</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">]</span><span class="w"> </span><span class="p">}))</span><span class="w"> </span><span class="c1">// Prints { i: 5, a16: Int16Array(2) [6, 8] }</span><span class="w"></span>
883
+ <span class="linenos">18</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ReturnFoo2</span><span class="p">({</span><span class="w"> </span><span class="nx">i</span><span class="o">:</span><span class="w"> </span><span class="mf">5</span><span class="p">,</span><span class="w"> </span><span class="nx">a16</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="mf">6</span><span class="p">,</span><span class="w"> </span><span class="mf">8</span><span class="p">]</span><span class="w"> </span><span class="p">}))</span><span class="w"> </span><span class="c1">// Prints { i: 5, a16: [6, 8] }</span><span class="w"></span>
882
884
  </pre></div>
883
885
  </div>
884
886
  <section id="handling-of-strings">
@@ -900,9 +902,9 @@
900
902
  <li><p><code class="docutils literal notranslate"><span class="pre">koffi.introspect(type)</span></code> to get the definition of a type (only for structs for now)</p></li>
901
903
  </ul>
902
904
  <p>Just like before, you can refer to primitive types by their name or through <code class="docutils literal notranslate"><span class="pre">koffi.types</span></code>:</p>
903
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// These two lines do the same:</span>
904
- <span class="linenos">2</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">sizeof</span><span class="p">(</span><span class="s1">&#39;long&#39;</span><span class="p">));</span>
905
- <span class="linenos">3</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">sizeof</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">types</span><span class="p">.</span><span class="kr">long</span><span class="p">));</span>
905
+ <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="c1">// These two lines do the same:</span><span class="w"></span>
906
+ <span class="linenos">2</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">sizeof</span><span class="p">(</span><span class="s1">&#39;long&#39;</span><span class="p">));</span><span class="w"></span>
907
+ <span class="linenos">3</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">sizeof</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">types</span><span class="p">.</span><span class="kr">long</span><span class="p">));</span><span class="w"></span>
906
908
  </pre></div>
907
909
  </div>
908
910
  </section>