diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/GlueGen_Mapping.html | 960 | ||||
-rw-r--r-- | doc/GlueGen_Mapping.md | 136 | ||||
-rw-r--r-- | doc/JogAmpMacOSVersions.html | 723 |
3 files changed, 1073 insertions, 746 deletions
diff --git a/doc/GlueGen_Mapping.html b/doc/GlueGen_Mapping.html index 537ce89..20e9265 100644 --- a/doc/GlueGen_Mapping.html +++ b/doc/GlueGen_Mapping.html @@ -1,407 +1,415 @@ -<style> -div#header, header - { - - border-bottom: 1px solid #aaa; - margin-bottom: 0.5em; - } - -.title - { - text-align: center; - } - -.author, .date - { - text-align: center; - } - -div#TOC, nav#TOC - { - - border-bottom: 1px solid #aaa; - margin-bottom: 0.5em; - } - -nav#TOC { - margin-bottom: var(--line-height); - - padding-bottom: 0.5rem; -} - -nav#TOC input { - display: none; -} - -nav#TOC label { - color: var(--color-link); - cursor: pointer; -} - -nav#TOC > ul { - display: none; -} - -nav#TOC > input:checked + ul { - display: block; -} - -@media print - { - div#TOC, nav#TOC - { - - display: none; +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang=""> +<head> + <meta charset="utf-8" /> + <meta name="generator" content="pandoc" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> + <title>GlueGen_Mapping.md</title> + <style> + div#header, header + { + + border-bottom: 1px solid #aaa; + margin-bottom: 0.5em; + } + + .title + { + text-align: center; + } + + .author, .date + { + text-align: center; + } + + div#TOC, nav#TOC + { + + border-bottom: 1px solid #aaa; + margin-bottom: 0.5em; + } + + nav#TOC { + margin-bottom: var(--line-height); + + padding-bottom: 0.5rem; } - } - -div.content - { - color: #111111; - font-size: 14px; - line-height: 1.6; - } - -div#cgit a - { - color: #1212a0; - } - -div#cgit a.sourceLine - { - color: #111111; - } - -h1, h2, h3, h4, h5, h6 -{ - font-family: "Helvetica Neue", Helvetica, "Liberation Sans", Calibri, Arial, sans-serif; - - page-break-after: avoid; - - margin: 20px 0 10px; - padding: 0; -} - -h2 { - border-bottom: 1px solid #ccc; -} -div div - { - - } - -section section - { - margin-left: 2em; - } + nav#TOC input { + display: none; + } -p {} + nav#TOC label { + color: var(--color-link); + cursor: pointer; + } -blockquote - { - font-style: italic; - } + nav#TOC > ul { + display: none; + } -li - { - } + nav#TOC > input:checked + ul { + display: block; + } -li > p - { - margin-top: 1em; - } + @media print + { + div#TOC, nav#TOC + { + + display: none; + } + } + + div.content + { + color: #111111; + font-size: 14px; + line-height: 1.6; + } + + div#cgit a + { + color: #1212a0; + } + + div#cgit a.sourceLine + { + color: #111111; + } + + h1, h2, h3, h4, h5, h6 + { + font-family: "Helvetica Neue", Helvetica, "Liberation Sans", Calibri, Arial, sans-serif; -ul - { - } + page-break-after: avoid; -ul li - { - } + margin: 20px 0 10px; + padding: 0; + } -ol - { - } + h2 { + border-bottom: 1px solid #ccc; + } -ol li - { - } + div div + { -hr {} + } -sub - { - } + section section + { + margin-left: 2em; + } -sup - { - } + p {} -em - { - } + blockquote + { + font-style: italic; + } -em > em - { - font-style: normal; - } + li + { + } -strong - { - } + li > p + { + margin-top: 1em; + } -a - { + ul + { + } - text-decoration: none; - } + ul li + { + } -@media screen - { - a:hover - { + ol + { + } - text-decoration: underline; - } - } + ol li + { + } -@media print - { - a { + hr {} - color: black; - background: transparent; - } + sub + { + } - a[href^="http://"]:after, a[href^="https://"]:after - { + sup + { + } - content: " (" attr(href) ") "; - font-size: 90%; - } - } + em + { + } -img - { + em > em + { + font-style: normal; + } - vertical-align: middle; - } + strong + { + } -div.figure - { + a + { - margin-left: auto; - margin-right: auto; - text-align: center; - font-style: italic; - } + text-decoration: none; + } -p.caption - { + @media screen + { + a:hover + { - } + text-decoration: underline; + } + } -pre, code - { - background-color: #f8f8f8; + @media print + { + a { - white-space: pre-wrap; - white-space: -moz-pre-wrap !important; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; + color: black; + background: transparent; + } - } + a[href^="http://"]:after, a[href^="https://"]:after + { -pre - { + content: " (" attr(href) ") "; + font-size: 90%; + } + } - padding: 0.5em; - border-radius: 5px; + img + { - background-color: #f8f8f8; - border: 1px solid #ccc; - font-size: 13px; - line-height: 19px; - overflow: auto; - padding: 6px 10px; + vertical-align: middle; + } - margin-left: 0.5em; - margin-right: 0.5em; - } + div.figure + { -@media screen - { - pre - { + margin-left: auto; + margin-right: auto; + text-align: center; + font-style: italic; + } - white-space: pre; - overflow: auto; + p.caption + { - border: 1px dotted #777; - } - } - -code - { - } - -p > code, li > code - { - - padding-left: 2px; - padding-right: 2px; - } - -li > p code - { - - padding: 2px; - } - -span.math - { - - } - -div.math - { - } - -span.LaTeX - { - } - -eq - { - } - -table - { - border-collapse: collapse; - border-spacing: 0; - - margin-left: auto; - margin-right: auto; - } - -thead - { - border-bottom: 1pt solid #000; - background-color: #eee; - } - -tr.header - { - } - -tbody - { - } - -tr { - } -tr.odd:hover, tr.even:hover - { - background-color: #eee; - } - -tr.odd {} -tr.even {} - -td, th - { - vertical-align: top; - vertical-align: baseline; - padding-left: 0.5em; - padding-right: 0.5em; - padding-top: 0.2em; - padding-bottom: 0.2em; - } -th - { - font-weight: bold; - } - -tfoot - { - } - -caption - { - caption-side: top; - border: none; - font-size: 0.9em; - font-style: italic; - text-align: center; - margin-bottom: 0.3em; - padding-bottom: 0.2em; - } - -dl - { - border-top: 2pt solid black; - padding-top: 0.5em; - border-bottom: 2pt solid black; - } - -dt - { - font-weight: bold; - } - -dd+dt - { - border-top: 1pt solid black; - padding-top: 0.5em; - } - -dd - { - margin-bottom: 0.5em; - } - -dd+dd - { - border-top: 1px solid black; - } - -a.footnote, a.footnoteRef { - font-size: small; - vertical-align: text-top; -} + } -a[href^="#fnref"], a.reversefootnote - { - } + pre, code + { + background-color: #f8f8f8; -@media print - { - a[href^="#fnref"], a.reversefootnote - { + white-space: pre-wrap; + white-space: -moz-pre-wrap !important; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; - display: none; - } - } + } -div.footnotes - { - } + pre + { -div.footnotes li[id^="fn"] - { - } + padding: 0.5em; + border-radius: 5px; -@media print - { - .noprint - { - display:none; + background-color: #f8f8f8; + border: 1px solid #ccc; + font-size: 13px; + line-height: 19px; + overflow: auto; + padding: 6px 10px; + + margin-left: 0.5em; + margin-right: 0.5em; + } + + @media screen + { + pre + { + + white-space: pre; + overflow: auto; + + border: 1px dotted #777; + } + } + + code + { + } + + p > code, li > code + { + + padding-left: 2px; + padding-right: 2px; + } + + li > p code + { + + padding: 2px; + } + + span.math + { + + } + + div.math + { + } + + span.LaTeX + { + } + + eq + { + } + + table + { + border-collapse: collapse; + border-spacing: 0; + + margin-left: auto; + margin-right: auto; + } + + thead + { + border-bottom: 1pt solid #000; + background-color: #eee; + } + + tr.header + { + } + + tbody + { + } + + tr { + } + tr.odd:hover, tr.even:hover + { + background-color: #eee; + } + + tr.odd {} + tr.even {} + + td, th + { + vertical-align: top; + vertical-align: baseline; + padding-left: 0.5em; + padding-right: 0.5em; + padding-top: 0.2em; + padding-bottom: 0.2em; + } + th + { + font-weight: bold; + } + + tfoot + { + } + + caption + { + caption-side: top; + border: none; + font-size: 0.9em; + font-style: italic; + text-align: center; + margin-bottom: 0.3em; + padding-bottom: 0.2em; + } + + dl + { + border-top: 2pt solid black; + padding-top: 0.5em; + border-bottom: 2pt solid black; + } + + dt + { + font-weight: bold; + } + + dd+dt + { + border-top: 1pt solid black; + padding-top: 0.5em; + } + + dd + { + margin-bottom: 0.5em; + } + + dd+dd + { + border-top: 1px solid black; + } + + a.footnote, a.footnoteRef { + font-size: small; + vertical-align: text-top; } - } -</style> + a[href^="#fnref"], a.reversefootnote + { + } + + @media print + { + a[href^="#fnref"], a.reversefootnote + { + + display: none; + } + } + + div.footnotes + { + } + + div.footnotes li[id^="fn"] + { + } + + @media print + { + .noprint + { + display:none; + } + } + </style> +</head> +<body> <nav id="TOC" role="doc-toc"> <strong>Contents</strong><label for="contents">⊕</label> <input type="checkbox" id="contents"> @@ -424,6 +432,8 @@ div.footnotes li[id^="fn"] <li><a href="#struct-mapping-notes">Struct Mapping Notes</a></li> <li><a href="#struct-java-signature-table">Struct Java Signature Table</a></li> + <li><a href="#struct-java-signature-examples">Struct Java Signature + Examples</a></li> <li><a href="#struct-setter-pseudo-code">Struct Setter Pseudo-Code</a></li> </ul></li> @@ -432,7 +442,6 @@ div.footnotes li[id^="fn"] </ul></li> </ul> </nav> - <style> table, th, td { border: 1px solid black; @@ -1021,13 +1030,18 @@ constant. Otherwise the <em>native</em> memory has <em>java ownership</em>. See <a href="#returnedarraylength-symbol-expression">ReturnedArrayLength Setting</a> above.</p></li> +<li><p>Utilizing a <em>flexible</em> <em>elemCount</em> via +<strong>ReturnedArrayLength getValElements()</strong> renders us unable +to determine ownership of pointer referenced <em>native</em> memory +segment and hence renders ownership <em>mixed or ambiguous</em>, <a +href="#signature-const-int32_t--customsize-ambiguous-java-owned">see +[5]</a>. This is due to the fact, that native code may allocate memory +and writes its <em>elemCount</em> into the designated field +<em>valElements</em>. In such cases, the user being aware of the +underlying API shall utilize <code>setVal(..)</code> and +<code>releaseVal()</code> with care.</p></li> <li><p>To release native memory with <em>java ownership</em>, i.e. a native ByteBuffer, <code>releaseVal()</code> can be used.</p></li> -<li><p>To shrink a <em>Pointer</em> & <em>VariaElemCount</em> -pointer-array elemCount size with <em>java ownership</em> , the memory -must be cleared with <code>releaseVal()</code> first. This is due to -<code>setVal(src, srcPos, destPos, len)</code> reusing the existing -memory in case <code>destPos + len < elemCount</code>.</p></li> </ul> <h3 id="struct-java-signature-table">Struct Java Signature Table</h3> <p>Please find below signature table as generated by the <em>C @@ -1127,7 +1141,7 @@ getBuffer()</td> <td style="text-align: left;">setVal(int v)</td> <td style="text-align: left;">int getVal()</td> <td style="text-align: left;"></td> -<td style="text-align: left;">Static</td> +<td style="text-align: left;">Parent</td> <td style="text-align: left;"></td> </tr> <tr class="odd"> @@ -1136,7 +1150,7 @@ getBuffer()</td> <td style="text-align: left;"><em>none</em></td> <td style="text-align: left;">int getVal()</td> <td style="text-align: left;"></td> -<td style="text-align: left;">Static</td> +<td style="text-align: left;">Parent</td> <td style="text-align: left;">Read only</td> </tr> <tr class="even"> @@ -1145,13 +1159,16 @@ getBuffer()</td> <td style="text-align: left;"><em>none</em></td> <td style="text-align: left;">int getVal()</td> <td style="text-align: left;"><strong>ImmutableAccess</strong></td> -<td style="text-align: left;">Static</td> +<td style="text-align: left;">Parent</td> <td style="text-align: left;">Read only</td> </tr> <tr class="odd"> <td style="text-align: left;">[const]</td> <td style="text-align: left;">int32_t* val</td> -<td style="text-align: left;">setVal(int v) <br> releaseVal()</td> +<td style="text-align: left;">setVal(int v) [<a +href="#signature-int32_t--maxoneelement-java-owned">1</a>][<a +href="#signature-const-int32_t--maxoneelement-java-owned">2</a>] <br> +releaseVal()</td> <td style="text-align: left;">int getVal() <br> boolean isValNull() <br> int getValElemCount()</td> <td style="text-align: left;"><strong>MaxOneElement</strong></td> @@ -1189,7 +1206,7 @@ int len)</td> <td style="text-align: left;">IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len)</td> <td style="text-align: left;"></td> -<td style="text-align: left;">Static</td> +<td style="text-align: left;">Parent</td> <td style="text-align: left;"></td> </tr> <tr class="odd"> @@ -1199,7 +1216,7 @@ srcPos, int[] dest, int destPos, int len)</td> <td style="text-align: left;">IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len)</td> <td style="text-align: left;"></td> -<td style="text-align: left;">Static</td> +<td style="text-align: left;">Parent</td> <td style="text-align: left;">Read only</td> </tr> <tr class="even"> @@ -1218,7 +1235,8 @@ static int getValElemCount()</td> <td style="text-align: left;"></td> <td style="text-align: left;">int32_t* val</td> <td style="text-align: left;">setVal(int[] src, int srcPos, int destPos, -int len)</td> +int len) [<a +href="#signature-int32_t--constelemcount-3-natively-owned">2</a>]</td> <td style="text-align: left;">IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() <br> static int getValElemCount()</td> @@ -1228,10 +1246,12 @@ static int getValElemCount()</td> <td style="text-align: left;">Const element count 3</td> </tr> <tr class="even"> -<td style="text-align: left;">[const]</td> +<td style="text-align: left;"></td> <td style="text-align: left;">int32_t* val</td> -<td style="text-align: left;">setVal(int[] src, int srcPos, int destPos, -int len) <br> releaseVal()</td> +<td style="text-align: left;">setVal(boolean subset, int[] src, int +srcPos, int destPos, int len) [<a +href="#signature-int32_t--freesize-java-owned">3</a>] <br> +releaseVal()</td> <td style="text-align: left;">IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() <br> int getValElemCount()</td> @@ -1240,19 +1260,34 @@ int getValElemCount()</td> <td style="text-align: left;">Starts w/ null elements</td> </tr> <tr class="odd"> +<td style="text-align: left;">const</td> +<td style="text-align: left;">int32_t* val</td> +<td style="text-align: left;">setVal(int[] src, int srcPos, int destPos, +int len) [<a href="#signature-const-int32_t--freesize-java-owned">4</a>] +<br> releaseVal()</td> +<td style="text-align: left;">IntBuffer getVal() <br> int[] getVal(int +srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() <br> +int getValElemCount()</td> +<td style="text-align: left;"></td> +<td style="text-align: left;">Java</td> +<td style="text-align: left;">Starts w/ null elements</td> +</tr> +<tr class="even"> <td style="text-align: left;">[const]</td> <td style="text-align: left;">int32_t* val</td> <td style="text-align: left;">setVal(int[] src, int srcPos, int destPos, -int len) <br> releaseVal()</td> +int len) [<a +href="#signature-const-int32_t--customsize-ambiguous-java-owned">5</a>] +<br> releaseVal()</td> <td style="text-align: left;">IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull()</td> <td style="text-align: left;"><strong>ReturnedArrayLength getValCount()</strong></td> -<td style="text-align: left;"><em>Ambiguous</em></td> +<td style="text-align: left;"><strong>Ambiguous</strong></td> <td style="text-align: left;">Variable element count<br>using field <em>valCount</em>,<br>which has getter and setter</td> </tr> -<tr class="even"> +<tr class="odd"> <td style="text-align: left;">[const]</td> <td style="text-align: left;">char* name</td> <td style="text-align: left;">setName(String srcVal) <br> @@ -1263,7 +1298,7 @@ releaseVal()</td> <td style="text-align: left;">Java</td> <td style="text-align: left;">String only, w/ EOS</td> </tr> -<tr class="odd"> +<tr class="even"> <td style="text-align: left;">[const]</td> <td style="text-align: left;">char* name</td> <td style="text-align: left;">setName(String srcVal) <br> setName(byte[] @@ -1276,6 +1311,177 @@ getName() <br> boolean isNameNull() <br> int getNameElemCount()</td> </tr> </tbody> </table> +<h3 id="struct-java-signature-examples">Struct Java Signature +Examples</h3> +<h4 id="signature-int32_t--maxoneelement-java-owned">Signature +<code>int32_t *</code> MaxOneElement, Java owned</h4> +<ul> +<li><p><code>void com.jogamp.gluegen.test.junit.generation.TK_Field.setVariaInt32PointerMaxOneElemElemCount(int src)</code></p> +<p>Setter for native field variaInt32PointerMaxOneElem, referencing a +Java owned array with variable element count of 0 initial elements.</p> +<p>Maximum element count is 1.</p> +<p>Native Signature:</p> +<ul> +<li>field-type (PointerType) 'int32_t <em>' -> (int32_t) * , size +[fixed false, lnx64 8], const[false], pointer</em>1</li> +<li>referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], +const[false], int</li> +</ul> +<p>Will reuse memory if existing, otherwise allocating memory.</p></li> +</ul> +<h4 id="signature-const-int32_t--maxoneelement-java-owned">Signature +<code>const int32_t *</code> MaxOneElement, Java owned</h4> +<ul> +<li><p><code>TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setConstInt32PointerMaxOneElem(int src)</code></p> +<p>Setter for native field variaInt32PointerMaxOneElem, referencing a +Java owned array with variable element count of 0 initial elements.</p> +<p>Maximum element count is 1.</p> +<p>Native Signature:</p> +<ul> +<li>field-type (PointerType) 'int32_t <em>' -> (const int32_t) * , +size [fixed false, lnx64 8], const[false], pointer</em>1</li> +<li>referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], +const[native, true], int</li> +</ul> +<p>Always replaces memory due to <code>const</code> value +modifier.</p></li> +</ul> +<h4 id="signature-int32_t--constelemcount-3-natively-owned">Signature +<code>int32_t *</code> ConstElemCount 3, Natively owned</h4> +<ul> +<li><p><code>TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setVariaInt32PointerConstLen(int[] src, int srcPos, int destPos, int length)</code></p> +<p>Setter for native field variaInt32PointerConstLen, referencing a +natively owned array with fixed element count of 3 elements.</p> +<p>Native Signature:</p> +<ul> +<li>field-type (PointerType) 'int32_t <em>' -> (int32_t) * , size +[fixed false, lnx64 8], const[false], pointer</em>1</li> +<li>referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], +const[false], int</li> +</ul> +<p>Copies the given source elements into the respective field's existing +memory.</p> +<p>Parameters:</p> +<ul> +<li>src the source array of elements</li> +<li>srcPos starting element position within the source array with +'srcPos >= 0<code>&&</code>srcPos + length <= src.length`, +otherwise an IndexOutOfBoundsException is thrown</li> +<li>destPos starting element position within the destination with +'destPos >= 0<code>&&</code>destPos + length <= +elemCount`, otherwise an exception is thrown</li> +<li>length the element count to be copied with 'length >= +0<code>&&</code>srcPos + length <= +src.length<code>&&</code>destPos + length <= elemCount`, +otherwise an IndexOutOfBoundsException is thrown</li> +</ul> +<p>Returns:</p> +<ul> +<li>this instance of chaining</li> +</ul></li> +</ul> +<h4 id="signature-int32_t--freesize-java-owned">Signature +<code>int32_t *</code> FreeSize, Java owned</h4> +<ul> +<li><p><code>TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setVariaInt32PointerVariaLen(boolean subset, int[] src, int srcPos, int destPos, int length)</code></p> +<p>Setter for native field variaInt32PointerVariaLen, referencing a Java +owned array with variable element count of 0 initial elements.</p> +<p>Native Signature:</p> +<ul> +<li>field-type (PointerType) 'int32_t <em>' -> (int32_t) * , size +[fixed false, lnx64 8], const[false], pointer</em>1</li> +<li>referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], +const[false], int</li> +</ul> +<p>Copies the given source elements into the respective field, either +writing into the existing memory or creating a new memory and +referencing it.</p> +<p>Parameters:</p> +<ul> +<li>subset if <code>true</code> keeps the underlying memory and only +allows to set up to <code>elemCount</code> elements. Otherwise may +replace the underlying memory if +<code>destPos + length != elemCount</code>.</li> +<li>src the source array of elements</li> +<li>srcPos starting element position within the source array with +'srcPos >= 0<code>&&</code>srcPos + length <= src.length`, +otherwise an IndexOutOfBoundsException is thrown</li> +<li>destPos starting element position within the destination with +'destPos >= 0<code>. If </code>subset == true<code>, </code>destPos + +length <= elemCount<code>also must be be</code>true`. Otherwise an +exception is thrown</li> +<li>length the element count to be copied with 'length >= +0<code>&&</code>srcPos + length <= src.length`, otherwise an +IndexOutOfBoundsException is thrown</li> +</ul> +<p>Returns:</p> +<ul> +<li>this instance of chaining</li> +</ul></li> +</ul> +<h4 id="signature-const-int32_t--freesize-java-owned">Signature +<code>const int32_t *</code> FreeSize, Java owned</h4> +<ul> +<li><p><code>TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setConstInt32PointerVariaLen(int[] src, int srcPos, int length)</code></p> +<p>Setter for native field constInt32PointerVariaLen, referencing a Java +owned array with variable element count of 0 initial elements.</p> +<p>Native Signature:</p> +<ul> +<li>field-type (PointerType) 'int32_t <em>' -> (const int32_t) * , +size [fixed false, lnx64 8], const[false], pointer</em>1</li> +<li>referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], +const[native, true], int</li> +</ul> +<p>Replaces the respective field's memory with a new memory segment +containing given source elements and referencing it.</p> +<p>Parameters:</p> +<ul> +<li>src the source array of elements</li> +<li>srcPos starting element position within the source array with +'srcPos >= 0<code>&&</code>srcPos + length <= src.length`, +otherwise an IndexOutOfBoundsException is thrown</li> +<li>length the element count to be copied with 'length >= +0<code>&&</code>srcPos + length <= src.length`, otherwise an +IndexOutOfBoundsException is thrown</li> +</ul> +<p>Returns:</p> +<ul> +<li>this instance of chaining</li> +</ul></li> +</ul> +<h4 +id="signature-const-int32_t--customsize-ambiguous-java-owned">Signature +<code>const int32_t *</code> CustomSize, Ambiguous, Java owned</h4> +<ul> +<li><p><code>TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setConstInt32PointerCustomLen(int[] src, int srcPos, int length)</code></p> +<p>Setter for native field constIntxxPointerCustomLen, referencing a +mixed and ambigously owned (<strong>warning</strong>) array with +variable element count of getConstIntxxPointerCustomLenElemCount() +elements.</p> +<p>Native Signature:</p> +<ul> +<li>field-type (PointerType) 'int32_t <em>' -> (const int32_t) * , +size [fixed false, lnx64 8], const[false], pointer</em>1</li> +<li>referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], +const[native, true], int</li> +</ul> +<p>Replaces the respective field's memory with a new memory segment +containing given source elements and referencing it.</p> +<p>Parameters:</p> +<ul> +<li>src the source array of elements</li> +<li>srcPos starting element position within the source array with +'srcPos >= 0<code>&&</code>srcPos + length <= src.length`, +otherwise an IndexOutOfBoundsException is thrown</li> +<li>length the element count to be copied with 'length >= +0<code>&&</code>srcPos + length <= src.length`, otherwise an +IndexOutOfBoundsException is thrown</li> +</ul> +<p>Returns:</p> +<ul> +<li>this instance of chaining</li> +</ul></li> +</ul> <h3 id="struct-setter-pseudo-code">Struct Setter Pseudo-Code</h3> <ul> <li><em>ImmutableAccess</em>: Drops setter, immutable</li> @@ -1370,3 +1576,5 @@ folder to your GlueGen <code>includeRefid</code> element:</p> <p>To identity a GlueGen code generation run, GlueGen defines the following macros:</p> <pre><code> #define __GLUEGEN__ 2</code></pre> +</body> +</html> diff --git a/doc/GlueGen_Mapping.md b/doc/GlueGen_Mapping.md index dcdb51a..ad7ec27 100644 --- a/doc/GlueGen_Mapping.md +++ b/doc/GlueGen_Mapping.md @@ -296,11 +296,10 @@ A direct C code `char` array or indirect array via pointer can be interpreted as if the expression is constant. Otherwise the *native* memory has *java ownership*. See [ReturnedArrayLength Setting](#returnedarraylength-symbol-expression) above. +* Utilizing a *flexible* *elemCount* via **ReturnedArrayLength getValElements()** renders us unable to determine ownership + of pointer referenced *native* memory segment and hence renders ownership *mixed or ambiguous*, [see \[5\]](#signature-const-int32_t--customsize-ambiguous-java-owned). This is due to the fact, that native code may allocate memory and writes its *elemCount* into the designated field *valElements*. In such cases, the user being aware of the underlying API shall utilize `setVal(..)` and `releaseVal()` with care. + * To release native memory with *java ownership*, i.e. a native ByteBuffer, `releaseVal()` can be used. - -* To shrink a *Pointer* & *VariaElemCount* pointer-array elemCount size with *java ownership* , - the memory must be cleared with `releaseVal()` first. This is due to `setVal(src, srcPos, destPos, len)` - reusing the existing memory in case `destPos + len < elemCount`. ### Struct Java Signature Table @@ -322,21 +321,132 @@ A similar mapping is produced for `struct` types, i.e. *compounds*. | | | | static TK_Struct derefPointer(long addr) | | | Java, static ctor <br> dereferencing ByteBuffer <br> at native address of size() | | | | | ByteBuffer getBuffer() | | | Java, <br> underlying ByteBuffer | | | | | long getDirectBufferAddress() | | | Java, native address <br> of underlying getBuffer() | -| | int32_t val | setVal(int v) | int getVal() | | Static | | -| const | int32_t val | *none* | int getVal() | | Static | Read only | -| | int32_t val | *none* | int getVal() | **ImmutableAccess** | Static | Read only | -| [const] | int32_t* val | setVal(int v) <br> releaseVal() | int getVal() <br> boolean isValNull() <br> int getValElemCount() | **MaxOneElement** | Java | Starts w/ null elements,<br>max 1 element | +| | int32_t val | setVal(int v) | int getVal() | | Parent | | +| const | int32_t val | *none* | int getVal() | | Parent | Read only | +| | int32_t val | *none* | int getVal() | **ImmutableAccess** | Parent | Read only | +| [const] | int32_t* val | setVal(int v) \[[1](#signature-int32_t--maxoneelement-java-owned)\]\[[2](#signature-const-int32_t--maxoneelement-java-owned)\] <br> releaseVal() | int getVal() <br> boolean isValNull() <br> int getValElemCount() | **MaxOneElement** | Java | Starts w/ null elements,<br>max 1 element | | const | int32_t* val | *none* | int getVal() <br> boolean isValNull() <br> static int getValElemCount() | **ReturnedArrayLength 1** | Native | Const element count 1 | | | int32_t* val | setVal(int v) | int getVal() <br> boolean isValNull() <br> static int getValElemCount() | **ReturnedArrayLength 1** | Native | Const element count 1 | | -| | int32_t val[3]| setVal(int[] src, int srcPos, int destPos, int len) | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) | | Static | | -| const | int32_t val[3]| *none* | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) | | Static | Read only | +| | int32_t val[3]| setVal(int[] src, int srcPos, int destPos, int len) | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) | | Parent | | +| const | int32_t val[3]| *none* | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) | | Parent | Read only | | const | int32_t* val | *none* | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() <br> static int getValElemCount() | **ReturnedArrayLength 3** | Native | Read only <br> Const element count 3 | -| | int32_t* val | setVal(int[] src, int srcPos, int destPos, int len) | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() <br> static int getValElemCount() | **ReturnedArrayLength 3** | Native | Const element count 3 | -| [const] | int32_t* val | setVal(int[] src, int srcPos, int destPos, int len) <br> releaseVal() | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() <br> int getValElemCount() | | Java | Starts w/ null elements | -| [const] | int32_t* val | setVal(int[] src, int srcPos, int destPos, int len) <br> releaseVal() | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() | **ReturnedArrayLength getValCount()** | *Ambiguous* | Variable element count<br>using field *valCount*,<br>which has getter and setter | +| | int32_t* val | setVal(int[] src, int srcPos, int destPos, int len) \[[2](#signature-int32_t--constelemcount-3-natively-owned)\] | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() <br> static int getValElemCount() | **ReturnedArrayLength 3** | Native | Const element count 3 | +| | int32_t* val | setVal(boolean subset, int[] src, int srcPos, int destPos, int len) \[[3](#signature-int32_t--freesize-java-owned)\] <br> releaseVal() | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() <br> int getValElemCount() | | Java | Starts w/ null elements | +| const | int32_t* val | setVal(int[] src, int srcPos, int destPos, int len) \[[4](#signature-const-int32_t--freesize-java-owned)\] <br> releaseVal() | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() <br> int getValElemCount() | | Java | Starts w/ null elements | +| [const] | int32_t* val | setVal(int[] src, int srcPos, int destPos, int len) \[[5](#signature-const-int32_t--customsize-ambiguous-java-owned)\] <br> releaseVal() | IntBuffer getVal() <br> int[] getVal(int srcPos, int[] dest, int destPos, int len) <br> boolean isValNull() | **ReturnedArrayLength getValCount()** | **Ambiguous** | Variable element count<br>using field *valCount*,<br>which has getter and setter | | [const] | char* name | setName(String srcVal) <br> releaseVal() | String getName() <br> boolean isNameNull() <br> int getNameElemCount() | **ReturnsStringOnly** | Java | String only, w/ EOS | | [const] | char* name | setName(String srcVal) <br> setName(byte[] src, int srcPos, int destPos, int len) <br> releaseVal() | String getNameAsString() <br> ByteBuffer getName() <br> boolean isNameNull() <br> int getNameElemCount() | **ReturnsString** | Java | String and byte access, w/ EOS| +### Struct Java Signature Examples + +#### Signature `int32_t *` MaxOneElement, Java owned + +* `void com.jogamp.gluegen.test.junit.generation.TK_Field.setVariaInt32PointerMaxOneElemElemCount(int src)` + + Setter for native field variaInt32PointerMaxOneElem, referencing a Java owned array with variable element count of 0 initial elements. + + Maximum element count is 1. + + Native Signature: + * field-type (PointerType) 'int32_t *' -> (int32_t) * , size [fixed false, lnx64 8], const[false], pointer*1 + * referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], const[false], int + + Will reuse memory if existing, otherwise allocating memory. + +#### Signature `const int32_t *` MaxOneElement, Java owned + +* `TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setConstInt32PointerMaxOneElem(int src)` + + Setter for native field variaInt32PointerMaxOneElem, referencing a Java owned array with variable element count of 0 initial elements. + + Maximum element count is 1. + + Native Signature: + * field-type (PointerType) 'int32_t *' -> (const int32_t) * , size [fixed false, lnx64 8], const[false], pointer*1 + * referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], const[native, true], int + + Always replaces memory due to `const` value modifier. + +#### Signature `int32_t *` ConstElemCount 3, Natively owned + +* `TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setVariaInt32PointerConstLen(int[] src, int srcPos, int destPos, int length)` + + Setter for native field variaInt32PointerConstLen, referencing a natively owned array with fixed element count of 3 elements. + + Native Signature: + * field-type (PointerType) 'int32_t *' -> (int32_t) * , size [fixed false, lnx64 8], const[false], pointer*1 + * referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], const[false], int + + Copies the given source elements into the respective field's existing memory. + + Parameters: + * src the source array of elements + * srcPos starting element position within the source array with 'srcPos >= 0` && `srcPos + length <= src.length`, otherwise an IndexOutOfBoundsException is thrown + * destPos starting element position within the destination with 'destPos >= 0` && `destPos + length <= elemCount`, otherwise an exception is thrown + * length the element count to be copied with 'length >= 0` && `srcPos + length <= src.length` && `destPos + length <= elemCount`, otherwise an IndexOutOfBoundsException is thrown + + Returns: + * this instance of chaining + +#### Signature `int32_t *` FreeSize, Java owned +* `TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setVariaInt32PointerVariaLen(boolean subset, int[] src, int srcPos, int destPos, int length)` + + Setter for native field variaInt32PointerVariaLen, referencing a Java owned array with variable element count of 0 initial elements. + + Native Signature: + * field-type (PointerType) 'int32_t *' -> (int32_t) * , size [fixed false, lnx64 8], const[false], pointer*1 + * referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], const[false], int + + Copies the given source elements into the respective field, either writing into the existing memory or creating a new memory and referencing it. + + Parameters: + * subset if `true` keeps the underlying memory and only allows to set up to `elemCount` elements. Otherwise may replace the underlying memory if `destPos + length != elemCount`. + * src the source array of elements + * srcPos starting element position within the source array with 'srcPos >= 0` && `srcPos + length <= src.length`, otherwise an IndexOutOfBoundsException is thrown + * destPos starting element position within the destination with 'destPos >= 0`. If `subset == true`, `destPos + length <= elemCount` also must be be `true`. Otherwise an exception is thrown + * length the element count to be copied with 'length >= 0` && `srcPos + length <= src.length`, otherwise an IndexOutOfBoundsException is thrown + + Returns: + * this instance of chaining + +#### Signature `const int32_t *` FreeSize, Java owned +* `TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setConstInt32PointerVariaLen(int[] src, int srcPos, int length)` + + Setter for native field constInt32PointerVariaLen, referencing a Java owned array with variable element count of 0 initial elements. + + Native Signature: + * field-type (PointerType) 'int32_t *' -> (const int32_t) * , size [fixed false, lnx64 8], const[false], pointer*1 + * referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], const[native, true], int + + Replaces the respective field's memory with a new memory segment containing given source elements and referencing it. + + Parameters: + * src the source array of elements + * srcPos starting element position within the source array with 'srcPos >= 0` && `srcPos + length <= src.length`, otherwise an IndexOutOfBoundsException is thrown + * length the element count to be copied with 'length >= 0` && `srcPos + length <= src.length`, otherwise an IndexOutOfBoundsException is thrown + + Returns: + * this instance of chaining + +#### Signature `const int32_t *` CustomSize, Ambiguous, Java owned +* `TK_Field com.jogamp.gluegen.test.junit.generation.TK_Field.setConstInt32PointerCustomLen(int[] src, int srcPos, int length)` + + Setter for native field constIntxxPointerCustomLen, referencing a mixed and ambigously owned (**warning**) array with variable element count of getConstIntxxPointerCustomLenElemCount() elements. + + Native Signature: + * field-type (PointerType) 'int32_t *' -> (const int32_t) * , size [fixed false, lnx64 8], const[false], pointer*1 + * referenced (IntType) typedef 'int32_t', size [fixed true, lnx64 4], const[native, true], int + + Replaces the respective field's memory with a new memory segment containing given source elements and referencing it. + + Parameters: + * src the source array of elements + * srcPos starting element position within the source array with 'srcPos >= 0` && `srcPos + length <= src.length`, otherwise an IndexOutOfBoundsException is thrown + * length the element count to be copied with 'length >= 0` && `srcPos + length <= src.length`, otherwise an IndexOutOfBoundsException is thrown + + Returns: + * this instance of chaining + ### Struct Setter Pseudo-Code * *ImmutableAccess*: Drops setter, immutable diff --git a/doc/JogAmpMacOSVersions.html b/doc/JogAmpMacOSVersions.html index 22c2351..3b56244 100644 --- a/doc/JogAmpMacOSVersions.html +++ b/doc/JogAmpMacOSVersions.html @@ -1,407 +1,415 @@ -<style> -div#header, header - { - - border-bottom: 1px solid #aaa; - margin-bottom: 0.5em; - } - -.title - { - text-align: center; - } - -.author, .date - { - text-align: center; - } - -div#TOC, nav#TOC - { - - border-bottom: 1px solid #aaa; - margin-bottom: 0.5em; - } - -nav#TOC { - margin-bottom: var(--line-height); - - padding-bottom: 0.5rem; -} - -nav#TOC input { - display: none; -} - -nav#TOC label { - color: var(--color-link); - cursor: pointer; -} - -nav#TOC > ul { - display: none; -} - -nav#TOC > input:checked + ul { - display: block; -} - -@media print - { - div#TOC, nav#TOC - { - - display: none; +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang=""> +<head> + <meta charset="utf-8" /> + <meta name="generator" content="pandoc" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> + <title>JogAmpMacOSVersions.md</title> + <style> + div#header, header + { + + border-bottom: 1px solid #aaa; + margin-bottom: 0.5em; + } + + .title + { + text-align: center; + } + + .author, .date + { + text-align: center; + } + + div#TOC, nav#TOC + { + + border-bottom: 1px solid #aaa; + margin-bottom: 0.5em; + } + + nav#TOC { + margin-bottom: var(--line-height); + + padding-bottom: 0.5rem; } - } -div.content - { - color: #111111; - font-size: 14px; - line-height: 1.6; - } - -div#cgit a - { - color: #1212a0; - } - -div#cgit a.sourceLine - { - color: #111111; - } - -h1, h2, h3, h4, h5, h6 -{ - font-family: "Helvetica Neue", Helvetica, "Liberation Sans", Calibri, Arial, sans-serif; - - page-break-after: avoid; - - margin: 20px 0 10px; - padding: 0; -} + nav#TOC input { + display: none; + } -h2 { - border-bottom: 1px solid #ccc; -} + nav#TOC label { + color: var(--color-link); + cursor: pointer; + } -div div - { + nav#TOC > ul { + display: none; + } - } + nav#TOC > input:checked + ul { + display: block; + } -section section - { - margin-left: 2em; - } + @media print + { + div#TOC, nav#TOC + { + + display: none; + } + } + + div.content + { + color: #111111; + font-size: 14px; + line-height: 1.6; + } + + div#cgit a + { + color: #1212a0; + } + + div#cgit a.sourceLine + { + color: #111111; + } + + h1, h2, h3, h4, h5, h6 + { + font-family: "Helvetica Neue", Helvetica, "Liberation Sans", Calibri, Arial, sans-serif; -p {} + page-break-after: avoid; -blockquote - { - font-style: italic; - } + margin: 20px 0 10px; + padding: 0; + } -li - { - } + h2 { + border-bottom: 1px solid #ccc; + } -li > p - { - margin-top: 1em; - } + div div + { -ul - { - } + } -ul li - { - } + section section + { + margin-left: 2em; + } -ol - { - } + p {} -ol li - { - } + blockquote + { + font-style: italic; + } -hr {} + li + { + } -sub - { - } + li > p + { + margin-top: 1em; + } -sup - { - } + ul + { + } -em - { - } + ul li + { + } -em > em - { - font-style: normal; - } + ol + { + } -strong - { - } + ol li + { + } -a - { + hr {} - text-decoration: none; - } + sub + { + } -@media screen - { - a:hover - { + sup + { + } - text-decoration: underline; - } - } + em + { + } -@media print - { - a { + em > em + { + font-style: normal; + } - color: black; - background: transparent; - } + strong + { + } - a[href^="http://"]:after, a[href^="https://"]:after - { + a + { - content: " (" attr(href) ") "; - font-size: 90%; - } - } + text-decoration: none; + } -img - { + @media screen + { + a:hover + { - vertical-align: middle; - } + text-decoration: underline; + } + } -div.figure - { + @media print + { + a { - margin-left: auto; - margin-right: auto; - text-align: center; - font-style: italic; - } + color: black; + background: transparent; + } -p.caption - { + a[href^="http://"]:after, a[href^="https://"]:after + { - } + content: " (" attr(href) ") "; + font-size: 90%; + } + } -pre, code - { - background-color: #f8f8f8; + img + { - white-space: pre-wrap; - white-space: -moz-pre-wrap !important; - white-space: -pre-wrap; - white-space: -o-pre-wrap; - word-wrap: break-word; + vertical-align: middle; + } - } + div.figure + { -pre - { + margin-left: auto; + margin-right: auto; + text-align: center; + font-style: italic; + } - padding: 0.5em; - border-radius: 5px; + p.caption + { - background-color: #f8f8f8; - border: 1px solid #ccc; - font-size: 13px; - line-height: 19px; - overflow: auto; - padding: 6px 10px; + } - margin-left: 0.5em; - margin-right: 0.5em; - } + pre, code + { + background-color: #f8f8f8; -@media screen - { - pre - { - - white-space: pre; - overflow: auto; - - border: 1px dotted #777; - } - } - -code - { - } - -p > code, li > code - { - - padding-left: 2px; - padding-right: 2px; - } - -li > p code - { - - padding: 2px; - } - -span.math - { - - } - -div.math - { - } - -span.LaTeX - { - } - -eq - { - } - -table - { - border-collapse: collapse; - border-spacing: 0; - - margin-left: auto; - margin-right: auto; - } - -thead - { - border-bottom: 1pt solid #000; - background-color: #eee; - } - -tr.header - { - } - -tbody - { - } - -tr { - } -tr.odd:hover, tr.even:hover - { - background-color: #eee; - } - -tr.odd {} -tr.even {} - -td, th - { - vertical-align: top; - vertical-align: baseline; - padding-left: 0.5em; - padding-right: 0.5em; - padding-top: 0.2em; - padding-bottom: 0.2em; - } -th - { - font-weight: bold; - } - -tfoot - { - } - -caption - { - caption-side: top; - border: none; - font-size: 0.9em; - font-style: italic; - text-align: center; - margin-bottom: 0.3em; - padding-bottom: 0.2em; - } - -dl - { - border-top: 2pt solid black; - padding-top: 0.5em; - border-bottom: 2pt solid black; - } - -dt - { - font-weight: bold; - } - -dd+dt - { - border-top: 1pt solid black; - padding-top: 0.5em; - } - -dd - { - margin-bottom: 0.5em; - } - -dd+dd - { - border-top: 1px solid black; - } - -a.footnote, a.footnoteRef { - font-size: small; - vertical-align: text-top; -} - -a[href^="#fnref"], a.reversefootnote - { - } + white-space: pre-wrap; + white-space: -moz-pre-wrap !important; + white-space: -pre-wrap; + white-space: -o-pre-wrap; + word-wrap: break-word; -@media print - { - a[href^="#fnref"], a.reversefootnote - { - - display: none; - } - } + } -div.footnotes - { - } + pre + { -div.footnotes li[id^="fn"] - { - } + padding: 0.5em; + border-radius: 5px; -@media print - { - .noprint - { - display:none; + background-color: #f8f8f8; + border: 1px solid #ccc; + font-size: 13px; + line-height: 19px; + overflow: auto; + padding: 6px 10px; + + margin-left: 0.5em; + margin-right: 0.5em; + } + + @media screen + { + pre + { + + white-space: pre; + overflow: auto; + + border: 1px dotted #777; + } + } + + code + { + } + + p > code, li > code + { + + padding-left: 2px; + padding-right: 2px; + } + + li > p code + { + + padding: 2px; + } + + span.math + { + + } + + div.math + { + } + + span.LaTeX + { + } + + eq + { + } + + table + { + border-collapse: collapse; + border-spacing: 0; + + margin-left: auto; + margin-right: auto; + } + + thead + { + border-bottom: 1pt solid #000; + background-color: #eee; + } + + tr.header + { + } + + tbody + { + } + + tr { + } + tr.odd:hover, tr.even:hover + { + background-color: #eee; + } + + tr.odd {} + tr.even {} + + td, th + { + vertical-align: top; + vertical-align: baseline; + padding-left: 0.5em; + padding-right: 0.5em; + padding-top: 0.2em; + padding-bottom: 0.2em; + } + th + { + font-weight: bold; + } + + tfoot + { + } + + caption + { + caption-side: top; + border: none; + font-size: 0.9em; + font-style: italic; + text-align: center; + margin-bottom: 0.3em; + padding-bottom: 0.2em; + } + + dl + { + border-top: 2pt solid black; + padding-top: 0.5em; + border-bottom: 2pt solid black; + } + + dt + { + font-weight: bold; + } + + dd+dt + { + border-top: 1pt solid black; + padding-top: 0.5em; + } + + dd + { + margin-bottom: 0.5em; + } + + dd+dd + { + border-top: 1px solid black; + } + + a.footnote, a.footnoteRef { + font-size: small; + vertical-align: text-top; } - } -</style> + a[href^="#fnref"], a.reversefootnote + { + } + + @media print + { + a[href^="#fnref"], a.reversefootnote + { + + display: none; + } + } + + div.footnotes + { + } + + div.footnotes li[id^="fn"] + { + } + + @media print + { + .noprint + { + display:none; + } + } + </style> +</head> +<body> <nav id="TOC" role="doc-toc"> <strong>Contents</strong><label for="contents">⊕</label> <input type="checkbox" id="contents"> @@ -425,7 +433,6 @@ div.footnotes li[id^="fn"] </ul></li> </ul> </nav> - <style> table, th, td { border: 1px solid black; @@ -566,3 +573,5 @@ Sierra), Darwin 17, <code>x86_64</code></h3> </tr> </tbody> </table> +</body> +</html> |