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>
@@ -203,12 +204,12 @@
203
204
  </div>
204
205
  <article role="main">
205
206
  <section id="koffi-version">
206
- <h1>Koffi 1.3.2<a class="headerlink" href="#koffi-version" title="Permalink to this heading">#</a></h1>
207
+ <h1>Koffi 1.3.5<a class="headerlink" href="#koffi-version" title="Permalink to this heading">#</a></h1>
207
208
  <section id="overview">
208
209
  <h2>Overview<a class="headerlink" href="#overview" title="Permalink to this heading">#</a></h2>
209
210
  <p>Koffi is a <strong>fast and easy-to-use C FFI module for Node.js</strong>, featuring:</p>
210
211
  <ul class="simple">
211
- <li><p>Low-overhead and fast performance (see <a class="reference internal" href="benchmarks#benchmarks"><span class="std std-ref">Benchmarks</span></a>)</p></li>
212
+ <li><p>Low-overhead and fast performance (see <a class="reference internal" href="benchmarks#benchmarks"><span class="std std-ref">benchmarks</span></a>)</p></li>
212
213
  <li><p>Support for primitive and aggregate data types (structs and fixed-size arrays), both by reference (pointer) and by value</p></li>
213
214
  <li><p>Javascript functions can be used as C callbacks (since 1.2.0)</p></li>
214
215
  <li><p>Well-tested code base for <a class="reference internal" href="platforms#supported-platforms"><span class="std std-ref">popular OS/architecture combinations</span></a></p></li>
@@ -239,6 +240,7 @@
239
240
  <li class="toctree-l2"><a class="reference internal" href="functions#variadic-functions">Variadic functions</a></li>
240
241
  <li class="toctree-l2"><a class="reference internal" href="functions#output-parameters">Output parameters</a></li>
241
242
  <li class="toctree-l2"><a class="reference internal" href="functions#javascript-callbacks">Javascript callbacks</a></li>
243
+ <li class="toctree-l2"><a class="reference internal" href="functions#thread-safety">Thread safety</a></li>
242
244
  </ul>
243
245
  </li>
244
246
  <li class="toctree-l1"><a class="reference internal" href="memory">Memory usage</a><ul>
@@ -258,6 +260,19 @@
258
260
  <li class="toctree-l2"><a class="reference internal" href="contribute#build-from-source">Build from source</a></li>
259
261
  <li class="toctree-l2"><a class="reference internal" href="contribute#running-tests">Running tests</a></li>
260
262
  <li class="toctree-l2"><a class="reference internal" href="contribute#todo-list">Todo list</a></li>
263
+ <li class="toctree-l2"><a class="reference internal" href="contribute#code-style">Code style</a></li>
264
+ </ul>
265
+ </li>
266
+ <li class="toctree-l1"><a class="reference internal" href="changes">Changelog</a><ul>
267
+ <li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-5">Koffi 1.3.5</a></li>
268
+ <li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-4">Koffi 1.3.4</a></li>
269
+ <li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-3">Koffi 1.3.3</a></li>
270
+ <li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-2">Koffi 1.3.2</a></li>
271
+ <li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-1">Koffi 1.3.1</a></li>
272
+ <li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-3-0">Koffi 1.3.0</a></li>
273
+ <li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-2-4">Koffi 1.2.4</a></li>
274
+ <li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-2-3">Koffi 1.2.3</a></li>
275
+ <li class="toctree-l2"><a class="reference internal" href="changes#koffi-1-2-1">Koffi 1.2.1</a></li>
261
276
  </ul>
262
277
  </li>
263
278
  </ul>
@@ -317,7 +332,7 @@
317
332
  <div class="toc-tree-container">
318
333
  <div class="toc-tree">
319
334
  <ul>
320
- <li><a class="reference internal" href="#">Koffi 1.3.2</a><ul>
335
+ <li><a class="reference internal" href="#">Koffi 1.3.5</a><ul>
321
336
  <li><a class="reference internal" href="#overview">Overview</a></li>
322
337
  <li><a class="reference internal" href="#table-of-contents">Table of contents</a></li>
323
338
  <li><a class="reference internal" href="#license">License</a></li>
@@ -169,6 +169,7 @@
169
169
  <li class="toctree-l1 current current-page"><a class="current reference internal" href="#">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>
@@ -208,16 +209,17 @@
208
209
  <h2>How it works<a class="headerlink" href="#how-it-works" title="Permalink to this heading">#</a></h2>
209
210
  <p>For synchronous/normal calls, Koffi uses two preallocated memory blocks:</p>
210
211
  <ul class="simple">
211
- <li><p>One to construct to assign the C stack, subsequently used by the platform-specific assembly code (1 MiB by default)</p></li>
212
+ <li><p>One to construct the C stack and assign registers, subsequently used by the platform-specific assembly code (1 MiB by default)</p></li>
212
213
  <li><p>One to allocate strings and big objects/structs (2 MiB by default)</p></li>
213
214
  </ul>
214
215
  <p>Unless very big strings or objects (at least more than one page of memory) are used, no extra allocation ever happens during calls or callbacks.</p>
215
216
  <p>The size (in bytes) of these preallocated blocks can be changed. Use <code class="docutils literal notranslate"><span class="pre">koffi.config()</span></code> to get an object with the settings, and <code class="docutils literal notranslate"><span class="pre">koffi.config(obj)</span></code> to apply new settings.</p>
216
- <div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">let</span> <span class="nx">config</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">config</span><span class="p">();</span>
217
- <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">config</span><span class="p">);</span>
217
+ <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">config</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">config</span><span class="p">();</span><span class="w"></span>
218
+ <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">config</span><span class="p">);</span><span class="w"></span>
218
219
  </pre></div>
219
220
  </div>
220
221
  <p>The same is true for asynchronous calls. When an asynchronous call is made, Koffi will allocate new blocks unless there is an unused (resident) set of blocks still available. Once the asynchronous call is finished, these blocks are freed if there are more than <code class="docutils literal notranslate"><span class="pre">resident_async_pools</span></code> sets of blocks left around.</p>
222
+ <p>There cannot be more than <code class="docutils literal notranslate"><span class="pre">max_async_calls</span></code> running at the same time.</p>
221
223
  </section>
222
224
  <section id="default-settings">
223
225
  <h2>Default settings<a class="headerlink" href="#default-settings" title="Permalink to this heading">#</a></h2>
@@ -239,17 +241,21 @@
239
241
  <td><p>Heap size for synchronous calls</p></td>
240
242
  </tr>
241
243
  <tr class="row-even"><td><p>async_stack_size</p></td>
242
- <td><p>512 kiB</p></td>
244
+ <td><p>256 kiB</p></td>
243
245
  <td><p>Stack size for asynchronous calls</p></td>
244
246
  </tr>
245
247
  <tr class="row-odd"><td><p>async_heap_size</p></td>
246
- <td><p>1 MiB</p></td>
248
+ <td><p>512 kiB</p></td>
247
249
  <td><p>Heap size for asynchronous calls</p></td>
248
250
  </tr>
249
251
  <tr class="row-even"><td><p>resident_async_pools</p></td>
250
252
  <td><p>2</p></td>
251
253
  <td><p>Number of resident pools for asynchronous calls</p></td>
252
254
  </tr>
255
+ <tr class="row-odd"><td><p>max_async_calls</p></td>
256
+ <td><p>64</p></td>
257
+ <td><p>Maximum number of ongoing asynchronous calls</p></td>
258
+ </tr>
253
259
  </tbody>
254
260
  </table>
255
261
  </div>
Binary file
@@ -3,7 +3,7 @@
3
3
  <head><meta charset="utf-8"/>
4
4
  <meta name="viewport" content="width=device-width,initial-scale=1"/>
5
5
  <meta name="color-scheme" content="light dark"><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
6
- <link rel="index" title="Index" href="genindex" /><link rel="search" title="Search" href="search" /><link rel="next" title="Quick start" href="start" /><link rel="prev" title="Koffi 1.3.2" href="index" />
6
+ <link rel="index" title="Index" href="genindex" /><link rel="search" title="Search" href="search" /><link rel="next" title="Quick start" href="start" /><link rel="prev" title="Koffi 1.3.5" href="index" />
7
7
 
8
8
  <meta name="generator" content="sphinx-5.0.1, furo 2022.06.04.1"/>
9
9
  <title>Supported platforms - Koffi</title>
@@ -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>
@@ -256,6 +257,7 @@
256
257
  </table>
257
258
  </div>
258
259
  <p>For all fully supported platforms (green check marks), a prebuilt binary is included in the NPM package which means you can install Koffi without a C++ compiler.</p>
260
+ <p>Node 12 or later is required, earlier versions are not supported. Use <a class="reference external" href="https://github.com/nvm-sh/nvm">NVM</a> to install recent Node versions on older Linux distributions.</p>
259
261
  <hr class="footnotes docutils" />
260
262
  <aside class="footnote brackets" id="id4" role="note">
261
263
  <span class="label"><span class="fn-bracket">[</span><a role="doc-backlink" href="#id1">1</a><span class="fn-bracket">]</span></span>
@@ -166,6 +166,7 @@
166
166
  <li class="toctree-l1"><a class="reference internal" href="memory">Memory usage</a></li>
167
167
  <li class="toctree-l1"><a class="reference internal" href="benchmarks">Benchmarks</a></li>
168
168
  <li class="toctree-l1"><a class="reference internal" href="contribute">Contributing</a></li>
169
+ <li class="toctree-l1"><a class="reference internal" href="changes">Changelog</a></li>
169
170
  </ul>
170
171
 
171
172
  </div>
@@ -1 +1 @@
1
- Search.setIndex({"docnames": ["benchmarks", "contribute", "functions", "index", "memory", "platforms", "start", "types"], "filenames": ["benchmarks.md", "contribute.md", "functions.md", "index.rst", "memory.md", "platforms.md", "start.md", "types.md"], "titles": ["Benchmarks", "Contributing", "Function calls", "Koffi 1.3.2", "Memory usage", "Supported platforms", "Quick start", "Data types"], "terms": {"here": [0, 1, 2, 3, 7], "quick": [0, 3], "overview": 0, "execut": 0, "time": [0, 1, 6], "koffi": [0, 1, 2, 4, 5, 6, 7], "call": [0, 3, 4, 5, 6, 7], "three": [0, 6, 7], "test": [0, 3, 5], "case": [0, 1, 2, 7], "one": [0, 2, 4, 6, 7], "base": [0, 2, 3, 7], "around": [0, 4, 7], "compar": 0, "theoret": 0, "ideal": 0, "implement": [0, 7], "These": [0, 1, 7], "ar": [0, 1, 2, 4, 5, 6, 7], "detail": 0, "explain": 0, "below": [0, 1, 2, 6, 7], "node": [0, 1, 2, 3, 6], "ffi": [0, 2, 3, 6], "napi": 0, "thi": [0, 1, 2, 3, 6, 7], "repeat": 0, "simpl": [0, 1, 2, 7], "standard": [0, 2, 7], "c": [0, 1, 3, 4, 5, 6], "function": [0, 1, 3, 6, 7], "ha": [0, 1, 2, 7], "first": [0, 1, 2, 6, 7], "refer": [0, 3, 7], "through": [0, 2, 7], "an": [0, 2, 4, 7], "n": [0, 5, 6, 7], "api": [0, 1, 2, 6, 7], "modul": [0, 3], "close": [0, 7], "limit": 0, "perfect": 0, "overhead": [0, 3], "js": [0, 1, 2, 3, 5, 7], "second": [0, 2, 6, 7], "third": [0, 7], "us": [0, 1, 3, 4, 5, 6, 7], "offici": [0, 1, 5], "becaus": [0, 1, 2, 7], "pretti": [0, 1], "small": [0, 2, 3], "clearli": 0, "visibl": 0, "The": [0, 1, 2, 4, 5, 6, 7], "were": 0, "measur": 0, "my": 0, "machin": [0, 1], "amd": 0, "ryzen": 0, "7": 0, "4700u": 0, "iter": [0, 7], "total": [0, 7], "rand_napi": 0, "20000000": 0, "1": [0, 1, 4, 5, 7], "44": 0, "baselin": 0, "rand_koffi": 0, "2": [0, 4, 5, 7], "60": 0, "x1": 0, "81": [0, 1], "rand_node_ffi": 0, "107": 0, "58": 0, "x75": 0, "intel": 0, "core": 0, "i5": 0, "4460": 0, "10": 0, "3": [0, 1, 5, 7], "87": 0, "84": 0, "x42": 0, "similar": [0, 2], "which": [0, 1, 5, 6], "take": [0, 7], "string": [0, 1, 2, 4, 6], "paramet": [0, 3, 6, 7], "javascript": [0, 3, 7], "v8": [0, 2], "convers": [0, 7], "rel": 0, "slow": [0, 1], "heavi": 0, "atoi_napi": 0, "97": 0, "atoi_koffi": 0, "5": [0, 2, 7], "07": 0, "71": 0, "atoi_node_ffi": 0, "693": 0, "16": [0, 7], "x233": 0, "91": 0, "99": 0, "479": 0, "34": 0, "x161": 0, "cpu": 0, "imag": 0, "draw": 0, "much": [0, 1], "heavier": 0, "than": [0, 4], "thu": 0, "reduc": 0, "In": [0, 2, 7], "full": [0, 1, 7], "version": [0, 1, 2, 3, 7], "code": [0, 3, 4], "nativ": 0, "wrapper": 0, "raylib_cc": 0, "100": 0, "9": 0, "31": 0, "raylib_node_raylib": 0, "90": 0, "17": 0, "raylib_koffi": 0, "12": [0, 1], "86": 0, "38": 0, "raylib_node_ffi": 0, "35": 0, "76": 0, "x3": 0, "67": 0, "05": 0, "13": 0, "14": [0, 7], "39": 0, "63": 0, "x4": 0, "18": [0, 7], "open": [0, 2, 7], "consol": [0, 2, 4, 7], "go": [0, 1], "cnoke": [0, 1], "befor": [0, 7], "do": [0, 1, 7], "anyth": 0, "els": [0, 7], "cd": [0, 1], "onc": [0, 1, 2, 4, 6, 7], "done": [0, 1, 2, 7], "you": [0, 1, 2, 3, 5, 6, 7], "can": [0, 1, 2, 3, 4, 5, 6, 7], "each": [0, 1, 2, 7], "e": [0, 2, 7], "g": [0, 1, 2, 7], "build": [0, 3, 5, 7], "option": [0, 1, 2, 3, 7], "defin": [0, 7], "custom": 0, "number": [0, 4, 7], "10000000": 0, "repositori": 1, "name": [1, 2, 7], "luigi": 1, "monorepo": 1, "contain": [1, 7], "multipl": 1, "project": 1, "idea": 1, "http": [1, 3], "github": 1, "com": 1, "koromix": 1, "issu": [1, 2], "we": [1, 7], "provid": [1, 2, 7], "prebuilt": [1, 5], "binari": [1, 5], "packag": [1, 5], "npm": [1, 5, 6], "archiv": 1, "so": [1, 2, 6, 7], "most": [1, 2, 7], "should": 1, "instal": [1, 5, 6], "If": 1, "want": 1, "hack": 1, "specif": [1, 4], "follow": [1, 2, 5, 7], "instruct": [1, 2], "make": 1, "sure": 1, "depend": [1, 2, 7], "met": 1, "desktop": 1, "develop": 1, "workload": 1, "visual": 1, "studio": 1, "2022": 1, "2019": 1, "tool": 1, "default": [1, 2, 3, 7], "compon": 1, "cmake": 1, "meta": 1, "system": [1, 6], "later": [1, 3], "command": 1, "benchmark": [1, 3], "directori": [1, 7], "what": 1, "gcc": 1, "8": [1, 2, 7], "newer": 1, "gnu": [1, 3], "architectur": [1, 2, 3, 5, 7], "emul": 1, "acceler": 1, "when": [1, 2, 4, 7], "possibl": [1, 7], "qemu": 1, "need": [1, 2, 7], "even": 1, "gui": 1, "ubuntu": 1, "includ": [1, 2, 5, 7], "directli": [1, 7], "licens": 1, "size": [1, 3, 4], "reason": [1, 7], "thei": [1, 2, 7], "avail": [1, 4], "dev": 1, "file": [1, 2, 7], "For": [1, 2, 4, 5, 7], "exampl": [1, 3, 7], "debian": 1, "arm64": [1, 5], "wget": 1, "q": 1, "o": [1, 7], "qemu_debian_arm64": 1, "tar": 1, "zst": 1, "zstd": 1, "d": [1, 2, 7], "xv": 1, "sha256sum": 1, "ignor": [1, 2], "miss": 1, "registri": 1, "txt": 1, "note": [1, 7], "disk": 1, "content": [1, 7], "mai": 1, "chang": [1, 2, 4, 7], "checksum": 1, "fail": [1, 2, 7], "been": 1, "least": [1, 4], "And": [1, 6], "now": [1, 6, 7], "sever": [1, 2], "help": 1, "patient": 1, "linux": [1, 3, 5], "have": [1, 6, 7], "ccach": 1, "subsequ": [1, 4], "step": 1, "get": [1, 4, 6, 7], "more": [1, 2, 3, 4, 7], "toler": 1, "By": [1, 2, 7], "start": [1, 2, 3], "stop": 1, "But": [1, 7], "ahead": 1, "instead": [1, 7], "without": [1, 5], "shut": 1, "down": 1, "again": 1, "everyth": 1, "also": [1, 7], "restrict": 1, "subset": 1, "cycl": 1, "debian_x64": 1, "debian_i386": 1, "separ": 1, "shutdown": 1, "final": [1, 7], "join": 1, "ssh": 1, "shortcut": 1, "some": [1, 7], "debug": 1, "ani": [1, 3, 7], "manual": 1, "procedur": [1, 2], "configur": 1, "vnc": 1, "server": 1, "local": [1, 6], "access": 1, "displai": 1, "krdc": 1, "compat": 1, "viewer": 1, "info": 1, "port": 1, "after": [1, 2], "releas": 1, "0": [1, 2, 3, 7], "current": [1, 6, 7], "prioriti": 1, "next": [1, 7], "major": 1, "autom": 1, "aarch64": [1, 5], "maco": [1, 5], "how": [1, 2, 3, 7], "creat": [1, 2, 7], "real": 1, "world": [1, 2, 6, 7], "librari": [1, 2, 6, 7], "raylib": [1, 3], "sqlite": [1, 2], "libsodium": 1, "illustr": [1, 6, 7], "work": [1, 3], "variou": 1, "style": [1, 2], "plan": 1, "eventu": 1, "necessarili": 1, "order": [1, 2], "optim": 1, "pass": [1, 2, 7], "struct": [1, 3, 4, 6], "arrai": [1, 3], "hfa": 1, "helper": 1, "add": [1, 7], "type": [1, 2, 3, 6], "parser": [1, 2], "wai": [1, 6, 7], "encod": [1, 7], "decod": 1, "byte": [1, 4, 7], "support": [1, 2, 3, 7], "union": 1, "better": 1, "automat": [1, 2], "deal": [1, 7], "caller": 1, "heap": [1, 4], "alloc": [1, 4, 7], "memori": [1, 2, 3, 7], "etc": [1, 2], "powerpc": 1, "power9": 1, "abi": [1, 5, 7], "To": 2, "declar": [2, 6, 7], "load": [2, 6, 7], "share": [2, 6, 7], "const": [2, 6, 7], "requir": [2, 6, 7], "lib": [2, 6, 7], "path": [2, 7], "extens": 2, "platform": [2, 3, 4, 7], "dll": [2, 6, 7], "dylib": 2, "return": [2, 7], "object": [2, 4, 7], "from": [2, 3, 5, 7], "two": [2, 4, 7], "inspir": 2, "specifi": [2, 7], "its": [2, 7], "non": [2, 7], "mangl": 2, "ellipsi": 2, "last": [2, 7], "printf": [2, 6], "func": [2, 6, 7], "int": [2, 6, 7], "atoi": [2, 3], "tri": 2, "x86": [2, 5, 6], "convent": [2, 5, 6], "see": [2, 3, 7], "section": [2, 7], "inform": [2, 3, 7], "subject": 2, "shown": 2, "char": [2, 6, 7], "fmt": 2, "happen": [2, 4, 7], "onli": [2, 5, 7], "per": 2, "process": 2, "32": 2, "bit": 2, "except": 2, "form": 2, "descript": [2, 4], "cdecl": [2, 5], "other": [2, 7], "stdcall": [2, 5, 6], "__stdcall": [2, 7], "within": 2, "win32": [2, 6, 7], "fastcal": [2, 5], "__fastcal": 2, "rare": [2, 7], "ecx": 2, "edx": 2, "thiscal": [2, 5], "__thiscal": 2, "safe": 2, "simpli": [2, 7], "find": [2, 3, 6, 7], "show": [2, 6, 7], "user32": [2, 6], "equival": [2, 7], "messageboxa_1": 2, "messageboxa": [2, 6], "void": [2, 6, 7], "uint": [2, 6, 7], "messageboxa_2": 2, "hwnd": 2, "text": 2, "caption": 2, "async": 2, "member": [2, 7], "argument": [2, 7], "err": 2, "re": 2, "libc": [2, 6], "6": [2, 6, 7], "str": [2, 7], "1257": 2, "log": [2, 4, 7], "result": [2, 3, 6, 7], "hello": [2, 6, 7], "program": [2, 3], "print": [2, 6, 7], "easili": 2, "convert": [2, 7], "promis": 2, "util": 2, "promisifi": 2, "cannot": [2, 7], "must": 2, "addit": [2, 7], "expect": [2, 5, 7], "valu": [2, 3, 6, 7], "doubl": [2, 5, 7], "THE": 2, "end": 2, "integ": [2, 7], "s": [2, 7], "On": 2, "forward": [2, 5], "howev": [2, 7], "mani": [2, 7], "pointer": [2, 3], "input": [2, 7], "simplici": 2, "semant": [2, 7], "primit": [2, 3], "marshal": 2, "out": [2, 7], "timev": [2, 6], "where": [2, 7], "inout": 2, "dual": 2, "same": [2, 4, 7], "msdn": 2, "qualifi": 2, "_out_": [2, 6, 7], "_inout_": [2, 7], "posix": 2, "gettimeofdai": [2, 6], "tv_sec": [2, 6], "unsign": [2, 6, 7], "tv_usec": [2, 6], "timezon": [2, 6], "tz_minuteswest": [2, 6], "tz_dsttime": [2, 6], "tv": [2, 6], "tz": [2, 6], "let": [2, 4, 6, 7], "null": [2, 6, 7], "databas": 2, "sqlite3_db": 2, "copi": [2, 7], "sqlite3_open_v2": 2, "sqlite_open_readwrit": 2, "0x2": 2, "sqlite_open_cr": 2, "0x4": 2, "db": 2, "throw": [2, 7], "new": [2, 4, 7], "error": [2, 7], "sqlite3_close_v2": 2, "With": 2, "noth": 2, "examplecallback": 2, "float": [2, 5, 7], "sum": [2, 7], "adddoublefloat": 2, "f": [2, 7], "your": [2, 3], "them": [2, 7], "part": 2, "h": [2, 7], "transfertoj": 2, "ag": 2, "cb": 2, "buf": 2, "64": [2, 5, 7], "snprintf": 2, "sizeof": [2, 7], "transfercallback": 2, "ret": 2, "niel": 2, "27": 2, "42": [2, 7], "main": 2, "precis": [2, 5], "intepret": 2, "anoth": [2, 7], "undefin": 2, "behavior": [2, 7], "lead": 2, "mess": [2, 7], "fast": 3, "easi": 3, "featur": 3, "low": 3, "perform": 3, "aggreg": 3, "data": 3, "fix": 3, "both": [3, 7], "callback": [3, 4, 5, 7], "sinc": 3, "well": 3, "popular": 3, "os": [3, 5, 7], "combin": [3, 5], "window": [3, 5], "introspect": 3, "definit": [3, 7], "synchron": [3, 4], "asynchron": [3, 4], "variad": [3, 6], "output": [3, 6, 7], "usag": 3, "set": 3, "rand": 3, "run": [3, 6], "contribut": 3, "bug": 3, "request": 3, "sourc": [3, 5], "todo": 3, "list": [3, 7], "free": [3, 7], "softwar": 3, "redistribut": 3, "modifi": [3, 7], "under": 3, "term": 3, "affero": 3, "gener": [3, 7], "public": 3, "publish": 3, "foundat": 3, "either": [3, 7], "www": 3, "org": 3, "normal": [4, 7], "prealloc": 4, "block": 4, "One": 4, "construct": 4, "assign": [4, 7], "stack": 4, "assembl": 4, "mib": 4, "big": [4, 7], "unless": 4, "veri": 4, "page": 4, "extra": 4, "ever": 4, "dure": 4, "config": 4, "obj": 4, "appli": [4, 7], "true": [4, 7], "made": 4, "unus": 4, "resid": 4, "still": 4, "finish": 4, "freed": 4, "resident_async_pool": 4, "left": 4, "sync_stack_s": 4, "sync_heap_s": 4, "async_stack_s": 4, "512": 4, "kib": 4, "async_heap_s": 4, "pool": 4, "moment": 5, "isa": 5, "freebsd": 5, "openbsd": 5, "ia32": 5, "ye": 5, "A": [5, 7], "x86_64": 5, "amd64": 5, "arm32": 5, "le": [5, 7], "probabl": 5, "risc": 5, "v": 5, "all": [5, 7], "fulli": 5, "green": 5, "check": 5, "mark": 5, "mean": [5, 7], "compil": 5, "ms": 5, "hard": 5, "vfp": 5, "coprocessor": 5, "differ": [5, 7], "softfp": 5, "soft": 5, "lp64d": 5, "lp64": [5, 7], "theori": 5, "untest": 5, "lp64f": 5, "like": [6, 7], "prototyp": 6, "languag": 6, "syntax": 6, "It": [6, 7], "time_t": 6, "int64_t": [6, 7], "tm": 6, "tm_sec": 6, "tm_min": 6, "tm_hour": 6, "tm_mdai": 6, "tm_mon": 6, "tm_year": 6, "tm_wdai": 6, "tm_ydai": 6, "tm_isdst": 6, "localtime_r": 6, "format": 6, "02d": 6, "target": 6, "messagebox": 6, "messag": 6, "user": [6, 7], "constant": 6, "mb_iconinform": 6, "0x40": 6, "foobar": 6, "while": 7, "allow": 7, "variat": 7, "enforc": 7, "signed": 7, "valid": 7, "int8": 7, "sign": 7, "int8_t": 7, "uint8": 7, "uint8_t": 7, "uchar": 7, "char16": 7, "char16_t": 7, "int16": 7, "int16_t": 7, "uint16": 7, "uint16_t": 7, "short": 7, "int32": 7, "4": 7, "int32_t": 7, "uint32": 7, "uint32_t": 7, "int64": 7, "uint64": 7, "uint64_t": 7, "longlong": 7, "long": 7, "ulonglong": 7, "float32": 7, "float64": 7, "few": 7, "boolean": 7, "bool": 7, "usual": 7, "llp64": 7, "ulong": 7, "utf": 7, "string16": 7, "line": 7, "struct1": 7, "dummi": 7, "struct2": 7, "vice": 7, "versa": 7, "unlik": 7, "omit": 7, "anonym": 7, "typedef": 7, "b": 7, "d1": 7, "d2": 7, "rule": 7, "regard": 7, "align": 7, "pad": 7, "latter": 7, "function1": 7, "function2": 7, "differenti": 7, "purpos": 7, "import": 7, "distinguish": 7, "fall": 7, "avoid": 7, "potenti": 7, "expens": 7, "doe": 7, "expos": 7, "sqlite3_stmt": 7, "someth": 7, "stabil": 7, "prevent": 7, "intern": 7, "dynam": 7, "termin": 7, "length": 7, "lot": 7, "getcursorpo": 7, "retriev": 7, "cursor": 7, "posit": 7, "kernel32": 7, "point": 7, "x": 7, "y": 7, "po": 7, "kind": 7, "orient": 7, "pair": 7, "dedic": 7, "delet": 7, "obviou": 7, "found": 7, "stdio": 7, "fopen": 7, "fclose": 7, "manipul": 7, "fread": 7, "ftell": 7, "manag": 7, "builder": 7, "concaten": 7, "mix": 7, "fizzbuzz": 7, "hidden": 7, "behind": 7, "destroi": 7, "concatnew": 7, "concatnewout": 7, "concatfre": 7, "clang": 7, "fpic": 7, "wall": 7, "o2": 7, "stdlib": 7, "stdbool": 7, "errno": 7, "fragment": 7, "size_t": 7, "len": 7, "concat": 7, "malloc": 7, "fprintf": 7, "stderr": 7, "strerror": 7, "fals": 7, "concatappend": 7, "frag": 7, "strlen": 7, "memcpi": 7, "concatbuild": 7, "r": 7, "stupid": 7, "try": 7, "failur": 7, "i": 7, "30": 7, "15": 7, "buzz": 7, "fizz": 7, "infer": 7, "itself": 7, "sentinel": 7, "translat": 7, "typedarrai": 7, "proper": 7, "notion": 7, "fat": 7, "yourself": 7, "calcul": 7, "stdint": 7, "computetotallength": 7, "ptr": 7, "14n": 7, "just": 7, "direct": 7, "document": 7, "findfirstfilew": 7, "findnextfilew": 7, "filetim": 7, "dwlowdatetim": 7, "dwhighdatetim": 7, "win32_find_data": 7, "dwfileattribut": 7, "ftcreationtim": 7, "ftlastaccesstim": 7, "ftlastwritetim": 7, "nfilesizehigh": 7, "nfilesizelow": 7, "dwreserved0": 7, "dwreserved1": 7, "cfilenam": 7, "260": 7, "calternatefilenam": 7, "dwfiletyp": 7, "obsolet": 7, "dwcreatortyp": 7, "wfinderflag": 7, "ushort": 7, "findfirstfil": 7, "findnextfil": 7, "findclos": 7, "getlasterror": 7, "dirnam": 7, "filenam": 7, "error_file_not_found": 7, "push": 7, "error_no_more_fil": 7, "among": 7, "variabl": 7, "invol": 7, "list1": 7, "list2": 7, "thank": 7, "transpar": 7, "approxim": 7, "singl": 7, "element": 7, "store": 7, "addint": 7, "dest": 7, "36": 7, "degener": 7, "emb": 7, "correct": 7, "uint8arrai": 7, "hint": 7, "those": 7, "exactli": 7, "foo1": 7, "foo": 7, "a16": 7, "foo2": 7, "hypothet": 7, "returnfoo1": 7, "returnfoo": 7, "p": 7, "returnfoo2": 7, "int16arrai": 7, "fill": 7, "truncat": 7, "buffer": 7, "alwai": 7, "nul": 7, "revers": 7, "explicitli": 7, "ask": 7, "explor": 7, "alignof": 7}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"benchmark": 0, "rand": 0, "result": 0, "linux": [0, 6], "x86_64": 0, "window": [0, 1, 6], "atoi": 0, "raylib": 0, "run": [0, 1], "contribut": 1, "bug": 1, "featur": 1, "request": 1, "build": 1, "from": 1, "sourc": 1, "other": 1, "platform": [1, 5], "test": 1, "todo": 1, "list": 1, "function": 2, "call": 2, "definit": 2, "classic": 2, "syntax": 2, "c": [2, 7], "like": 2, "prototyp": 2, "synchron": 2, "asynchron": 2, "variad": 2, "output": 2, "paramet": 2, "struct": [2, 7], "exampl": [2, 6], "opaqu": [2, 7], "handl": [2, 7], "javascript": 2, "callback": 2, "us": 2, "thread": 2, "safeti": 2, "koffi": 3, "overview": 3, "tabl": 3, "content": 3, "licens": 3, "memori": 4, "usag": 4, "how": 4, "work": 4, "default": 4, "set": 4, "support": 5, "quick": 6, "start": 6, "small": 6, "data": 7, "type": 7, "primit": 7, "pointer": 7, "arrai": 7, "fix": 7, "size": 7, "string": 7, "introspect": 7, "1": 3, "2": 3, "4": [], "3": 3, "0": [], "rc": []}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}})
1
+ Search.setIndex({"docnames": ["benchmarks", "changes", "contribute", "functions", "index", "memory", "platforms", "start", "types"], "filenames": ["benchmarks.md", "changes.md", "contribute.md", "functions.md", "index.rst", "memory.md", "platforms.md", "start.md", "types.md"], "titles": ["Benchmarks", "Changelog", "Contributing", "Function calls", "Koffi 1.3.5", "Memory usage", "Supported platforms", "Quick start", "Data types"], "terms": {"here": [0, 2, 3, 4, 8], "quick": [0, 4], "overview": 0, "execut": [0, 3], "time": [0, 2, 5, 7], "koffi": [0, 2, 3, 5, 6, 7, 8], "call": [0, 1, 4, 5, 6, 7, 8], "three": [0, 7, 8], "where": [0, 3, 8], "compar": 0, "theoret": 0, "ideal": 0, "ffi": [0, 3, 4, 7], "implement": [0, 8], "approxim": [0, 8], "pre": 0, "compil": [0, 1, 6], "static": 0, "n": [0, 2, 6, 7, 8], "api": [0, 2, 3, 7, 8], "glue": 0, "code": [0, 1, 3, 4, 5], "The": [0, 1, 2, 3, 5, 6, 7, 8], "first": [0, 2, 3, 7, 8], "base": [0, 3, 4, 8], "second": [0, 3, 7, 8], "third": 0, "These": [0, 2, 3, 8], "ar": [0, 1, 2, 3, 5, 6, 7, 8], "detail": 0, "explain": 0, "below": [0, 1, 2, 3, 7, 8], "node": [0, 2, 3, 4, 6, 7], "napi": 0, "thi": [0, 1, 2, 3, 4, 7, 8], "test": [0, 1, 4, 6], "around": [0, 5, 8], "repeat": 0, "simpl": [0, 2, 3, 8], "standard": [0, 3, 8], "c": [0, 1, 2, 4, 5, 6, 7], "function": [0, 1, 2, 4, 7, 8], "ha": [0, 2, 3, 8], "one": [0, 3, 5, 7, 8], "refer": [0, 4, 8], "through": [0, 3, 8], "an": [0, 3, 5, 8], "modul": [0, 1, 4], "close": [0, 8], "limit": [0, 1], "perfect": 0, "overhead": [0, 4], "js": [0, 1, 2, 3, 4, 6, 8], "us": [0, 1, 2, 3, 4, 5, 6, 7, 8], "offici": [0, 2, 6], "becaus": [0, 2, 3, 8], "pretti": [0, 2], "small": [0, 3, 4], "clearli": 0, "visibl": 0, "were": 0, "measur": 0, "my": [0, 2], "machin": [0, 2], "amd": 0, "ryzen": 0, "7": 0, "4700u": 0, "iter": [0, 8], "total": [0, 8], "rel": 0, "perform": [0, 4], "rand_napi": 0, "20000000": 0, "1": [0, 2, 5, 6, 8], "44": 0, "baselin": 0, "rand_koffi": 0, "2": [0, 4, 5, 6, 8], "60": 0, "x0": 0, "55": 0, "81": [0, 2], "rand_node_ffi": 0, "107": 0, "58": 0, "01": 0, "7400": 0, "intel": 0, "core": 0, "i5": 0, "4460": 0, "10": 0, "3": [0, 2, 6, 8], "87": 0, "54": 0, "84": 0, "02": 0, "4100": 0, "similar": [0, 3], "which": [0, 2, 6, 7], "take": [0, 3, 8], "string": [0, 1, 2, 3, 5, 7], "paramet": [0, 4, 7, 8], "javascript": [0, 4, 8], "v8": [0, 3], "convers": [0, 1, 8], "slow": [0, 2], "heavi": 0, "atoi_napi": 0, "97": 0, "atoi_koffi": 0, "5": [0, 3, 8], "07": 0, "71": 0, "atoi_node_ffi": 0, "693": 0, "16": [0, 8], "005": 0, "23000": 0, "91": 0, "50": 0, "99": 0, "479": 0, "34": 0, "006": 0, "16000": 0, "cpu": 0, "imag": 0, "draw": 0, "much": [0, 2], "heavier": 0, "than": [0, 5], "thu": 0, "reduc": [0, 1], "In": [0, 3, 8], "full": [0, 2, 8], "version": [0, 1, 2, 3, 4, 6, 8], "nativ": [0, 3], "wrapper": [0, 2], "raylib_cc": 0, "100": 0, "9": [0, 1], "31": 0, "x1": 0, "17": 0, "15": [0, 8], "raylib_node_raylib": 0, "90": 0, "raylib_koffi": 0, "12": [0, 2, 6], "86": 0, "18": [0, 8], "raylib_node_ffi": 0, "35": 0, "76": 0, "30": [0, 8], "228": 0, "67": 0, "05": 0, "14": [0, 1, 8], "23": 0, "63": 0, "27": [0, 3], "270": 0, "open": [0, 3, 8], "consol": [0, 3, 5, 8], "go": [0, 2], "cnoke": [0, 2], "befor": [0, 1, 2, 8], "do": [0, 2, 3, 8], "anyth": 0, "els": [0, 8], "cd": [0, 2], "onc": [0, 2, 3, 5, 7, 8], "done": [0, 2, 3, 8], "you": [0, 2, 3, 4, 6, 7, 8], "can": [0, 1, 2, 3, 4, 5, 6, 7, 8], "each": [0, 2, 3, 8], "e": [0, 3, 8], "g": [0, 2, 3, 8], "build": [0, 1, 4, 6, 8], "option": [0, 2, 3, 4, 8], "defin": [0, 8], "custom": 0, "number": [0, 1, 5, 8], "10000000": 0, "main": [1, 3], "fix": [1, 2, 4], "possibl": [1, 2, 8], "openbsd": [1, 6], "i386": 1, "crash": [1, 3], "void": [1, 3, 7, 8], "misconvers": 1, "sign": [1, 8], "integ": [1, 3, 8], "return": [1, 3, 8], "valu": [1, 3, 4, 7, 8], "unsign": [1, 3, 7, 8], "other": [1, 3, 8], "chang": [1, 2, 3, 5, 8], "support": [1, 2, 3, 4, 8], "empti": 1, "signatur": 1, "disabl": [1, 2], "unsaf": 1, "optim": [1, 2], "variou": [1, 2], "document": [1, 8], "improv": 1, "mode": 1, "grace": 1, "degrad": 1, "older": [1, 6], "toolchain": 1, "linux": [1, 2, 4, 6], "debian": [1, 2], "prebuilt": [1, 2, 6], "binari": [1, 2, 6], "when": [1, 2, 3, 5, 8], "instal": [1, 2, 6, 7], "rebuild": 1, "happen": [1, 3, 5, 8], "fail": [1, 2, 3, 8], "load": [1, 3, 7, 8], "major": [1, 2], "expand": 1, "move": 1, "http": [1, 2, 4], "dev": [1, 2], "arrai": [1, 2, 4], "typedarrai": [1, 8], "pointer": [1, 3, 4], "argument": [1, 3, 8], "input": [1, 3, 8], "output": [1, 4, 7, 8], "mix": [1, 2, 8], "convert": [1, 3, 8], "null": [1, 3, 7, 8], "instead": [1, 2, 8], "struct": [1, 2, 4, 5, 7], "member": [1, 3, 8], "callback": [1, 4, 5, 6, 8], "default": [1, 2, 3, 4, 8], "hint": [1, 8], "char": [1, 3, 7, 8], "char16": [1, 8], "char16_t": [1, 8], "definit": [1, 4, 8], "long": [1, 8], "type": [1, 2, 3, 4, 7], "window": [1, 4, 6], "x64": 1, "llp64": [1, 8], "model": 1, "restrict": [1, 2], "automat": [1, 2, 3, 8], "detect": 1, "float": [1, 3, 6, 8], "point": [1, 8], "abi": [1, 2, 6, 8], "arm32": [1, 6], "risc": [1, 6], "v": [1, 6], "forbid": 1, "duplic": 1, "name": [1, 2, 3, 8], "new": [1, 3, 5, 8], "featur": [1, 4], "arm64": [1, 2, 6], "now": [1, 2, 7, 8], "A": [1, 6, 8], "maco": [1, 2, 6], "m1": 1, "includ": [1, 2, 3, 6, 8], "entri": 1, "sinc": [1, 4], "cdecl": [1, 3, 6], "stdcall": [1, 3, 6, 7], "all": [1, 6, 8], "platform": [1, 3, 4, 5, 8], "64": [1, 3, 5, 6, 8], "lp64d": [1, 6], "lp64": [1, 6, 8], "untest": [1, 6], "expos": [1, 8], "set": [1, 4], "memori": [1, 2, 3, 4, 8], "usag": [1, 4], "synchron": [1, 4, 5], "asynchron": [1, 4, 5], "transpar": [1, 8], "between": [1, 3], "buffer": [1, 8], "tent": 1, "excess": 1, "stack": [1, 5], "align": [1, 8], "x86": [1, 3, 6, 7], "potenti": [1, 8], "problem": 1, "big": [1, 3, 5, 8], "int64_t": [1, 7, 8], "uint64_t": [1, 8], "layout": 1, "error": [1, 3, 8], "push": [1, 8], "pop": 1, "issu": [1, 2, 3], "incomplet": 1, "buggi": 1, "hfa": [1, 2], "caus": [1, 3], "miss": [1, 2], "map_stack": 1, "flag": 1, "non": [1, 3, 8], "sens": 1, "intern": [1, 8], "fals": [1, 8], "normal": [1, 5, 8], "make": [1, 2], "sure": [1, 2], "we": [1, 2, 8], "have": [1, 2, 7, 8], "redzon": 1, "architectur": [1, 2, 3, 4, 6, 8], "slower": 1, "alloc": [1, 2, 5, 8], "object": [1, 2, 3, 5, 8], "repositori": 2, "luigi": 2, "monorepo": 2, "contain": [2, 8], "multipl": 2, "project": 2, "idea": 2, "github": 2, "com": 2, "koromix": 2, "provid": [2, 3, 8], "packag": [2, 6], "npm": [2, 6, 7], "archiv": 2, "so": [2, 3, 7, 8], "most": [2, 3, 8], "case": [2, 3, 8], "should": 2, "If": [2, 3, 8], "want": 2, "hack": 2, "specif": [2, 5], "follow": [2, 3, 6, 8], "instruct": [2, 3], "start": [2, 3, 4], "clone": 2, "git": 2, "As": 2, "said": 2, "monorepositori": 2, "conta": 2, "henc": 2, "depend": [2, 3, 8], "met": 2, "desktop": 2, "develop": 2, "workload": 2, "visual": 2, "studio": 2, "2022": 2, "2019": 2, "tool": 2, "compon": 2, "cmake": 2, "meta": 2, "system": [2, 7], "later": [2, 4, 6], "command": 2, "benchmark": [2, 4], "directori": [2, 8], "what": 2, "gcc": 2, "8": [2, 3, 8], "newer": 2, "gnu": [2, 4], "emul": 2, "acceler": 2, "qemu": 2, "need": [2, 3, 8], "even": 2, "gui": 2, "ubuntu": 2, "directli": [2, 8], "licens": 2, "size": [1, 2, 4, 5], "reason": [2, 8], "thei": [2, 3, 8], "avail": [2, 5], "file": [2, 3, 8], "For": [2, 3, 5, 6, 8], "exampl": [2, 4, 8], "wget": 2, "q": 2, "o": [2, 8], "qemu_debian_arm64": 2, "tar": 2, "zst": 2, "zstd": 2, "d": [2, 3, 8], "xv": 2, "sha256sum": 2, "ignor": [2, 3], "registri": 2, "txt": 2, "note": [2, 8], "disk": 2, "content": [2, 8], "mai": [2, 3], "checksum": 2, "been": [2, 3], "least": [2, 5], "And": [2, 7], "sever": [2, 3], "help": 2, "patient": 2, "ccach": 2, "subsequ": [2, 5], "step": 2, "get": [2, 5, 7, 8], "more": [2, 3, 4, 5, 8], "toler": 2, "By": [2, 3, 8], "stop": 2, "But": [2, 8], "ahead": 2, "without": [2, 6], "shut": 2, "down": 2, "again": 2, "everyth": 2, "also": [2, 8], "subset": 2, "cycl": 2, "debian_x64": 2, "debian_i386": 2, "separ": 2, "shutdown": 2, "final": [2, 8], "join": 2, "ssh": 2, "shortcut": 2, "some": [2, 8], "debug": 2, "ani": [2, 4, 8], "manual": 2, "procedur": [2, 3], "configur": [1, 2], "vnc": 2, "server": 2, "local": [2, 7], "access": 2, "displai": 2, "krdc": 2, "compat": 2, "viewer": 2, "info": 2, "port": 2, "after": [2, 3], "releas": 2, "0": [2, 3, 4, 8], "current": [2, 7, 8], "prioriti": 2, "next": [2, 8], "autom": 2, "aarch64": [2, 6], "how": [2, 3, 4, 8], "creat": [2, 3, 8], "real": 2, "world": [2, 3, 7, 8], "librari": [2, 3, 7, 8], "raylib": [2, 4], "sqlite": [2, 3], "libsodium": 2, "illustr": [2, 7, 8], "work": [2, 4], "plan": 2, "eventu": 2, "necessarili": 2, "order": [2, 3], "pass": [2, 3, 8], "helper": 2, "add": [1, 2, 8], "parser": [2, 3], "wai": [2, 7, 8], "encod": [2, 8], "decod": 2, "byte": [2, 5, 8], "union": 2, "better": 2, "deal": [2, 3, 8], "caller": 2, "heap": [1, 2, 5], "etc": [2, 3], "powerpc": 2, "power9": 2, "assembl": [2, 5], "unwind": 2, "cfi": 2, "direct": [2, 8], "experi": 2, "program": [2, 3, 4], "It": [2, 3, 7, 8], "addon": 2, "interact": 2, "person": 2, "prefer": [2, 3], "goe": 2, "rather": 2, "like": [2, 7, 8], "care": 2, "templat": 2, "mainli": 2, "littl": 2, "orient": [2, 8], "i": [2, 8], "strongli": 2, "tag": 2, "over": 2, "inherit": 2, "virtual": 2, "method": 2, "except": [2, 3], "To": 3, "declar": [3, 7, 8], "share": [3, 7, 8], "const": [3, 7, 8], "requir": [3, 6, 7, 8], "lib": [3, 7, 8], "path": [3, 8], "extens": 3, "dll": [3, 7, 8], "dylib": 3, "from": [3, 4, 6, 8], "two": [3, 5, 8], "inspir": 3, "specifi": [3, 8], "its": [3, 8], "mangl": 3, "ellipsi": 3, "last": [3, 8], "printf": [3, 7], "func": [3, 7, 8], "int": [3, 7, 8], "atoi": [3, 4], "tri": 3, "convent": [3, 6, 7], "see": [3, 4, 8], "section": [3, 8], "inform": [3, 4, 8], "subject": 3, "shown": 3, "fmt": 3, "onli": [3, 6, 8], "per": 3, "process": 3, "32": 3, "bit": [3, 8], "form": 3, "descript": [3, 5], "__stdcall": [3, 8], "within": 3, "win32": [3, 7, 8], "fastcal": [3, 6], "__fastcal": 3, "rare": [3, 8], "ecx": 3, "edx": 3, "thiscal": [3, 6], "__thiscal": 3, "safe": 3, "simpli": [3, 8], "find": [3, 4, 7, 8], "show": [3, 7, 8], "user32": [3, 7], "equival": [3, 8], "messageboxa_1": 3, "messageboxa": [3, 7], "uint": [3, 7, 8], "messageboxa_2": 3, "hwnd": 3, "text": 3, "caption": 3, "async": [1, 3], "err": 3, "re": 3, "libc": [3, 7], "6": [3, 7, 8], "str": [3, 8], "1257": 3, "log": [3, 5, 8], "result": [3, 4, 7, 8], "hello": [3, 7, 8], "print": [3, 7, 8], "worker": 3, "your": [3, 4], "respons": 3, "data": [3, 4], "multi": 3, "easili": 3, "style": [3, 4], "promis": 3, "util": 3, "promisifi": 3, "cannot": [3, 5, 8], "must": 3, "addit": [3, 8], "expect": [3, 6, 8], "doubl": [3, 6, 8], "THE": 3, "end": 3, "s": [3, 8], "On": 3, "forward": [3, 6], "howev": [3, 8], "mani": [1, 3, 8], "simplici": [], "semant": [3, 8], "primit": [3, 4], "marshal": 3, "out": [3, 8], "timev": [3, 7], "inout": 3, "dual": 3, "same": [3, 5, 8], "msdn": 3, "qualifi": 3, "_out_": [3, 7, 8], "_inout_": [3, 8], "posix": 3, "gettimeofdai": [3, 7], "tv_sec": [3, 7], "tv_usec": [3, 7], "timezon": [3, 7], "tz_minuteswest": [3, 7], "tz_dsttime": [3, 7], "tv": [3, 7], "tz": [3, 7], "let": [3, 5, 7, 8], "databas": 3, "sqlite3_db": 3, "copi": [3, 8], "sqlite3_open_v2": 3, "sqlite_open_readwrit": 3, "0x2": 3, "sqlite_open_cr": 3, "0x4": 3, "db": 3, "throw": [3, 8], "sqlite3_close_v2": 3, "With": 3, "noth": 3, "examplecallback": 3, "sum": [3, 8], "adddoublefloat": 3, "f": [3, 8], "them": 8, "part": 3, "h": [3, 8], "transfertoj": 3, "ag": 3, "cb": 3, "buf": 3, "snprintf": 3, "sizeof": [3, 8], "transfercallback": 3, "ret": 3, "niel": 3, "42": [3, 8], "run": [1, 3, 4, 5, 7], "precis": [3, 6], "intepret": 3, "anoth": [3, 8], "undefin": [3, 8], "behavior": [3, 8], "lead": 3, "mess": [3, 8], "fast": 4, "easi": 4, "low": 4, "aggreg": 4, "both": [4, 8], "well": 4, "popular": 4, "os": [4, 6, 8], "combin": [4, 6], "introspect": 4, "variad": [4, 7], "thread": 4, "safeti": 4, "rand": 4, "contribut": 4, "bug": 4, "request": 4, "sourc": [4, 6], "todo": 4, "list": [4, 8], "changelog": 4, "free": [4, 8], "softwar": 4, "redistribut": 4, "modifi": [4, 8], "under": 4, "term": 4, "affero": 4, "gener": [4, 8], "public": 4, "publish": 4, "foundat": 4, "either": [4, 8], "www": 4, "org": 4, "prealloc": 5, "block": 5, "One": 5, "construct": 5, "assign": [5, 8], "mib": 5, "unless": 5, "veri": 5, "page": 5, "extra": 5, "ever": 5, "dure": 5, "config": 5, "obj": 5, "appli": [5, 8], "true": [5, 8], "made": 5, "unus": 5, "resid": 5, "still": 5, "finish": 5, "freed": 5, "resident_async_pool": 5, "left": 5, "sync_stack_s": 5, "sync_heap_s": 5, "async_stack_s": 5, "512": 5, "kib": 5, "async_heap_s": 5, "pool": 5, "moment": 6, "isa": 6, "freebsd": 6, "ia32": 6, "ye": 6, "x86_64": 6, "amd64": 6, "le": [6, 8], "probabl": 6, "fulli": 6, "green": 6, "check": 6, "mark": 6, "mean": [6, 8], "earlier": 6, "nvm": 6, "recent": 6, "distribut": 6, "ms": 6, "hard": 6, "vfp": 6, "coprocessor": 6, "differ": [6, 8], "softfp": 6, "soft": 6, "theori": 6, "lp64f": 6, "prototyp": 7, "languag": 7, "syntax": 7, "time_t": 7, "tm": 7, "tm_sec": 7, "tm_min": 7, "tm_hour": 7, "tm_mdai": 7, "tm_mon": 7, "tm_year": 7, "tm_wdai": 7, "tm_ydai": 7, "tm_isdst": 7, "localtime_r": 7, "format": 7, "02d": 7, "target": 7, "messagebox": 7, "messag": 7, "user": [7, 8], "constant": 7, "mb_iconinform": 7, "0x40": 7, "foobar": [], "while": 8, "allow": 8, "variat": 8, "enforc": 8, "signed": 8, "valid": 8, "int8": 8, "int8_t": 8, "uint8": 8, "uint8_t": 8, "uchar": 8, "int16": 8, "int16_t": 8, "uint16": 8, "uint16_t": 8, "short": 8, "int32": 8, "4": [4, 8], "int32_t": 8, "uint32": 8, "uint32_t": 8, "int64": 8, "uint64": 8, "longlong": 8, "ulonglong": 8, "float32": 8, "float64": 8, "accept": 8, "bigint": 8, "exce": 8, "rang": 8, "revers": 8, "few": 8, "boolean": 8, "bool": 8, "usual": 8, "ulong": 8, "utf": 8, "string16": 8, "line": 8, "struct1": 8, "dummi": 8, "struct2": 8, "vice": 8, "versa": 8, "unlik": 8, "omit": 8, "anonym": 8, "typedef": 8, "b": 8, "d1": 8, "d2": 8, "rule": 8, "regard": 8, "pad": 8, "latter": 8, "function1": 8, "function2": 8, "differenti": 8, "purpos": 8, "import": 8, "distinguish": 8, "fall": 8, "avoid": 8, "expens": 8, "doe": 8, "sqlite3_stmt": [], "someth": 8, "stabil": 8, "prevent": 8, "dynam": 8, "termin": 8, "length": 8, "lot": 8, "getcursorpo": 8, "retriev": 8, "cursor": 8, "posit": 8, "kernel32": 8, "x": 8, "y": 8, "po": 8, "kind": 8, "pair": 8, "dedic": 8, "delet": 8, "obviou": 8, "found": 8, "stdio": 8, "fopen": 8, "fclose": 8, "manipul": 8, "fread": 8, "ftell": 8, "manag": 8, "builder": 8, "concaten": 8, "fizzbuzz": 8, "hidden": 8, "behind": 8, "destroi": 8, "concatnew": 8, "concatnewout": 8, "concatfre": 8, "clang": 8, "fpic": 8, "wall": 8, "o2": 8, "stdlib": 8, "stdbool": 8, "errno": 8, "fragment": 8, "size_t": 8, "len": 8, "concat": 8, "malloc": 8, "fprintf": 8, "stderr": 8, "strerror": 8, "concatappend": 8, "frag": 8, "strlen": 8, "memcpi": 8, "concatbuild": 8, "r": 8, "stupid": 8, "try": 8, "failur": 8, "buzz": 8, "fizz": 8, "infer": 8, "itself": 8, "sentinel": 8, "translat": 8, "proper": 8, "notion": 8, "fat": 8, "yourself": 8, "calcul": 8, "stdint": 8, "computetotallength": 8, "ptr": 8, "14n": [], "just": 8, "findfirstfilew": 8, "findnextfilew": 8, "filetim": 8, "dwlowdatetim": 8, "dwhighdatetim": 8, "win32_find_data": 8, "dwfileattribut": 8, "ftcreationtim": 8, "ftlastaccesstim": 8, "ftlastwritetim": 8, "nfilesizehigh": 8, "nfilesizelow": 8, "dwreserved0": 8, "dwreserved1": 8, "cfilenam": 8, "260": 8, "calternatefilenam": 8, "dwfiletyp": 8, "obsolet": 8, "dwcreatortyp": 8, "wfinderflag": 8, "ushort": 8, "findfirstfil": 8, "findnextfil": 8, "findclos": 8, "getlasterror": 8, "dirnam": 8, "filenam": [3, 8], "error_file_not_found": 8, "error_no_more_fil": 8, "among": 8, "variabl": 8, "invol": 8, "list1": 8, "list2": 8, "thank": 8, "singl": 8, "element": 8, "store": 8, "addint": 8, "dest": 8, "36": 8, "degener": 8, "emb": 8, "correct": 8, "uint8arrai": 8, "those": 8, "exactli": 8, "foo1": 8, "foo": 8, "a16": 8, "foo2": 8, "hypothet": 8, "returnfoo1": 8, "returnfoo": 8, "p": 8, "returnfoo2": 8, "int16arrai": 8, "fill": 8, "truncat": 8, "alwai": 8, "nul": 8, "explicitli": 8, "ask": 8, "explor": 8, "alignof": 8, "simplic": 3, "ve": 3, "warn": 3, "regist": 5, "There": 5, "max_async_cal": [1, 5], "maximum": [1, 5], "ongo": 5, "256": 5, "leak": 1}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"benchmark": 0, "rand": 0, "result": 0, "linux": [0, 7], "x86_64": 0, "window": [0, 2, 7], "atoi": 0, "raylib": 0, "run": [0, 2], "changelog": 1, "koffi": [1, 4], "1": [1, 4], "3": [1, 4], "4": 1, "2": 1, "0": 1, "contribut": 2, "bug": 2, "featur": 2, "request": 2, "build": 2, "from": 2, "sourc": 2, "other": 2, "platform": [2, 6], "test": 2, "todo": 2, "list": 2, "code": 2, "style": 2, "function": 3, "call": 3, "definit": 3, "classic": 3, "syntax": 3, "c": [3, 8], "like": 3, "prototyp": 3, "synchron": 3, "asynchron": 3, "variad": 3, "output": 3, "paramet": 3, "struct": [3, 8], "exampl": [3, 7], "opaqu": [3, 8], "handl": [3, 8], "javascript": 3, "callback": 3, "thread": 3, "safeti": 3, "overview": 4, "tabl": 4, "content": 4, "licens": 4, "memori": 5, "usag": 5, "how": 5, "work": 5, "default": 5, "set": 5, "support": 6, "quick": 7, "start": 7, "small": 7, "data": 8, "type": 8, "primit": 8, "pointer": 8, "arrai": 8, "fix": 8, "size": 8, "string": 8, "introspect": 8, "5": [1, 4]}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 56}})
@@ -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>
@@ -209,7 +210,7 @@
209
210
  </pre></div>
210
211
  </div>
211
212
  <p>Once you have installed Koffi, you can start by loading it this way:</p>
212
- <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>
213
+ <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>
213
214
  </pre></div>
214
215
  </div>
215
216
  <p>Below you can find three examples:</p>
@@ -219,68 +220,68 @@
219
220
  </ul>
220
221
  <section id="small-linux-example">
221
222
  <h2>Small Linux example<a class="headerlink" href="#small-linux-example" title="Permalink to this heading">#</a></h2>
222
- <p>This is a small example for Linux systems, which uses <code class="docutils literal notranslate"><span class="pre">gettimeofday()</span></code> and <code class="docutils literal notranslate"><span class="pre">printf()</span></code> to print the current time and the timezone.</p>
223
+ <p>This is a small example for Linux systems, which uses <code class="docutils literal notranslate"><span class="pre">gettimeofday()</span></code>, <code class="docutils literal notranslate"><span class="pre">localtime_r()</span></code> and <code class="docutils literal notranslate"><span class="pre">printf()</span></code> to print the current time.</p>
223
224
  <p>It illustrates the use of output parameters.</p>
224
- <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>
225
+ <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>
225
226
  <span class="linenos"> 2</span>
226
- <span class="linenos"> 3</span><span class="c1">// Load the shared library</span>
227
- <span class="linenos"> 4</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;libc.so.6&#39;</span><span class="p">);</span>
227
+ <span class="linenos"> 3</span><span class="c1">// Load the shared library</span><span class="w"></span>
228
+ <span class="linenos"> 4</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;libc.so.6&#39;</span><span class="p">);</span><span class="w"></span>
228
229
  <span class="linenos"> 5</span>
229
- <span class="linenos"> 6</span><span class="c1">// Declare struct types</span>
230
- <span class="linenos"> 7</span><span class="kd">const</span> <span class="nx">timeval</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;timeval&#39;</span><span class="p">,</span> <span class="p">{</span>
231
- <span class="linenos"> 8</span> <span class="nx">tv_sec</span><span class="o">:</span> <span class="s1">&#39;unsigned int&#39;</span><span class="p">,</span>
232
- <span class="linenos"> 9</span> <span class="nx">tv_usec</span><span class="o">:</span> <span class="s1">&#39;unsigned int&#39;</span>
233
- <span class="linenos">10</span><span class="p">});</span>
234
- <span class="linenos">11</span><span class="kd">const</span> <span class="nx">timezone</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;timezone&#39;</span><span class="p">,</span> <span class="p">{</span>
235
- <span class="linenos">12</span> <span class="nx">tz_minuteswest</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
236
- <span class="linenos">13</span> <span class="nx">tz_dsttime</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span>
237
- <span class="linenos">14</span><span class="p">});</span>
238
- <span class="linenos">15</span><span class="kd">const</span> <span class="nx">time_t</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;time_t&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">value</span><span class="o">:</span> <span class="s1">&#39;int64_t&#39;</span> <span class="p">});</span>
239
- <span class="linenos">16</span><span class="kd">const</span> <span class="nx">tm</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;tm&#39;</span><span class="p">,</span> <span class="p">{</span>
240
- <span class="linenos">17</span> <span class="nx">tm_sec</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
241
- <span class="linenos">18</span> <span class="nx">tm_min</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
242
- <span class="linenos">19</span> <span class="nx">tm_hour</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
243
- <span class="linenos">20</span> <span class="nx">tm_mday</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
244
- <span class="linenos">21</span> <span class="nx">tm_mon</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
245
- <span class="linenos">22</span> <span class="nx">tm_year</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
246
- <span class="linenos">23</span> <span class="nx">tm_wday</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
247
- <span class="linenos">24</span> <span class="nx">tm_yday</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span>
248
- <span class="linenos">25</span> <span class="nx">tm_isdst</span><span class="o">:</span> <span class="s1">&#39;int&#39;</span>
249
- <span class="linenos">26</span><span class="p">});</span>
230
+ <span class="linenos"> 6</span><span class="c1">// Declare struct types</span><span class="w"></span>
231
+ <span class="linenos"> 7</span><span class="kd">const</span><span class="w"> </span><span class="nx">timeval</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;timeval&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
232
+ <span class="linenos"> 8</span><span class="w"> </span><span class="nx">tv_sec</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;unsigned int&#39;</span><span class="p">,</span><span class="w"></span>
233
+ <span class="linenos"> 9</span><span class="w"> </span><span class="nx">tv_usec</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;unsigned int&#39;</span><span class="w"></span>
234
+ <span class="linenos">10</span><span class="p">});</span><span class="w"></span>
235
+ <span class="linenos">11</span><span class="kd">const</span><span class="w"> </span><span class="nx">timezone</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;timezone&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
236
+ <span class="linenos">12</span><span class="w"> </span><span class="nx">tz_minuteswest</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
237
+ <span class="linenos">13</span><span class="w"> </span><span class="nx">tz_dsttime</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="w"></span>
238
+ <span class="linenos">14</span><span class="p">});</span><span class="w"></span>
239
+ <span class="linenos">15</span><span class="kd">const</span><span class="w"> </span><span class="nx">time_t</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;time_t&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">value</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int64_t&#39;</span><span class="w"> </span><span class="p">});</span><span class="w"></span>
240
+ <span class="linenos">16</span><span class="kd">const</span><span class="w"> </span><span class="nx">tm</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;tm&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
241
+ <span class="linenos">17</span><span class="w"> </span><span class="nx">tm_sec</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
242
+ <span class="linenos">18</span><span class="w"> </span><span class="nx">tm_min</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
243
+ <span class="linenos">19</span><span class="w"> </span><span class="nx">tm_hour</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
244
+ <span class="linenos">20</span><span class="w"> </span><span class="nx">tm_mday</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
245
+ <span class="linenos">21</span><span class="w"> </span><span class="nx">tm_mon</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
246
+ <span class="linenos">22</span><span class="w"> </span><span class="nx">tm_year</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
247
+ <span class="linenos">23</span><span class="w"> </span><span class="nx">tm_wday</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
248
+ <span class="linenos">24</span><span class="w"> </span><span class="nx">tm_yday</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"></span>
249
+ <span class="linenos">25</span><span class="w"> </span><span class="nx">tm_isdst</span><span class="o">:</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="w"></span>
250
+ <span class="linenos">26</span><span class="p">});</span><span class="w"></span>
250
251
  <span class="linenos">27</span>
251
- <span class="linenos">28</span><span class="c1">// Find functions</span>
252
- <span class="linenos">29</span><span class="kd">const</span> <span class="nx">gettimeofday</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 gettimeofday(_Out_ timeval *tv, _Out_ timezone *tz)&#39;</span><span class="p">);</span>
253
- <span class="linenos">30</span><span class="kd">const</span> <span class="nx">localtime_r</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;tm *localtime_r(const time_t *timeval, _Out_ tm *result)&#39;</span><span class="p">);</span>
254
- <span class="linenos">31</span><span class="kd">const</span> <span class="nx">printf</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 printf(const char *format, ...)&#39;</span><span class="p">);</span>
252
+ <span class="linenos">28</span><span class="c1">// Find functions</span><span class="w"></span>
253
+ <span class="linenos">29</span><span class="kd">const</span><span class="w"> </span><span class="nx">gettimeofday</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 gettimeofday(_Out_ timeval *tv, _Out_ timezone *tz)&#39;</span><span class="p">);</span><span class="w"></span>
254
+ <span class="linenos">30</span><span class="kd">const</span><span class="w"> </span><span class="nx">localtime_r</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;tm *localtime_r(const time_t *timeval, _Out_ tm *result)&#39;</span><span class="p">);</span><span class="w"></span>
255
+ <span class="linenos">31</span><span class="kd">const</span><span class="w"> </span><span class="nx">printf</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 printf(const char *format, ...)&#39;</span><span class="p">);</span><span class="w"></span>
255
256
  <span class="linenos">32</span>
256
- <span class="linenos">33</span><span class="c1">// Get local time</span>
257
- <span class="linenos">34</span><span class="kd">let</span> <span class="nx">tv</span> <span class="o">=</span> <span class="p">{};</span>
258
- <span class="linenos">35</span><span class="kd">let</span> <span class="nx">now</span> <span class="o">=</span> <span class="p">{};</span>
259
- <span class="linenos">36</span><span class="nx">gettimeofday</span><span class="p">(</span><span class="nx">tv</span><span class="p">,</span> <span class="kc">null</span><span class="p">);</span>
260
- <span class="linenos">37</span><span class="nx">localtime_r</span><span class="p">({</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">tv</span><span class="p">.</span><span class="nx">tv_sec</span> <span class="p">},</span> <span class="nx">now</span><span class="p">);</span>
257
+ <span class="linenos">33</span><span class="c1">// Get local time</span><span class="w"></span>
258
+ <span class="linenos">34</span><span class="kd">let</span><span class="w"> </span><span class="nx">tv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{};</span><span class="w"></span>
259
+ <span class="linenos">35</span><span class="kd">let</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{};</span><span class="w"></span>
260
+ <span class="linenos">36</span><span class="nx">gettimeofday</span><span class="p">(</span><span class="nx">tv</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">);</span><span class="w"></span>
261
+ <span class="linenos">37</span><span class="nx">localtime_r</span><span class="p">({</span><span class="w"> </span><span class="nx">value</span><span class="o">:</span><span class="w"> </span><span class="nx">tv</span><span class="p">.</span><span class="nx">tv_sec</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="nx">now</span><span class="p">);</span><span class="w"></span>
261
262
  <span class="linenos">38</span>
262
- <span class="linenos">39</span><span class="c1">// And format it with printf (variadic function)</span>
263
- <span class="linenos">40</span><span class="nx">printf</span><span class="p">(</span><span class="s1">&#39;Hello World!\n&#39;</span><span class="p">);</span>
264
- <span class="linenos">41</span><span class="nx">printf</span><span class="p">(</span><span class="s1">&#39;Local time: %02d:%02d:%02d\n&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="nx">now</span><span class="p">.</span><span class="nx">tm_hour</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="nx">now</span><span class="p">.</span><span class="nx">tm_min</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="nx">now</span><span class="p">.</span><span class="nx">tm_sec</span><span class="p">);</span>
263
+ <span class="linenos">39</span><span class="c1">// And format it with printf (variadic function)</span><span class="w"></span>
264
+ <span class="linenos">40</span><span class="nx">printf</span><span class="p">(</span><span class="s1">&#39;Hello World!\n&#39;</span><span class="p">);</span><span class="w"></span>
265
+ <span class="linenos">41</span><span class="nx">printf</span><span class="p">(</span><span class="s1">&#39;Local time: %02d:%02d:%02d\n&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">now</span><span class="p">.</span><span class="nx">tm_hour</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">now</span><span class="p">.</span><span class="nx">tm_min</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">now</span><span class="p">.</span><span class="nx">tm_sec</span><span class="p">);</span><span class="w"></span>
265
266
  </pre></div>
266
267
  </div>
267
268
  </section>
268
269
  <section id="small-windows-example">
269
270
  <h2>Small Windows example<a class="headerlink" href="#small-windows-example" title="Permalink to this heading">#</a></h2>
270
- <p>This is a small example targeting the Win32 API, using <code class="docutils literal notranslate"><span class="pre">MessageBox()</span></code> to show a Hello message to the user.</p>
271
+ <p>This is a small example targeting the Win32 API, using <code class="docutils literal notranslate"><span class="pre">MessageBox()</span></code> to show a <em>Hello World!</em> message to the user.</p>
271
272
  <p>It illustrates the use of the x86 stdcall calling convention.</p>
272
- <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>
273
+ <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>
273
274
  <span class="linenos"> 2</span>
274
- <span class="linenos"> 3</span><span class="c1">// Load the shared library</span>
275
- <span class="linenos"> 4</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;user32.dll&#39;</span><span class="p">);</span>
275
+ <span class="linenos"> 3</span><span class="c1">// Load the shared library</span><span class="w"></span>
276
+ <span class="linenos"> 4</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;user32.dll&#39;</span><span class="p">);</span><span class="w"></span>
276
277
  <span class="linenos"> 5</span>
277
- <span class="linenos"> 6</span><span class="c1">// Declare constants</span>
278
- <span class="linenos"> 7</span><span class="kd">const</span> <span class="nx">MB_ICONINFORMATION</span> <span class="o">=</span> <span class="mh">0x40</span><span class="p">;</span>
278
+ <span class="linenos"> 6</span><span class="c1">// Declare constants</span><span class="w"></span>
279
+ <span class="linenos"> 7</span><span class="kd">const</span><span class="w"> </span><span class="nx">MB_ICONINFORMATION</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mh">0x40</span><span class="p">;</span><span class="w"></span>
279
280
  <span class="linenos"> 8</span>
280
- <span class="linenos"> 9</span><span class="c1">// Find functions</span>
281
- <span class="linenos">10</span><span class="kd">const</span> <span class="nx">MessageBoxA</span> <span class="o">=</span> <span class="nx">lib</span><span class="p">.</span><span class="nx">stdcall</span><span class="p">(</span><span class="s1">&#39;MessageBoxA&#39;</span><span class="p">,</span> <span class="s1">&#39;int&#39;</span><span class="p">,</span> <span class="p">[</span><span class="s1">&#39;void *&#39;</span><span class="p">,</span> <span class="s1">&#39;string&#39;</span><span class="p">,</span> <span class="s1">&#39;string&#39;</span><span class="p">,</span> <span class="s1">&#39;uint&#39;</span><span class="p">]);</span>
281
+ <span class="linenos"> 9</span><span class="c1">// Find functions</span><span class="w"></span>
282
+ <span class="linenos">10</span><span class="kd">const</span><span class="w"> </span><span class="nx">MessageBoxA</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">stdcall</span><span class="p">(</span><span class="s1">&#39;MessageBoxA&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;int&#39;</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;void *&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;string&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;string&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;uint&#39;</span><span class="p">]);</span><span class="w"></span>
282
283
  <span class="linenos">11</span>
283
- <span class="linenos">12</span><span class="nx">MessageBoxA</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="s1">&#39;Hello&#39;</span><span class="p">,</span> <span class="s1">&#39;Foobar&#39;</span><span class="p">,</span> <span class="nx">MB_ICONINFORMATION</span><span class="p">);</span>
284
+ <span class="linenos">12</span><span class="nx">MessageBoxA</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;Hello World!&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;Koffi&#39;</span><span class="p">,</span><span class="w"> </span><span class="nx">MB_ICONINFORMATION</span><span class="p">);</span><span class="w"></span>
284
285
  </pre></div>
285
286
  </div>
286
287
  </section>