koffi 2.0.1 → 2.1.0-beta.3
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.
- package/CMakeLists.txt +2 -9
- package/ChangeLog.md +17 -0
- package/benchmark/atoi_koffi.js +12 -8
- package/benchmark/atoi_napi.js +12 -8
- package/benchmark/atoi_node_ffi.js +11 -10
- package/benchmark/raylib_cc.cc +12 -9
- package/benchmark/raylib_koffi.js +15 -13
- package/benchmark/raylib_node_ffi.js +15 -13
- package/benchmark/raylib_node_raylib.js +14 -11
- package/build/qemu/2.1.0-beta.3/koffi_darwin_arm64.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_linux_arm32hf.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_openbsd_ia32.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_openbsd_x64.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_win32_arm64.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/2.1.0-beta.3/koffi_win32_x64.tar.gz +0 -0
- package/doc/Makefile +1 -1
- package/doc/changes.md +12 -8
- package/doc/conf.py +5 -0
- package/doc/dist/doctrees/changes.doctree +0 -0
- package/doc/dist/doctrees/environment.pickle +0 -0
- package/doc/dist/doctrees/functions.doctree +0 -0
- package/doc/dist/doctrees/index.doctree +0 -0
- package/doc/dist/doctrees/types.doctree +0 -0
- package/doc/dist/html/.buildinfo +1 -1
- package/doc/dist/html/_sources/changes.md.txt +12 -8
- package/doc/dist/html/_sources/functions.md.txt +71 -5
- package/doc/dist/html/_sources/types.md.txt +147 -159
- package/doc/dist/html/benchmarks.html +2 -3
- package/doc/dist/html/changes.html +64 -35
- package/doc/dist/html/contribute.html +2 -3
- package/doc/dist/html/functions.html +73 -12
- package/doc/dist/html/genindex.html +2 -3
- package/doc/dist/html/index.html +6 -7
- package/doc/dist/html/memory.html +2 -3
- package/doc/dist/html/objects.inv +0 -0
- package/doc/dist/html/platforms.html +3 -4
- package/doc/dist/html/search.html +2 -3
- package/doc/dist/html/searchindex.js +1 -1
- package/doc/dist/html/start.html +2 -3
- package/doc/dist/html/types.html +238 -237
- package/doc/functions.md +71 -5
- package/doc/make.bat +1 -1
- package/doc/templates/badges.html +1 -2
- package/doc/types.md +149 -159
- package/package.json +3 -2
- package/qemu/qemu.js +1 -1
- package/src/abi_arm32.cc +208 -102
- package/src/abi_arm64.cc +239 -55
- package/src/abi_riscv64.cc +128 -40
- package/src/abi_x64_sysv.cc +135 -41
- package/src/abi_x64_win.cc +134 -40
- package/src/abi_x86.cc +182 -67
- package/src/call.cc +241 -26
- package/src/call.hh +15 -3
- package/src/ffi.cc +120 -31
- package/src/ffi.hh +19 -0
- package/src/index.js +4 -2
- package/src/parser.cc +3 -5
- package/src/util.cc +44 -1
- package/src/util.hh +4 -0
- package/test/async.js +1 -2
- package/test/callbacks.js +2 -3
- package/test/misc.c +64 -1
- package/test/raylib.js +1 -1
- package/test/sqlite.js +3 -3
- package/test/sync.js +108 -3
- package/build/qemu/2.0.1/koffi_darwin_arm64.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_linux_arm32hf.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_linux_riscv64hf64.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_openbsd_ia32.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_openbsd_x64.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_win32_arm64.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/2.0.1/koffi_win32_x64.tar.gz +0 -0
|
@@ -174,10 +174,9 @@
|
|
|
174
174
|
|
|
175
175
|
</div>
|
|
176
176
|
<div style="text-align: center; margin-top: 2em;">
|
|
177
|
+
<a href="https://www.npmjs.com/package/koffi"><img src="https://img.shields.io/badge/NPM-2.O.1-brightgreen" alt="NPM"/></a>
|
|
177
178
|
<a href="https://github.com/Koromix/luigi/tree/master/koffi"><img src="https://img.shields.io/badge/GitHub-Koffi-ff6600" alt="GitHub"/></a>
|
|
178
|
-
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
179
|
+
</div></div>
|
|
181
180
|
|
|
182
181
|
</div>
|
|
183
182
|
|
|
@@ -211,6 +210,31 @@
|
|
|
211
210
|
<h1>Changelog<a class="headerlink" href="#changelog" title="Permalink to this heading">#</a></h1>
|
|
212
211
|
<section id="history">
|
|
213
212
|
<h2>History<a class="headerlink" href="#history" title="Permalink to this heading">#</a></h2>
|
|
213
|
+
<section id="koffi-2-1-0-in-beta">
|
|
214
|
+
<h3>Koffi 2.1.0 (in beta)<a class="headerlink" href="#koffi-2-1-0-in-beta" title="Permalink to this heading">#</a></h3>
|
|
215
|
+
<p><strong>Main changes:</strong></p>
|
|
216
|
+
<ul class="simple">
|
|
217
|
+
<li><p>Add <a class="reference internal" href="functions#polymorphic-parameters"><span class="std std-doc">koffi.as()</span></a> to support polymorphic APIs based on <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">*</span></code> parameters</p></li>
|
|
218
|
+
<li><p>Add <a class="reference internal" href="types#endian-sensitive-types"><span class="std std-doc">endian-sensitive integer types</span></a>: <code class="docutils literal notranslate"><span class="pre">intX_le_t</span></code>, <code class="docutils literal notranslate"><span class="pre">intX_be_t</span></code></p></li>
|
|
219
|
+
<li><p>Accept typed arrays for <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">*</span></code> parameters</p></li>
|
|
220
|
+
<li><p>Introduce <code class="docutils literal notranslate"><span class="pre">koffi.opaque()</span></code> to replace <code class="docutils literal notranslate"><span class="pre">koffi.handle()</span></code> (which remains supported until Koffi 3.0)</p></li>
|
|
221
|
+
</ul>
|
|
222
|
+
<p><strong>Other changes:</strong></p>
|
|
223
|
+
<ul class="simple">
|
|
224
|
+
<li><p>Improve global performance with inlining and unity builds</p></li>
|
|
225
|
+
<li><p>Add <code class="docutils literal notranslate"><span class="pre">size_t</span></code> primitive type</p></li>
|
|
226
|
+
<li><p>Support member-specific alignement value in structs</p></li>
|
|
227
|
+
<li><p>Detect impossible parameters and return types (such as non-pointer opaque types)</p></li>
|
|
228
|
+
<li><p>Various documentation fixes and improvements</p></li>
|
|
229
|
+
</ul>
|
|
230
|
+
</section>
|
|
231
|
+
<section id="koffi-2-0-1">
|
|
232
|
+
<h3>Koffi 2.0.1<a class="headerlink" href="#koffi-2-0-1" title="Permalink to this heading">#</a></h3>
|
|
233
|
+
<p><strong>Main changes:</strong></p>
|
|
234
|
+
<ul class="simple">
|
|
235
|
+
<li><p>Return <code class="docutils literal notranslate"><span class="pre">undefined</span></code> (instead of null) for <code class="docutils literal notranslate"><span class="pre">void</span></code> functions</p></li>
|
|
236
|
+
</ul>
|
|
237
|
+
</section>
|
|
214
238
|
<section id="koffi-2-0-0">
|
|
215
239
|
<h3>Koffi 2.0.0<a class="headerlink" href="#koffi-2-0-0" title="Permalink to this heading">#</a></h3>
|
|
216
240
|
<p><strong>Major new features:</strong></p>
|
|
@@ -421,7 +445,7 @@
|
|
|
421
445
|
<p>You may need to change your code if you use:</p>
|
|
422
446
|
<ul class="simple">
|
|
423
447
|
<li><p>Callback functions</p></li>
|
|
424
|
-
<li><p>Opaque
|
|
448
|
+
<li><p>Opaque types</p></li>
|
|
425
449
|
<li><p><code class="docutils literal notranslate"><span class="pre">koffi.introspect()</span></code></p></li>
|
|
426
450
|
</ul>
|
|
427
451
|
<section id="callback-types">
|
|
@@ -471,10 +495,11 @@
|
|
|
471
495
|
</div>
|
|
472
496
|
<p>Koffi 1.x only supported <a class="reference internal" href="functions#javascript-callbacks"><span class="std std-doc">transient callbacks</span></a>, you must use Koffi 2.x for registered callbacks.</p>
|
|
473
497
|
</section>
|
|
474
|
-
<section id="opaque-
|
|
475
|
-
<h4>Opaque
|
|
476
|
-
<p>In Koffi 1.x, opaque handles were defined in a way that made them usable directly as parameter and return types, obscuring the underlying pointer. Now, you must use them through a pointer, and use an array for output parameters.</p>
|
|
477
|
-
<p>
|
|
498
|
+
<section id="opaque-types">
|
|
499
|
+
<h4>Opaque types<a class="headerlink" href="#opaque-types" title="Permalink to this heading">#</a></h4>
|
|
500
|
+
<p>In Koffi 1.x, opaque handles were defined in a way that made them usable directly as parameter and return types, obscuring the underlying pointer. Now, in Koffi 2.0, you must use them through a pointer, and use an array for output parameters.</p>
|
|
501
|
+
<p>In addition to that, <code class="docutils literal notranslate"><span class="pre">koffi.handle()</span></code> has been deprecated in Koffi 2.1 and replaced with <code class="docutils literal notranslate"><span class="pre">koffi.opaque()</span></code>. They work the same but new code should use <code class="docutils literal notranslate"><span class="pre">koffi.opaque()</span></code>, the former one will eventually be removed in Koffi 3.0.</p>
|
|
502
|
+
<p>For functions that return opaque pointers or pass them by parameter:</p>
|
|
478
503
|
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 1.x</span>
|
|
479
504
|
<span class="linenos"> 2</span>
|
|
480
505
|
<span class="linenos"> 3</span><span class="kd">const</span> <span class="nx">FILE</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">'FILE'</span><span class="p">);</span>
|
|
@@ -487,16 +512,17 @@
|
|
|
487
512
|
<span class="linenos">10</span><span class="nx">fclose</span><span class="p">(</span><span class="nx">fp</span><span class="p">);</span>
|
|
488
513
|
</pre></div>
|
|
489
514
|
</div>
|
|
490
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.
|
|
515
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.1</span>
|
|
491
516
|
<span class="linenos"> 2</span>
|
|
492
|
-
<span class="linenos"> 3</span><span class="
|
|
493
|
-
<span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">
|
|
494
|
-
<span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">fopen</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">'
|
|
495
|
-
<span class="linenos"> 6</span>
|
|
496
|
-
<span class="linenos"> 7</span
|
|
497
|
-
<span class="linenos"> 8</span><span class="
|
|
498
|
-
<span class="linenos"> 9</span
|
|
499
|
-
<span class="linenos">10</span
|
|
517
|
+
<span class="linenos"> 3</span><span class="c1">// If you use Koffi 2.0: const FILE = koffi.handle('FILE');</span>
|
|
518
|
+
<span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">FILE</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">opaque</span><span class="p">(</span><span class="s1">'FILE'</span><span class="p">);</span>
|
|
519
|
+
<span class="linenos"> 5</span><span class="kd">const</span> <span class="nx">fopen</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">'fopen'</span><span class="p">,</span> <span class="s1">'FILE *'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'str'</span><span class="p">,</span> <span class="s1">'str'</span><span class="p">]);</span>
|
|
520
|
+
<span class="linenos"> 6</span><span class="kd">const</span> <span class="nx">fopen</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">'fclose'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'FILE *'</span><span class="p">]);</span>
|
|
521
|
+
<span class="linenos"> 7</span>
|
|
522
|
+
<span class="linenos"> 8</span><span class="kd">let</span> <span class="nx">fp</span> <span class="o">=</span> <span class="nx">fopen</span><span class="p">(</span><span class="s1">'EMPTY'</span><span class="p">,</span> <span class="s1">'wb'</span><span class="p">);</span>
|
|
523
|
+
<span class="linenos"> 9</span><span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">fp</span><span class="p">)</span>
|
|
524
|
+
<span class="linenos">10</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">'Failed to open file'</span><span class="p">);</span>
|
|
525
|
+
<span class="linenos">11</span><span class="nx">fclose</span><span class="p">(</span><span class="nx">fp</span><span class="p">);</span>
|
|
500
526
|
</pre></div>
|
|
501
527
|
</div>
|
|
502
528
|
<p>For functions that set opaque handles through output parameters (such as <code class="docutils literal notranslate"><span class="pre">sqlite3_open_v2</span></code>), you must now use a single element array as shown below:</p>
|
|
@@ -518,24 +544,25 @@
|
|
|
518
544
|
<span class="linenos">16</span><span class="nx">sqlite3_close_v2</span><span class="p">(</span><span class="nx">db</span><span class="p">);</span>
|
|
519
545
|
</pre></div>
|
|
520
546
|
</div>
|
|
521
|
-
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.
|
|
547
|
+
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="c1">// Koffi 2.1</span>
|
|
522
548
|
<span class="linenos"> 2</span>
|
|
523
|
-
<span class="linenos"> 3</span><span class="
|
|
524
|
-
<span class="linenos"> 4</span>
|
|
525
|
-
<span class="linenos"> 5</span
|
|
526
|
-
<span class="linenos"> 6</span><span class="kd">const</span> <span class="nx">
|
|
527
|
-
<span class="linenos"> 7</span>
|
|
528
|
-
<span class="linenos"> 8</span
|
|
529
|
-
<span class="linenos"> 9</span><span class="kd">const</span> <span class="nx">
|
|
530
|
-
<span class="linenos">10</span>
|
|
531
|
-
<span class="linenos">11</span
|
|
532
|
-
<span class="linenos">12</span>
|
|
533
|
-
<span class="linenos">13</span
|
|
534
|
-
<span class="linenos">14</span><span class="
|
|
535
|
-
<span class="linenos">15</span
|
|
536
|
-
<span class="linenos">16</span
|
|
537
|
-
<span class="linenos">17</span>
|
|
538
|
-
<span class="linenos">18</span
|
|
549
|
+
<span class="linenos"> 3</span><span class="c1">// If you use Koffi 2.0: const sqlite3 = koffi.handle('sqlite3');</span>
|
|
550
|
+
<span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">sqlite3</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">opaque</span><span class="p">(</span><span class="s1">'sqlite3'</span><span class="p">);</span>
|
|
551
|
+
<span class="linenos"> 5</span>
|
|
552
|
+
<span class="linenos"> 6</span><span class="kd">const</span> <span class="nx">sqlite3_open_v2</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">'int sqlite3_open_v2(const char *, _Out_ sqlite3 **db, int, const char *)'</span><span class="p">);</span>
|
|
553
|
+
<span class="linenos"> 7</span><span class="kd">const</span> <span class="nx">sqlite3_close_v2</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">'int sqlite3_close_v2(sqlite3 *db)'</span><span class="p">);</span>
|
|
554
|
+
<span class="linenos"> 8</span>
|
|
555
|
+
<span class="linenos"> 9</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">=</span> <span class="mh">0x2</span><span class="p">;</span>
|
|
556
|
+
<span class="linenos">10</span><span class="kd">const</span> <span class="nx">SQLITE_OPEN_CREATE</span> <span class="o">=</span> <span class="mh">0x4</span><span class="p">;</span>
|
|
557
|
+
<span class="linenos">11</span>
|
|
558
|
+
<span class="linenos">12</span><span class="kd">let</span> <span class="nx">db</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
|
|
559
|
+
<span class="linenos">13</span>
|
|
560
|
+
<span class="linenos">14</span><span class="kd">let</span> <span class="nx">ptr</span> <span class="o">=</span> <span class="p">[</span><span class="kc">null</span><span class="p">];</span>
|
|
561
|
+
<span class="linenos">15</span><span class="k">if</span> <span class="p">(</span><span class="nx">sqlite3_open_v2</span><span class="p">(</span><span class="s1">':memory:'</span><span class="p">,</span> <span class="nx">ptr</span><span class="p">,</span> <span class="nx">SQLITE_OPEN_READWRITE</span> <span class="o">|</span> <span class="nx">SQLITE_OPEN_CREATE</span><span class="p">,</span> <span class="kc">null</span><span class="p">)</span> <span class="o">!=</span> <span class="mf">0</span><span class="p">)</span>
|
|
562
|
+
<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">'Failed to open database'</span><span class="p">);</span>
|
|
563
|
+
<span class="linenos">17</span><span class="nx">db</span> <span class="o">=</span> <span class="nx">ptr</span><span class="p">[</span><span class="mf">0</span><span class="p">];</span>
|
|
564
|
+
<span class="linenos">18</span>
|
|
565
|
+
<span class="linenos">19</span><span class="nx">sqlite3_close_v2</span><span class="p">(</span><span class="nx">db</span><span class="p">);</span>
|
|
539
566
|
</pre></div>
|
|
540
567
|
</div>
|
|
541
568
|
</section>
|
|
@@ -608,6 +635,8 @@
|
|
|
608
635
|
<ul>
|
|
609
636
|
<li><a class="reference internal" href="#">Changelog</a><ul>
|
|
610
637
|
<li><a class="reference internal" href="#history">History</a><ul>
|
|
638
|
+
<li><a class="reference internal" href="#koffi-2-1-0-in-beta">Koffi 2.1.0 (in beta)</a></li>
|
|
639
|
+
<li><a class="reference internal" href="#koffi-2-0-1">Koffi 2.0.1</a></li>
|
|
611
640
|
<li><a class="reference internal" href="#koffi-2-0-0">Koffi 2.0.0</a></li>
|
|
612
641
|
<li><a class="reference internal" href="#koffi-1-3-12">Koffi 1.3.12</a></li>
|
|
613
642
|
<li><a class="reference internal" href="#koffi-1-3-11">Koffi 1.3.11</a></li>
|
|
@@ -630,7 +659,7 @@
|
|
|
630
659
|
<li><a class="reference internal" href="#migration-guide">Migration guide</a><ul>
|
|
631
660
|
<li><a class="reference internal" href="#koffi-1-x-to-2-x">Koffi 1.x to 2.x</a><ul>
|
|
632
661
|
<li><a class="reference internal" href="#callback-types">Callback types</a></li>
|
|
633
|
-
<li><a class="reference internal" href="#opaque-
|
|
662
|
+
<li><a class="reference internal" href="#opaque-types">Opaque types</a></li>
|
|
634
663
|
<li><a class="reference internal" href="#koffi-introspect">koffi.introspect()</a></li>
|
|
635
664
|
</ul>
|
|
636
665
|
</li>
|
|
@@ -174,10 +174,9 @@
|
|
|
174
174
|
|
|
175
175
|
</div>
|
|
176
176
|
<div style="text-align: center; margin-top: 2em;">
|
|
177
|
+
<a href="https://www.npmjs.com/package/koffi"><img src="https://img.shields.io/badge/NPM-2.O.1-brightgreen" alt="NPM"/></a>
|
|
177
178
|
<a href="https://github.com/Koromix/luigi/tree/master/koffi"><img src="https://img.shields.io/badge/GitHub-Koffi-ff6600" alt="GitHub"/></a>
|
|
178
|
-
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
179
|
+
</div></div>
|
|
181
180
|
|
|
182
181
|
</div>
|
|
183
182
|
|
|
@@ -174,10 +174,9 @@
|
|
|
174
174
|
|
|
175
175
|
</div>
|
|
176
176
|
<div style="text-align: center; margin-top: 2em;">
|
|
177
|
+
<a href="https://www.npmjs.com/package/koffi"><img src="https://img.shields.io/badge/NPM-2.O.1-brightgreen" alt="NPM"/></a>
|
|
177
178
|
<a href="https://github.com/Koromix/luigi/tree/master/koffi"><img src="https://img.shields.io/badge/GitHub-Koffi-ff6600" alt="GitHub"/></a>
|
|
178
|
-
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
179
|
+
</div></div>
|
|
181
180
|
|
|
182
181
|
</div>
|
|
183
182
|
|
|
@@ -325,15 +324,15 @@
|
|
|
325
324
|
<p>On x86 platforms, only the Cdecl convention can be used for variadic functions.</p>
|
|
326
325
|
</section>
|
|
327
326
|
</section>
|
|
328
|
-
<section id="
|
|
329
|
-
<h2>
|
|
327
|
+
<section id="special-considerations">
|
|
328
|
+
<h2>Special considerations<a class="headerlink" href="#special-considerations" title="Permalink to this heading">#</a></h2>
|
|
330
329
|
<section id="output-parameters">
|
|
331
330
|
<h3>Output parameters<a class="headerlink" href="#output-parameters" title="Permalink to this heading">#</a></h3>
|
|
332
331
|
<p>By default, Koffi will only forward arguments from Javascript to C. However, many C functions use pointer arguments for output values, or input/output values.</p>
|
|
333
332
|
<p>For simplicity, and because Javascript only has value semantics for primitive types, Koffi can marshal out (or in/out) two types of parameters:</p>
|
|
334
333
|
<ul class="simple">
|
|
335
334
|
<li><p><a class="reference internal" href="types#struct-types"><span class="std std-doc">Structs</span></a> (to/from JS objects)</p></li>
|
|
336
|
-
<li><p><a class="reference internal" href="types#opaque-
|
|
335
|
+
<li><p><a class="reference internal" href="types#opaque-types"><span class="std std-doc">Opaque types</span></a></p></li>
|
|
337
336
|
</ul>
|
|
338
337
|
<p>In order to change an argument from input-only to output or input/output, use the following functions:</p>
|
|
339
338
|
<ul class="simple">
|
|
@@ -370,13 +369,13 @@
|
|
|
370
369
|
</pre></div>
|
|
371
370
|
</div>
|
|
372
371
|
</section>
|
|
373
|
-
<section id="opaque-
|
|
374
|
-
<h4>Opaque
|
|
372
|
+
<section id="opaque-type-example">
|
|
373
|
+
<h4>Opaque type example<a class="headerlink" href="#opaque-type-example" title="Permalink to this heading">#</a></h4>
|
|
375
374
|
<p>This example opens an in-memory SQLite database, and uses the node-ffi-style function declaration syntax.</p>
|
|
376
375
|
<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">'koffi'</span><span class="p">);</span>
|
|
377
376
|
<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">'sqlite3.so'</span><span class="p">);</span>
|
|
378
377
|
<span class="linenos"> 3</span>
|
|
379
|
-
<span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">sqlite3</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">
|
|
378
|
+
<span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">sqlite3</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">opaque</span><span class="p">(</span><span class="s1">'sqlite3'</span><span class="p">);</span>
|
|
380
379
|
<span class="linenos"> 5</span>
|
|
381
380
|
<span class="linenos"> 6</span><span class="c1">// Use koffi.out() on a double pointer to copy out (from C to JS) after the call</span>
|
|
382
381
|
<span class="linenos"> 7</span><span class="kd">const</span> <span class="nx">sqlite3_open_v2</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">'sqlite3_open_v2'</span><span class="p">,</span> <span class="s1">'int'</span><span class="p">,</span> <span class="p">[</span><span class="s1">'str'</span><span class="p">,</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">out</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="nx">pointer</span><span class="p">(</span><span class="nx">sqlite3</span><span class="p">,</span> <span class="mf">2</span><span class="p">)),</span> <span class="s1">'int'</span><span class="p">,</span> <span class="s1">'str'</span><span class="p">]);</span>
|
|
@@ -395,10 +394,70 @@
|
|
|
395
394
|
</div>
|
|
396
395
|
</section>
|
|
397
396
|
</section>
|
|
397
|
+
<section id="polymorphic-parameters">
|
|
398
|
+
<h3>Polymorphic parameters<a class="headerlink" href="#polymorphic-parameters" title="Permalink to this heading">#</a></h3>
|
|
399
|
+
<p><em>New in Koffi 2.1</em></p>
|
|
400
|
+
<p>Many C functions use <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">*</span></code> parameters in order to pass polymorphic objects and arrays, meaning that the data format changes can change depending on one other argument, or on some kind of struct tag member.</p>
|
|
401
|
+
<p>Koffi provides two features to deal with this:</p>
|
|
402
|
+
<ul class="simple">
|
|
403
|
+
<li><p>Typed JS arrays can be used as values in place everywhere <code class="docutils literal notranslate"><span class="pre">void</span> <span class="pre">*</span></code> is expected. See <a class="reference internal" href="types#array-pointers-dynamic-arrays"><span class="std std-doc">dynamic arrays</span></a> for more information, for input or output.</p></li>
|
|
404
|
+
<li><p>You can use <code class="docutils literal notranslate"><span class="pre">koffi.as(value,</span> <span class="pre">type)</span></code> to tell Koffi what kind of type is actually expected.</p></li>
|
|
405
|
+
</ul>
|
|
406
|
+
<p>The example below shows the use of <code class="docutils literal notranslate"><span class="pre">koffi.as()</span></code> to read the header of a PNG file with <code class="docutils literal notranslate"><span class="pre">fread()</span></code>.</p>
|
|
407
|
+
<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">'koffi'</span><span class="p">);</span>
|
|
408
|
+
<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">'libc.so.6'</span><span class="p">);</span>
|
|
409
|
+
<span class="linenos"> 3</span>
|
|
410
|
+
<span class="linenos"> 4</span><span class="kd">const</span> <span class="nx">FILE</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">opaque</span><span class="p">(</span><span class="s1">'FILE'</span><span class="p">);</span>
|
|
411
|
+
<span class="linenos"> 5</span>
|
|
412
|
+
<span class="linenos"> 6</span><span class="kd">const</span> <span class="nx">PngHeader</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">pack</span><span class="p">(</span><span class="s1">'PngHeader'</span><span class="p">,</span> <span class="p">{</span>
|
|
413
|
+
<span class="linenos"> 7</span> <span class="nx">signature</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">'uint8_t'</span><span class="p">,</span> <span class="mf">8</span><span class="p">),</span>
|
|
414
|
+
<span class="linenos"> 8</span> <span class="nx">ihdr</span><span class="o">:</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">pack</span><span class="p">({</span>
|
|
415
|
+
<span class="linenos"> 9</span> <span class="nx">length</span><span class="o">:</span> <span class="s1">'uint32_be_t'</span><span class="p">,</span>
|
|
416
|
+
<span class="linenos">10</span> <span class="nx">chunk</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">'char'</span><span class="p">,</span> <span class="mf">4</span><span class="p">),</span>
|
|
417
|
+
<span class="linenos">11</span> <span class="nx">width</span><span class="o">:</span> <span class="s1">'uint32_be_t'</span><span class="p">,</span>
|
|
418
|
+
<span class="linenos">12</span> <span class="nx">height</span><span class="o">:</span> <span class="s1">'uint32_be_t'</span><span class="p">,</span>
|
|
419
|
+
<span class="linenos">13</span> <span class="nx">depth</span><span class="o">:</span> <span class="s1">'uint8_t'</span><span class="p">,</span>
|
|
420
|
+
<span class="linenos">14</span> <span class="nx">color</span><span class="o">:</span> <span class="s1">'uint8_t'</span><span class="p">,</span>
|
|
421
|
+
<span class="linenos">15</span> <span class="nx">compression</span><span class="o">:</span> <span class="s1">'uint8_t'</span><span class="p">,</span>
|
|
422
|
+
<span class="linenos">16</span> <span class="nx">filter</span><span class="o">:</span> <span class="s1">'uint8_t'</span><span class="p">,</span>
|
|
423
|
+
<span class="linenos">17</span> <span class="nx">interlace</span><span class="o">:</span> <span class="s1">'uint8_t'</span><span class="p">,</span>
|
|
424
|
+
<span class="linenos">18</span> <span class="nx">crc</span><span class="o">:</span> <span class="s1">'uint32_be_t'</span>
|
|
425
|
+
<span class="linenos">19</span> <span class="p">})</span>
|
|
426
|
+
<span class="linenos">20</span><span class="p">});</span>
|
|
427
|
+
<span class="linenos">21</span>
|
|
428
|
+
<span class="linenos">22</span><span class="kd">const</span> <span class="nx">fopen</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">'FILE *fopen(const char *path, const char *mode)'</span><span class="p">);</span>
|
|
429
|
+
<span class="linenos">23</span><span class="kd">const</span> <span class="nx">fclose</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">'int fclose(FILE *fp)'</span><span class="p">);</span>
|
|
430
|
+
<span class="linenos">24</span><span class="kd">const</span> <span class="nx">fread</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">'size_t fread(_Out_ void *ptr, size_t size, size_t nmemb, FILE *fp)'</span><span class="p">);</span>
|
|
431
|
+
<span class="linenos">25</span>
|
|
432
|
+
<span class="linenos">26</span><span class="kd">let</span> <span class="nx">filename</span> <span class="o">=</span> <span class="nx">process</span><span class="p">.</span><span class="nx">argv</span><span class="p">[</span><span class="mf">2</span><span class="p">];</span>
|
|
433
|
+
<span class="linenos">27</span><span class="k">if</span> <span class="p">(</span><span class="nx">filename</span> <span class="o">==</span> <span class="kc">null</span><span class="p">)</span>
|
|
434
|
+
<span class="linenos">28</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">'Usage: node png.js <image.png>'</span><span class="p">);</span>
|
|
435
|
+
<span class="linenos">29</span>
|
|
436
|
+
<span class="linenos">30</span><span class="kd">let</span> <span class="nx">hdr</span> <span class="o">=</span> <span class="p">{};</span>
|
|
437
|
+
<span class="linenos">31</span><span class="p">{</span>
|
|
438
|
+
<span class="linenos">32</span>
|
|
439
|
+
<span class="linenos">33</span> <span class="kd">let</span> <span class="nx">fp</span> <span class="o">=</span> <span class="nx">fopen</span><span class="p">(</span><span class="nx">filename</span><span class="p">,</span> <span class="s1">'rb'</span><span class="p">);</span>
|
|
440
|
+
<span class="linenos">34</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">fp</span><span class="p">)</span>
|
|
441
|
+
<span class="linenos">35</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="sb">`Failed to open '</span><span class="si">${</span><span class="nx">filename</span><span class="si">}</span><span class="sb">'`</span><span class="p">);</span>
|
|
442
|
+
<span class="linenos">36</span>
|
|
443
|
+
<span class="linenos">37</span> <span class="k">try</span> <span class="p">{</span>
|
|
444
|
+
<span class="linenos">38</span> <span class="kd">let</span> <span class="nx">len</span> <span class="o">=</span> <span class="nx">fread</span><span class="p">(</span><span class="nx">koffi</span><span class="p">.</span><span class="kr">as</span><span class="p">(</span><span class="nx">hdr</span><span class="p">,</span> <span class="s1">'PngHeader *'</span><span class="p">),</span> <span class="mf">1</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">PngHeader</span><span class="p">),</span> <span class="nx">fp</span><span class="p">);</span>
|
|
445
|
+
<span class="linenos">39</span> <span class="k">if</span> <span class="p">(</span><span class="nx">len</span> <span class="o"><</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">sizeof</span><span class="p">(</span><span class="nx">PngHeader</span><span class="p">))</span>
|
|
446
|
+
<span class="linenos">40</span> <span class="k">throw</span> <span class="ow">new</span> <span class="ne">Error</span><span class="p">(</span><span class="s1">'Failed to read PNG header'</span><span class="p">);</span>
|
|
447
|
+
<span class="linenos">41</span> <span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
|
|
448
|
+
<span class="linenos">42</span> <span class="nx">fclose</span><span class="p">(</span><span class="nx">fp</span><span class="p">);</span>
|
|
449
|
+
<span class="linenos">43</span> <span class="p">}</span>
|
|
450
|
+
<span class="linenos">44</span><span class="p">}</span>
|
|
451
|
+
<span class="linenos">45</span>
|
|
452
|
+
<span class="linenos">46</span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'PNG header:'</span><span class="p">,</span> <span class="nx">hdr</span><span class="p">);</span>
|
|
453
|
+
</pre></div>
|
|
454
|
+
</div>
|
|
455
|
+
</section>
|
|
398
456
|
<section id="heap-allocated-values">
|
|
399
457
|
<h3>Heap-allocated values<a class="headerlink" href="#heap-allocated-values" title="Permalink to this heading">#</a></h3>
|
|
458
|
+
<p><em>New in Koffi 2.0</em></p>
|
|
400
459
|
<p>Some C functions return heap-allocated values directly or through output parameters. While Koffi automatically converts values from C to JS (to a string or an object), it does not know when something needs to be freed, or how.</p>
|
|
401
|
-
<p>For opaque
|
|
460
|
+
<p>For opaque types, such as FILE, this does not matter because you will explicitly call <code class="docutils literal notranslate"><span class="pre">fclose()</span></code> on them. But some values (such as strings) get implicitly converted by Koffi, and you lose access to the original pointer. This creates a leak if the string is heap-allocated.</p>
|
|
402
461
|
<p>To avoid this, you can instruct Koffi to call a function on the original pointer once the conversion is done, by creating a <strong>disposable type</strong> with <code class="docutils literal notranslate"><span class="pre">koffi.dispose(name,</span> <span class="pre">type,</span> <span class="pre">func)</span></code>. This creates a type derived from another type, the only difference being that <em>func</em> gets called with the original pointer once the value has been converted and is not needed anymore.</p>
|
|
403
462
|
<p>The <em>name</em> can be omitted to create an anonymous disposable type. If <em>func</em> is omitted or is null, Koffi will use <code class="docutils literal notranslate"><span class="pre">koffi.free(ptr)</span></code> (which calls the standard C library <em>free</em> function under the hood).</p>
|
|
404
463
|
<div class="highlight-js notranslate"><div class="highlight"><pre><span></span><span class="linenos">1</span><span class="kd">const</span> <span class="nx">AnonHeapStr</span> <span class="o">=</span> <span class="nx">koffi</span><span class="p">.</span><span class="nx">disposable</span><span class="p">(</span><span class="s1">'str'</span><span class="p">);</span> <span class="c1">// Anonymous type (cannot be used in function prototypes)</span>
|
|
@@ -499,6 +558,7 @@
|
|
|
499
558
|
</section>
|
|
500
559
|
<section id="registered-callbacks">
|
|
501
560
|
<h3>Registered callbacks<a class="headerlink" href="#registered-callbacks" title="Permalink to this heading">#</a></h3>
|
|
561
|
+
<p><em>New in Koffi 2.0</em></p>
|
|
502
562
|
<p>Use registered callbacks when the function needs to be called at a later time (e.g. log handler, event handler, <code class="docutils literal notranslate"><span class="pre">fopencookie/funopen</span></code>). Call <code class="docutils literal notranslate"><span class="pre">koffi.register(func,</span> <span class="pre">type)</span></code> to register a callback function, with two arguments: the JS function, and the callback type.</p>
|
|
503
563
|
<p>When you are done, call <code class="docutils literal notranslate"><span class="pre">koffi.unregister()</span></code> (with the value returned by <code class="docutils literal notranslate"><span class="pre">koffi.register()</span></code>) to release the slot. A maximum of 16 registered callbacks can exist at the same time. Failure to do so will leak the slot, and subsequent registrations may fail (with an exception) once all slots are used.</p>
|
|
504
564
|
<p>The example below shows how to register and unregister delayed callbacks.</p>
|
|
@@ -620,12 +680,13 @@
|
|
|
620
680
|
<li><a class="reference internal" href="#variadic-functions">Variadic functions</a></li>
|
|
621
681
|
</ul>
|
|
622
682
|
</li>
|
|
623
|
-
<li><a class="reference internal" href="#
|
|
683
|
+
<li><a class="reference internal" href="#special-considerations">Special considerations</a><ul>
|
|
624
684
|
<li><a class="reference internal" href="#output-parameters">Output parameters</a><ul>
|
|
625
685
|
<li><a class="reference internal" href="#struct-example">Struct example</a></li>
|
|
626
|
-
<li><a class="reference internal" href="#opaque-
|
|
686
|
+
<li><a class="reference internal" href="#opaque-type-example">Opaque type example</a></li>
|
|
627
687
|
</ul>
|
|
628
688
|
</li>
|
|
689
|
+
<li><a class="reference internal" href="#polymorphic-parameters">Polymorphic parameters</a></li>
|
|
629
690
|
<li><a class="reference internal" href="#heap-allocated-values">Heap-allocated values</a></li>
|
|
630
691
|
</ul>
|
|
631
692
|
</li>
|
|
@@ -172,10 +172,9 @@
|
|
|
172
172
|
|
|
173
173
|
</div>
|
|
174
174
|
<div style="text-align: center; margin-top: 2em;">
|
|
175
|
+
<a href="https://www.npmjs.com/package/koffi"><img src="https://img.shields.io/badge/NPM-2.O.1-brightgreen" alt="NPM"/></a>
|
|
175
176
|
<a href="https://github.com/Koromix/luigi/tree/master/koffi"><img src="https://img.shields.io/badge/GitHub-Koffi-ff6600" alt="GitHub"/></a>
|
|
176
|
-
|
|
177
|
-
</div>
|
|
178
|
-
</div>
|
|
177
|
+
</div></div>
|
|
179
178
|
|
|
180
179
|
</div>
|
|
181
180
|
|
package/doc/dist/html/index.html
CHANGED
|
@@ -174,10 +174,9 @@
|
|
|
174
174
|
|
|
175
175
|
</div>
|
|
176
176
|
<div style="text-align: center; margin-top: 2em;">
|
|
177
|
+
<a href="https://www.npmjs.com/package/koffi"><img src="https://img.shields.io/badge/NPM-2.O.1-brightgreen" alt="NPM"/></a>
|
|
177
178
|
<a href="https://github.com/Koromix/luigi/tree/master/koffi"><img src="https://img.shields.io/badge/GitHub-Koffi-ff6600" alt="GitHub"/></a>
|
|
178
|
-
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
179
|
+
</div></div>
|
|
181
180
|
|
|
182
181
|
</div>
|
|
183
182
|
|
|
@@ -208,7 +207,7 @@
|
|
|
208
207
|
</div>
|
|
209
208
|
<article role="main">
|
|
210
209
|
<section id="koffi-version">
|
|
211
|
-
<h1>Koffi 2.0.
|
|
210
|
+
<h1>Koffi 2.1.0-beta.2<a class="headerlink" href="#koffi-version" title="Permalink to this heading">#</a></h1>
|
|
212
211
|
<section id="overview">
|
|
213
212
|
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this heading">#</a></h2>
|
|
214
213
|
<p>Koffi is a <strong>fast and easy-to-use C FFI module for Node.js</strong>, featuring:</p>
|
|
@@ -240,7 +239,7 @@
|
|
|
240
239
|
<li class="toctree-l2"><a class="reference internal" href="types#primitive-types">Primitive types</a></li>
|
|
241
240
|
<li class="toctree-l2"><a class="reference internal" href="types#struct-types">Struct types</a></li>
|
|
242
241
|
<li class="toctree-l2"><a class="reference internal" href="types#pointer-types">Pointer types</a></li>
|
|
243
|
-
<li class="toctree-l2"><a class="reference internal" href="types#
|
|
242
|
+
<li class="toctree-l2"><a class="reference internal" href="types#array-types">Array types</a></li>
|
|
244
243
|
<li class="toctree-l2"><a class="reference internal" href="types#disposable-types">Disposable types</a></li>
|
|
245
244
|
<li class="toctree-l2"><a class="reference internal" href="types#utility-functions">Utility functions</a></li>
|
|
246
245
|
</ul>
|
|
@@ -248,7 +247,7 @@
|
|
|
248
247
|
<li class="toctree-l1"><a class="reference internal" href="functions">Functions</a><ul>
|
|
249
248
|
<li class="toctree-l2"><a class="reference internal" href="functions#function-definitions">Function definitions</a></li>
|
|
250
249
|
<li class="toctree-l2"><a class="reference internal" href="functions#function-calls">Function calls</a></li>
|
|
251
|
-
<li class="toctree-l2"><a class="reference internal" href="functions#
|
|
250
|
+
<li class="toctree-l2"><a class="reference internal" href="functions#special-considerations">Special considerations</a></li>
|
|
252
251
|
<li class="toctree-l2"><a class="reference internal" href="functions#javascript-callbacks">Javascript callbacks</a></li>
|
|
253
252
|
<li class="toctree-l2"><a class="reference internal" href="functions#thread-safety">Thread safety</a></li>
|
|
254
253
|
</ul>
|
|
@@ -335,7 +334,7 @@
|
|
|
335
334
|
<div class="toc-tree-container">
|
|
336
335
|
<div class="toc-tree">
|
|
337
336
|
<ul>
|
|
338
|
-
<li><a class="reference internal" href="#">Koffi 2.0.
|
|
337
|
+
<li><a class="reference internal" href="#">Koffi 2.1.0-beta.2</a><ul>
|
|
339
338
|
<li><a class="reference internal" href="#overview">Overview</a></li>
|
|
340
339
|
<li><a class="reference internal" href="#table-of-contents">Table of contents</a></li>
|
|
341
340
|
<li><a class="reference internal" href="#license">License</a></li>
|
|
@@ -174,10 +174,9 @@
|
|
|
174
174
|
|
|
175
175
|
</div>
|
|
176
176
|
<div style="text-align: center; margin-top: 2em;">
|
|
177
|
+
<a href="https://www.npmjs.com/package/koffi"><img src="https://img.shields.io/badge/NPM-2.O.1-brightgreen" alt="NPM"/></a>
|
|
177
178
|
<a href="https://github.com/Koromix/luigi/tree/master/koffi"><img src="https://img.shields.io/badge/GitHub-Koffi-ff6600" alt="GitHub"/></a>
|
|
178
|
-
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
179
|
+
</div></div>
|
|
181
180
|
|
|
182
181
|
</div>
|
|
183
182
|
|
|
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 2.0.
|
|
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 2.1.0-beta.2" href="index" />
|
|
7
7
|
|
|
8
8
|
<meta name="generator" content="sphinx-5.0.1, furo 2022.06.04.1"/>
|
|
9
9
|
<title>Requirements - Koffi</title>
|
|
@@ -174,10 +174,9 @@
|
|
|
174
174
|
|
|
175
175
|
</div>
|
|
176
176
|
<div style="text-align: center; margin-top: 2em;">
|
|
177
|
+
<a href="https://www.npmjs.com/package/koffi"><img src="https://img.shields.io/badge/NPM-2.O.1-brightgreen" alt="NPM"/></a>
|
|
177
178
|
<a href="https://github.com/Koromix/luigi/tree/master/koffi"><img src="https://img.shields.io/badge/GitHub-Koffi-ff6600" alt="GitHub"/></a>
|
|
178
|
-
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
179
|
+
</div></div>
|
|
181
180
|
|
|
182
181
|
</div>
|
|
183
182
|
|
|
@@ -171,10 +171,9 @@
|
|
|
171
171
|
|
|
172
172
|
</div>
|
|
173
173
|
<div style="text-align: center; margin-top: 2em;">
|
|
174
|
+
<a href="https://www.npmjs.com/package/koffi"><img src="https://img.shields.io/badge/NPM-2.O.1-brightgreen" alt="NPM"/></a>
|
|
174
175
|
<a href="https://github.com/Koromix/luigi/tree/master/koffi"><img src="https://img.shields.io/badge/GitHub-Koffi-ff6600" alt="GitHub"/></a>
|
|
175
|
-
|
|
176
|
-
</div>
|
|
177
|
-
</div>
|
|
176
|
+
</div></div>
|
|
178
177
|
|
|
179
178
|
</div>
|
|
180
179
|
|