<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ada83.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Administrateur</id>
	<title>Ada 83 Memory - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://ada83.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Administrateur"/>
	<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=Special:Contributions/Administrateur"/>
	<updated>2026-07-26T11:44:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=Ada_83_Memory:Terms_of_Service&amp;diff=129</id>
		<title>Ada 83 Memory:Terms of Service</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=Ada_83_Memory:Terms_of_Service&amp;diff=129"/>
		<updated>2025-03-12T19:30:35Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: Add initial ToS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 1. Terms == &amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
By accessing this web site, you are agreeing to be bound by these web site Terms and Conditions of Use (&amp;quot;Terms of Use&amp;quot;), all applicable laws and regulations, and agree that you are responsible for compliance with any applicable local laws. If you do not agree with any of these terms, you are prohibited from using or accessing this site. The materials contained in this web site are protected by applicable copyright and trademark law.&lt;br /&gt;
&lt;br /&gt;
== 2. Copyright == &amp;lt;!--T:5--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
By editing a wiki on ada83.org, you agree to the licensing terms displayed on that wiki at the time of the edit. By default, wikis have contents licensed under the Creative Commons Attribution-ShareAlike 4.0 License.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:6--&amp;gt;&lt;br /&gt;
By requesting and using this wiki, you agree to abide by EU and international copyright laws.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:7--&amp;gt;&lt;br /&gt;
In the event unauthorized copyrighted material is found on a wiki, you may report the contents to us via info@ada83.org.&lt;br /&gt;
&lt;br /&gt;
== 3. Disclaimer == &amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:11--&amp;gt;&lt;br /&gt;
The materials on ada83.org web site are provided &amp;quot;as is&amp;quot;. Ada83.org makes no warranties, expressed or implied, and hereby disclaims and negates all other warranties, including without limitation, implied warranties or conditions of merchantability, fitness for a particular purpose, or non-infringement of intellectual property or other violation of rights. Further, ada83.org does not warrant or make any representations concerning the accuracy, likely results, or reliability of the use of the materials on its Internet web site or otherwise relating to such materials or on any sites linked to this site.&lt;br /&gt;
&lt;br /&gt;
== 4. Limitations == &amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
In no event shall ada83.org or its suppliers be liable for any damages (including, without limitation, damages for loss of data or profit, or due to business interruption) arising out of the use or inability to use the materials on the ada83.org website, even if ada83.org or a ada83.org authorized representative has been notified orally or in writing of the possibility of such damage. Because some jurisdictions do not allow limitations on implied warranties, or limitations of liability for consequential or incidental damages, these limitations may not apply to you.&lt;br /&gt;
&lt;br /&gt;
== 5. Revisions and Errata == &amp;lt;!--T:14--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:15--&amp;gt;&lt;br /&gt;
The materials appearing on the ada83.org web site could include technical, typographical, or photographic errors. Ada83.org does not warrant that any of the materials on its web site are accurate, complete, or current. Ada83.org or its users may make changes to the materials contained on its web site at any time without notice. Ada83.org does not, however, make any commitment to update the materials.&lt;br /&gt;
&lt;br /&gt;
== 6. Content == &amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
Under no circumstances are you permitted to submit information to ada83.org which is illegal to display, distribute, or disseminate in the European Union.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
These Terms of Service are based on the [https://meta.miraheze.org/wiki/Terms%20of%20Use Terms of Use of Miraheze].&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=User_talk:Jelleke&amp;diff=127</id>
		<title>User talk:Jelleke</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=User_talk:Jelleke&amp;diff=127"/>
		<updated>2025-03-12T18:38:34Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to &#039;&#039;Ada 83 Memory&#039;&#039;!&#039;&#039;&#039;&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:Administrateur|Administrateur]] ([[User talk:Administrateur|talk]]) 19:38, 12 March 2025 (CET)&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=124</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=124"/>
		<updated>2025-03-03T22:53:20Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: decterm;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/_decterm.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: gold;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;decterm&#039;;&lt;br /&gt;
    font-size:18px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=123</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=123"/>
		<updated>2025-03-03T22:52:52Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: decterm;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/_decterm.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: gold;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;decterm&#039;;&lt;br /&gt;
    font-size:19px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=122</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=122"/>
		<updated>2025-03-03T22:51:54Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: decterm;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/_decterm.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: gold;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;decterm&#039;;&lt;br /&gt;
    font-size:17px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=121</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=121"/>
		<updated>2025-03-03T22:50:36Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: decterm;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/_decterm.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: gold;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;decterm&#039;;&lt;br /&gt;
    font-size:15px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=120</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=120"/>
		<updated>2025-03-03T22:50:01Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: decterm;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/_decterm.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: gold;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
    font-size:15px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=119</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=119"/>
		<updated>2025-03-03T22:46:17Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: gold;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
    font-size:15px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=118</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=118"/>
		<updated>2025-03-03T22:43:14Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: lime;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
    font-size:15px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=117</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=117"/>
		<updated>2025-03-03T22:41:55Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;https://ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: lime;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=116</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=116"/>
		<updated>2025-03-03T22:15:01Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: lime;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=115</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=115"/>
		<updated>2025-03-03T22:13:59Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;http://ada83.org/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: lime;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=114</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=114"/>
		<updated>2025-03-03T22:12:37Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;www/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: lime;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=Ada_83_examples&amp;diff=113</id>
		<title>Ada 83 examples</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=Ada_83_examples&amp;diff=113"/>
		<updated>2025-03-03T22:09:06Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Examples ==&lt;br /&gt;
&lt;br /&gt;
The simplest program :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
          -----------&lt;br /&gt;
procedure HELLO_WORLD&lt;br /&gt;
is        -----------&lt;br /&gt;
begin&lt;br /&gt;
  TEXT_IO.PUT_LINE( &amp;quot;Hello_world !&amp;quot; );&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A simple ASCII JSON reader/writer program :&lt;br /&gt;
[[JSON package]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=112</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=112"/>
		<updated>2025-03-03T22:08:04Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: &#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
  src: url(&#039;../fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: lime;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=111</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=111"/>
		<updated>2025-03-03T21:34:53Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: Glass_TTY_VT220;&lt;br /&gt;
  src: url(&#039;../fonts/Glass_TTY_VT220.ttf&#039;) format(&#039;truetype&#039;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: lime;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=110</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=110"/>
		<updated>2025-03-03T21:29:29Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
  font-family: &amp;quot;Glass_TTY_VT220&amp;quot;;&lt;br /&gt;
  src: url(&amp;quot;./www/wiki/skins/Timeless/resources/fonts/Glass_TTY_VT220.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: lime;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Glass_TTY_VT220&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=109</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=109"/>
		<updated>2025-03-03T08:20:33Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black;&lt;br /&gt;
    color: lime;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=108</id>
		<title>JSON package</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=108"/>
		<updated>2025-03-03T08:19:02Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an example package for ASCII JSON text file reading/writing. As Ada 83 only supports ASCII characters, there is no support for UTF-8 or other wide characters.&lt;br /&gt;
&lt;br /&gt;
A private list data structure is constructed when the JSON text is parsed. Some simple interrogation subprograms are provided and structure scanning generic procedure allow for object and array scanning while processing each object/array element.&lt;br /&gt;
&lt;br /&gt;
The package body is [[JSON_bdy|here]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
						----&lt;br /&gt;
			package			JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
  type ITEM		is private;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_TYPE		is ( OBJECT_ITEM, ARRAY_ITEM,&lt;br /&gt;
			     STRING_ITEM, INTEGER_ITEM, FLOAT_ITEM, BOOLEAN_ITEM, NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  subtype TERMINAL_TYPE	is ITEM_TYPE range STRING_ITEM .. NULL_ITEM;&lt;br /&gt;
&lt;br /&gt;
  subtype FILE_TYPE		is TEXT_IO.FILE_TYPE;&lt;br /&gt;
&lt;br /&gt;
  MAX_STRING_LENGTH		:constant NATURAL	:= 2**15-1;&lt;br /&gt;
  subtype STRING_LENGTH	is NATURAL range 0 .. MAX_STRING_LENGTH;&lt;br /&gt;
&lt;br /&gt;
  type VALUE_DATA (KIND :TERMINAL_TYPE := NULL_ITEM; LENGTH :STRING_LENGTH := 0)&lt;br /&gt;
			is record&lt;br /&gt;
			  case  KIND&lt;br /&gt;
			  is&lt;br /&gt;
			    when STRING_ITEM	=&amp;gt; STRING_VAL	:STRING( 1 .. LENGTH );&lt;br /&gt;
			    when INTEGER_ITEM	=&amp;gt; INT_VAL	:INTEGER;&lt;br /&gt;
			    when FLOAT_ITEM		=&amp;gt; FLOAT_VAL	:LONG_FLOAT;&lt;br /&gt;
			    when BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	:BOOLEAN;&lt;br /&gt;
			    when NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I / O&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  procedure GET			( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM );&lt;br /&gt;
  procedure PUT			( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM );&lt;br /&gt;
  function  STRING_OF		( THE_ITEM :ITEM)				return STRING;&lt;br /&gt;
  function  ITEM_OF			( THE_STRING :STRING)			return ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  KIND			( OF_ITEM :ITEM )				return ITEM_TYPE;&lt;br /&gt;
  function  IS_PRESENT		( KEY :STRING; IN_OBJECT :ITEM )		return BOOLEAN;&lt;br /&gt;
  function  ITEM_BY_KEY		( KEY :STRING; IN_OBJECT :ITEM )		return ITEM;&lt;br /&gt;
  function  ITEM_VALUE		( OF_ITEM :ITEM )				return VALUE_DATA;&lt;br /&gt;
  function  NUMBER_OF_SUB_ITEMS	( IN_ITEM :ITEM )				return NATURAL;&lt;br /&gt;
  procedure FREE			( THE_ITEM :in out ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_ITEM	( OF_ARRAY :ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( KEY :STRING; ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_FIELD	( OF_OBJECT :ITEM );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  SYNTAX_ERROR, BAD_ITEM_TYPE, VALUE_NOT_FOUND	: exception;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
										pragma PAGE;&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :JSON.ITEM_TYPE);&lt;br /&gt;
  type ITEM			is access ITEM_DEFINITION;&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD;&lt;br /&gt;
  type OBJECT_FIELD_ACCESS		is access OBJECT_FIELD;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT;&lt;br /&gt;
  type LIST_OF_ITEMS		is access ITEM_LIST_ELEMENT;&lt;br /&gt;
&lt;br /&gt;
  type STRING_ACCESS		is access STRING;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :ITEM_TYPE)	is record&lt;br /&gt;
				  case KIND is&lt;br /&gt;
				  when  OBJECT_ITEM		=&amp;gt; FIELDS_LIST	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				  when  ARRAY_ITEM		=&amp;gt; ITEMS_LIST	: LIST_OF_ITEMS;&lt;br /&gt;
				  when  STRING_ITEM		=&amp;gt; STR_ACCESS	: STRING_ACCESS;&lt;br /&gt;
				  when  INTEGER_ITEM	=&amp;gt; INT_VAL	: INTEGER;&lt;br /&gt;
				  when  FLOAT_ITEM		=&amp;gt; FLOAT_VAL	: LONG_FLOAT;&lt;br /&gt;
				  when  BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	: BOOLEAN;&lt;br /&gt;
				  when  NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
				  end case;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD			is record&lt;br /&gt;
				  FIELD_KEY	: STRING_ACCESS;&lt;br /&gt;
				  FIELD_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT		is record&lt;br /&gt;
				  LIST_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: LIST_OF_ITEMS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=107</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=107"/>
		<updated>2025-03-03T08:18:34Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=106</id>
		<title>JSON package</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=106"/>
		<updated>2025-03-03T08:18:04Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an example package for ASCII JSON text file reading/writing. As Ada 83 only supports ASCII characters, there is no support for UTF-8 or other wide characters.&lt;br /&gt;
&lt;br /&gt;
A private list data structure is constructed when the JSON text is parsed. Some simple interrogation subprograms are provided and structure scanning generic procedure allow for object and array scanning while processing each object/array element.&lt;br /&gt;
&lt;br /&gt;
The package body is [[JSON_bdy|here]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada95&amp;quot;&amp;gt;&lt;br /&gt;
--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
						----&lt;br /&gt;
			package			JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
  type ITEM		is private;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_TYPE		is ( OBJECT_ITEM, ARRAY_ITEM,&lt;br /&gt;
			     STRING_ITEM, INTEGER_ITEM, FLOAT_ITEM, BOOLEAN_ITEM, NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  subtype TERMINAL_TYPE	is ITEM_TYPE range STRING_ITEM .. NULL_ITEM;&lt;br /&gt;
&lt;br /&gt;
  subtype FILE_TYPE		is TEXT_IO.FILE_TYPE;&lt;br /&gt;
&lt;br /&gt;
  MAX_STRING_LENGTH		:constant NATURAL	:= 2**15-1;&lt;br /&gt;
  subtype STRING_LENGTH	is NATURAL range 0 .. MAX_STRING_LENGTH;&lt;br /&gt;
&lt;br /&gt;
  type VALUE_DATA (KIND :TERMINAL_TYPE := NULL_ITEM; LENGTH :STRING_LENGTH := 0)&lt;br /&gt;
			is record&lt;br /&gt;
			  case  KIND&lt;br /&gt;
			  is&lt;br /&gt;
			    when STRING_ITEM	=&amp;gt; STRING_VAL	:STRING( 1 .. LENGTH );&lt;br /&gt;
			    when INTEGER_ITEM	=&amp;gt; INT_VAL	:INTEGER;&lt;br /&gt;
			    when FLOAT_ITEM		=&amp;gt; FLOAT_VAL	:LONG_FLOAT;&lt;br /&gt;
			    when BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	:BOOLEAN;&lt;br /&gt;
			    when NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I / O&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  procedure GET			( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM );&lt;br /&gt;
  procedure PUT			( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM );&lt;br /&gt;
  function  STRING_OF		( THE_ITEM :ITEM)				return STRING;&lt;br /&gt;
  function  ITEM_OF			( THE_STRING :STRING)			return ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  KIND			( OF_ITEM :ITEM )				return ITEM_TYPE;&lt;br /&gt;
  function  IS_PRESENT		( KEY :STRING; IN_OBJECT :ITEM )		return BOOLEAN;&lt;br /&gt;
  function  ITEM_BY_KEY		( KEY :STRING; IN_OBJECT :ITEM )		return ITEM;&lt;br /&gt;
  function  ITEM_VALUE		( OF_ITEM :ITEM )				return VALUE_DATA;&lt;br /&gt;
  function  NUMBER_OF_SUB_ITEMS	( IN_ITEM :ITEM )				return NATURAL;&lt;br /&gt;
  procedure FREE			( THE_ITEM :in out ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_ITEM	( OF_ARRAY :ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( KEY :STRING; ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_FIELD	( OF_OBJECT :ITEM );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  SYNTAX_ERROR, BAD_ITEM_TYPE, VALUE_NOT_FOUND	: exception;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
										pragma PAGE;&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :JSON.ITEM_TYPE);&lt;br /&gt;
  type ITEM			is access ITEM_DEFINITION;&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD;&lt;br /&gt;
  type OBJECT_FIELD_ACCESS		is access OBJECT_FIELD;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT;&lt;br /&gt;
  type LIST_OF_ITEMS		is access ITEM_LIST_ELEMENT;&lt;br /&gt;
&lt;br /&gt;
  type STRING_ACCESS		is access STRING;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :ITEM_TYPE)	is record&lt;br /&gt;
				  case KIND is&lt;br /&gt;
				  when  OBJECT_ITEM		=&amp;gt; FIELDS_LIST	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				  when  ARRAY_ITEM		=&amp;gt; ITEMS_LIST	: LIST_OF_ITEMS;&lt;br /&gt;
				  when  STRING_ITEM		=&amp;gt; STR_ACCESS	: STRING_ACCESS;&lt;br /&gt;
				  when  INTEGER_ITEM	=&amp;gt; INT_VAL	: INTEGER;&lt;br /&gt;
				  when  FLOAT_ITEM		=&amp;gt; FLOAT_VAL	: LONG_FLOAT;&lt;br /&gt;
				  when  BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	: BOOLEAN;&lt;br /&gt;
				  when  NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
				  end case;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD			is record&lt;br /&gt;
				  FIELD_KEY	: STRING_ACCESS;&lt;br /&gt;
				  FIELD_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT		is record&lt;br /&gt;
				  LIST_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: LIST_OF_ITEMS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=105</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=105"/>
		<updated>2025-03-03T08:17:54Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight-lang-ada95 pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada95 pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=104</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=104"/>
		<updated>2025-03-03T08:12:24Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada pre .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=103</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=103"/>
		<updated>2025-03-03T08:11:28Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=102</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=102"/>
		<updated>2025-03-03T08:10:40Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kc {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kd {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kn {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kp {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kr {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kt {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada .l {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .n {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .o {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .x {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .p {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=101</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=101"/>
		<updated>2025-03-03T08:09:00Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kc {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kd {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kn {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kp {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kr {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight-lang-ada .kt {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=100</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=100"/>
		<updated>2025-03-03T08:06:33Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight-lang-ada pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight-lang-ada .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=99</id>
		<title>JSON package</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=99"/>
		<updated>2025-03-03T08:05:10Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an example package for ASCII JSON text file reading/writing. As Ada 83 only supports ASCII characters, there is no support for UTF-8 or other wide characters.&lt;br /&gt;
&lt;br /&gt;
A private list data structure is constructed when the JSON text is parsed. Some simple interrogation subprograms are provided and structure scanning generic procedure allow for object and array scanning while processing each object/array element.&lt;br /&gt;
&lt;br /&gt;
The package body is [[JSON_bdy|here]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
						----&lt;br /&gt;
			package			JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
  type ITEM		is private;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_TYPE		is ( OBJECT_ITEM, ARRAY_ITEM,&lt;br /&gt;
			     STRING_ITEM, INTEGER_ITEM, FLOAT_ITEM, BOOLEAN_ITEM, NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  subtype TERMINAL_TYPE	is ITEM_TYPE range STRING_ITEM .. NULL_ITEM;&lt;br /&gt;
&lt;br /&gt;
  subtype FILE_TYPE		is TEXT_IO.FILE_TYPE;&lt;br /&gt;
&lt;br /&gt;
  MAX_STRING_LENGTH		:constant NATURAL	:= 2**15-1;&lt;br /&gt;
  subtype STRING_LENGTH	is NATURAL range 0 .. MAX_STRING_LENGTH;&lt;br /&gt;
&lt;br /&gt;
  type VALUE_DATA (KIND :TERMINAL_TYPE := NULL_ITEM; LENGTH :STRING_LENGTH := 0)&lt;br /&gt;
			is record&lt;br /&gt;
			  case  KIND&lt;br /&gt;
			  is&lt;br /&gt;
			    when STRING_ITEM	=&amp;gt; STRING_VAL	:STRING( 1 .. LENGTH );&lt;br /&gt;
			    when INTEGER_ITEM	=&amp;gt; INT_VAL	:INTEGER;&lt;br /&gt;
			    when FLOAT_ITEM		=&amp;gt; FLOAT_VAL	:LONG_FLOAT;&lt;br /&gt;
			    when BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	:BOOLEAN;&lt;br /&gt;
			    when NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I / O&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  procedure GET			( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM );&lt;br /&gt;
  procedure PUT			( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM );&lt;br /&gt;
  function  STRING_OF		( THE_ITEM :ITEM)				return STRING;&lt;br /&gt;
  function  ITEM_OF			( THE_STRING :STRING)			return ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  KIND			( OF_ITEM :ITEM )				return ITEM_TYPE;&lt;br /&gt;
  function  IS_PRESENT		( KEY :STRING; IN_OBJECT :ITEM )		return BOOLEAN;&lt;br /&gt;
  function  ITEM_BY_KEY		( KEY :STRING; IN_OBJECT :ITEM )		return ITEM;&lt;br /&gt;
  function  ITEM_VALUE		( OF_ITEM :ITEM )				return VALUE_DATA;&lt;br /&gt;
  function  NUMBER_OF_SUB_ITEMS	( IN_ITEM :ITEM )				return NATURAL;&lt;br /&gt;
  procedure FREE			( THE_ITEM :in out ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_ITEM	( OF_ARRAY :ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( KEY :STRING; ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_FIELD	( OF_OBJECT :ITEM );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  SYNTAX_ERROR, BAD_ITEM_TYPE, VALUE_NOT_FOUND	: exception;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
										pragma PAGE;&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :JSON.ITEM_TYPE);&lt;br /&gt;
  type ITEM			is access ITEM_DEFINITION;&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD;&lt;br /&gt;
  type OBJECT_FIELD_ACCESS		is access OBJECT_FIELD;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT;&lt;br /&gt;
  type LIST_OF_ITEMS		is access ITEM_LIST_ELEMENT;&lt;br /&gt;
&lt;br /&gt;
  type STRING_ACCESS		is access STRING;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :ITEM_TYPE)	is record&lt;br /&gt;
				  case KIND is&lt;br /&gt;
				  when  OBJECT_ITEM		=&amp;gt; FIELDS_LIST	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				  when  ARRAY_ITEM		=&amp;gt; ITEMS_LIST	: LIST_OF_ITEMS;&lt;br /&gt;
				  when  STRING_ITEM		=&amp;gt; STR_ACCESS	: STRING_ACCESS;&lt;br /&gt;
				  when  INTEGER_ITEM	=&amp;gt; INT_VAL	: INTEGER;&lt;br /&gt;
				  when  FLOAT_ITEM		=&amp;gt; FLOAT_VAL	: LONG_FLOAT;&lt;br /&gt;
				  when  BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	: BOOLEAN;&lt;br /&gt;
				  when  NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
				  end case;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD			is record&lt;br /&gt;
				  FIELD_KEY	: STRING_ACCESS;&lt;br /&gt;
				  FIELD_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT		is record&lt;br /&gt;
				  LIST_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: LIST_OF_ITEMS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=98</id>
		<title>JSON package</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=98"/>
		<updated>2025-03-03T07:59:38Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;&lt;br /&gt;
--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
						----&lt;br /&gt;
			package			JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
  type ITEM		is private;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_TYPE		is ( OBJECT_ITEM, ARRAY_ITEM,&lt;br /&gt;
			     STRING_ITEM, INTEGER_ITEM, FLOAT_ITEM, BOOLEAN_ITEM, NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  subtype TERMINAL_TYPE	is ITEM_TYPE range STRING_ITEM .. NULL_ITEM;&lt;br /&gt;
&lt;br /&gt;
  subtype FILE_TYPE		is TEXT_IO.FILE_TYPE;&lt;br /&gt;
&lt;br /&gt;
  MAX_STRING_LENGTH		:constant NATURAL	:= 2**15-1;&lt;br /&gt;
  subtype STRING_LENGTH	is NATURAL range 0 .. MAX_STRING_LENGTH;&lt;br /&gt;
&lt;br /&gt;
  type VALUE_DATA (KIND :TERMINAL_TYPE := NULL_ITEM; LENGTH :STRING_LENGTH := 0)&lt;br /&gt;
			is record&lt;br /&gt;
			  case  KIND&lt;br /&gt;
			  is&lt;br /&gt;
			    when STRING_ITEM	=&amp;gt; STRING_VAL	:STRING( 1 .. LENGTH );&lt;br /&gt;
			    when INTEGER_ITEM	=&amp;gt; INT_VAL	:INTEGER;&lt;br /&gt;
			    when FLOAT_ITEM		=&amp;gt; FLOAT_VAL	:LONG_FLOAT;&lt;br /&gt;
			    when BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	:BOOLEAN;&lt;br /&gt;
			    when NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I / O&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  procedure GET			( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM );&lt;br /&gt;
  procedure PUT			( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM );&lt;br /&gt;
  function  STRING_OF		( THE_ITEM :ITEM)				return STRING;&lt;br /&gt;
  function  ITEM_OF			( THE_STRING :STRING)			return ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  KIND			( OF_ITEM :ITEM )				return ITEM_TYPE;&lt;br /&gt;
  function  IS_PRESENT		( KEY :STRING; IN_OBJECT :ITEM )		return BOOLEAN;&lt;br /&gt;
  function  ITEM_BY_KEY		( KEY :STRING; IN_OBJECT :ITEM )		return ITEM;&lt;br /&gt;
  function  ITEM_VALUE		( OF_ITEM :ITEM )				return VALUE_DATA;&lt;br /&gt;
  function  NUMBER_OF_SUB_ITEMS	( IN_ITEM :ITEM )				return NATURAL;&lt;br /&gt;
  procedure FREE			( THE_ITEM :in out ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_ITEM	( OF_ARRAY :ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( KEY :STRING; ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_FIELD	( OF_OBJECT :ITEM );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  SYNTAX_ERROR, BAD_ITEM_TYPE, VALUE_NOT_FOUND	: exception;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
										pragma PAGE;&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :JSON.ITEM_TYPE);&lt;br /&gt;
  type ITEM			is access ITEM_DEFINITION;&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD;&lt;br /&gt;
  type OBJECT_FIELD_ACCESS		is access OBJECT_FIELD;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT;&lt;br /&gt;
  type LIST_OF_ITEMS		is access ITEM_LIST_ELEMENT;&lt;br /&gt;
&lt;br /&gt;
  type STRING_ACCESS		is access STRING;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :ITEM_TYPE)	is record&lt;br /&gt;
				  case KIND is&lt;br /&gt;
				  when  OBJECT_ITEM		=&amp;gt; FIELDS_LIST	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				  when  ARRAY_ITEM		=&amp;gt; ITEMS_LIST	: LIST_OF_ITEMS;&lt;br /&gt;
				  when  STRING_ITEM		=&amp;gt; STR_ACCESS	: STRING_ACCESS;&lt;br /&gt;
				  when  INTEGER_ITEM	=&amp;gt; INT_VAL	: INTEGER;&lt;br /&gt;
				  when  FLOAT_ITEM		=&amp;gt; FLOAT_VAL	: LONG_FLOAT;&lt;br /&gt;
				  when  BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	: BOOLEAN;&lt;br /&gt;
				  when  NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
				  end case;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD			is record&lt;br /&gt;
				  FIELD_KEY	: STRING_ACCESS;&lt;br /&gt;
				  FIELD_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT		is record&lt;br /&gt;
				  LIST_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: LIST_OF_ITEMS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The package body : [[JSON_bdy]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=97</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=97"/>
		<updated>2025-03-03T07:58:58Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight .k {&lt;br /&gt;
    color: blue;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=96</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=96"/>
		<updated>2025-03-03T07:56:04Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:13px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight .k {&lt;br /&gt;
    color: #6ab825;font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=95</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=95"/>
		<updated>2025-03-03T07:53:13Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:12px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight .k {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=Ada_83_examples&amp;diff=94</id>
		<title>Ada 83 examples</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=Ada_83_examples&amp;diff=94"/>
		<updated>2025-03-03T07:52:44Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Examples ==&lt;br /&gt;
&lt;br /&gt;
The simplest program :&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
          -----------&lt;br /&gt;
procedure HELLO_WORLD&lt;br /&gt;
is        -----------&lt;br /&gt;
begin&lt;br /&gt;
  TEXT_IO.PUT_LINE( &amp;quot;Hello_world !&amp;quot; );&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A simple ASCII JSON reader/writer program :&lt;br /&gt;
[[JSON package]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=93</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=93"/>
		<updated>2025-03-03T07:50:52Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Noto Mono&#039;;&lt;br /&gt;
    font-size:10px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight .k {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=87</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=87"/>
		<updated>2025-03-02T16:26:24Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    font-size:12px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight pre .k {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=86</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=86"/>
		<updated>2025-03-02T15:35:28Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    font-size:12px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
/* Make Ada keywords bold */&lt;br /&gt;
.mw-highlight pre code {&lt;br /&gt;
    font-weight: normal; /* Ensures base text is normal */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight pre .kw {&lt;br /&gt;
    font-weight: bold !important; /* Try if GeSHi assigns &#039;kw&#039; class */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Apply bold to all uppercase words (Ada keywords are often uppercase) */&lt;br /&gt;
.mw-highlight pre code {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight pre code:before, &lt;br /&gt;
.mw-highlight pre code:after {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Alternative: Apply bold to common Ada keywords if no class is assigned */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight pre:before, .mw-highlight pre:after {&lt;br /&gt;
    content: &amp;quot;&amp;quot;;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Target specific Ada keywords manually */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight pre:before, .mw-highlight pre:after {&lt;br /&gt;
    content: &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-highlight pre:before {&lt;br /&gt;
    content: &amp;quot;procedure function package begin end is declare loop if then else elsif case when while for use type renames return record &amp;quot;;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=85</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=85"/>
		<updated>2025-03-02T15:26:42Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    font-size:12px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .kwd {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight pre:before {&lt;br /&gt;
    content: &amp;quot;with procedure function package begin end is declare loop if then else elsif case when while for use type renames return record &amp;quot;;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=84</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=84"/>
		<updated>2025-03-02T15:21:20Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    font-size:12px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .kwd {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=83</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=83"/>
		<updated>2025-03-02T15:19:32Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:12;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    font-size:11px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .kwd {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=82</id>
		<title>JSON package</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=82"/>
		<updated>2025-03-02T15:19:14Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
						----&lt;br /&gt;
			package			JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
  type ITEM		is private;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_TYPE		is ( OBJECT_ITEM, ARRAY_ITEM,&lt;br /&gt;
			     STRING_ITEM, INTEGER_ITEM, FLOAT_ITEM, BOOLEAN_ITEM, NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  subtype TERMINAL_TYPE	is ITEM_TYPE range STRING_ITEM .. NULL_ITEM;&lt;br /&gt;
&lt;br /&gt;
  subtype FILE_TYPE		is TEXT_IO.FILE_TYPE;&lt;br /&gt;
&lt;br /&gt;
  MAX_STRING_LENGTH		:constant NATURAL	:= 2**15-1;&lt;br /&gt;
  subtype STRING_LENGTH	is NATURAL range 0 .. MAX_STRING_LENGTH;&lt;br /&gt;
&lt;br /&gt;
  type VALUE_DATA (KIND :TERMINAL_TYPE := NULL_ITEM; LENGTH :STRING_LENGTH := 0)&lt;br /&gt;
			is record&lt;br /&gt;
			  case  KIND&lt;br /&gt;
			  is&lt;br /&gt;
			    when STRING_ITEM	=&amp;gt; STRING_VAL	:STRING( 1 .. LENGTH );&lt;br /&gt;
			    when INTEGER_ITEM	=&amp;gt; INT_VAL	:INTEGER;&lt;br /&gt;
			    when FLOAT_ITEM		=&amp;gt; FLOAT_VAL	:LONG_FLOAT;&lt;br /&gt;
			    when BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	:BOOLEAN;&lt;br /&gt;
			    when NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I / O&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  procedure GET			( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM );&lt;br /&gt;
  procedure PUT			( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM );&lt;br /&gt;
  function  STRING_OF		( THE_ITEM :ITEM)				return STRING;&lt;br /&gt;
  function  ITEM_OF			( THE_STRING :STRING)			return ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  KIND			( OF_ITEM :ITEM )				return ITEM_TYPE;&lt;br /&gt;
  function  IS_PRESENT		( KEY :STRING; IN_OBJECT :ITEM )		return BOOLEAN;&lt;br /&gt;
  function  ITEM_BY_KEY		( KEY :STRING; IN_OBJECT :ITEM )		return ITEM;&lt;br /&gt;
  function  ITEM_VALUE		( OF_ITEM :ITEM )				return VALUE_DATA;&lt;br /&gt;
  function  NUMBER_OF_SUB_ITEMS	( IN_ITEM :ITEM )				return NATURAL;&lt;br /&gt;
  procedure FREE			( THE_ITEM :in out ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_ITEM	( OF_ARRAY :ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( KEY :STRING; ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_FIELD	( OF_OBJECT :ITEM );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  SYNTAX_ERROR, BAD_ITEM_TYPE, VALUE_NOT_FOUND	: exception;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
										pragma PAGE;&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :JSON.ITEM_TYPE);&lt;br /&gt;
  type ITEM			is access ITEM_DEFINITION;&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD;&lt;br /&gt;
  type OBJECT_FIELD_ACCESS		is access OBJECT_FIELD;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT;&lt;br /&gt;
  type LIST_OF_ITEMS		is access ITEM_LIST_ELEMENT;&lt;br /&gt;
&lt;br /&gt;
  type STRING_ACCESS		is access STRING;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :ITEM_TYPE)	is record&lt;br /&gt;
				  case KIND is&lt;br /&gt;
				  when  OBJECT_ITEM		=&amp;gt; FIELDS_LIST	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				  when  ARRAY_ITEM		=&amp;gt; ITEMS_LIST	: LIST_OF_ITEMS;&lt;br /&gt;
				  when  STRING_ITEM		=&amp;gt; STR_ACCESS	: STRING_ACCESS;&lt;br /&gt;
				  when  INTEGER_ITEM	=&amp;gt; INT_VAL	: INTEGER;&lt;br /&gt;
				  when  FLOAT_ITEM		=&amp;gt; FLOAT_VAL	: LONG_FLOAT;&lt;br /&gt;
				  when  BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	: BOOLEAN;&lt;br /&gt;
				  when  NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
				  end case;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD			is record&lt;br /&gt;
				  FIELD_KEY	: STRING_ACCESS;&lt;br /&gt;
				  FIELD_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT		is record&lt;br /&gt;
				  LIST_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: LIST_OF_ITEMS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The package body :&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
--	JSON.ADB	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with UNCHECKED_DEALLOCATION, DIRECT_IO;&lt;br /&gt;
&lt;br /&gt;
						----&lt;br /&gt;
			package body		JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
  DEBUG		: BOOLEAN		:= FALSE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		GET		( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM )&lt;br /&gt;
  			---&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
&lt;br /&gt;
		------&lt;br /&gt;
  package		PARSER&lt;br /&gt;
		------&lt;br /&gt;
  is&lt;br /&gt;
&lt;br /&gt;
    function  READ_OBJECT		return JSON.ITEM;&lt;br /&gt;
&lt;br /&gt;
	------&lt;br /&gt;
  end	PARSER;&lt;br /&gt;
	------&lt;br /&gt;
&lt;br /&gt;
  package body				PARSER&lt;br /&gt;
					------&lt;br /&gt;
  is&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    type TOKEN_TYPE		is ( END_TOKEN, LEFT_ACCOLADE, RIGHT_ACCOLADE, LEFT_CROCHET, RIGHT_CROCHET,&lt;br /&gt;
			     COMMA, COLON, CHAINE, ENTIER, FLOTTANT );&lt;br /&gt;
&lt;br /&gt;
    type TOKEN (KIND :TOKEN_TYPE := END_TOKEN)	is record&lt;br /&gt;
			  case KIND is&lt;br /&gt;
			  when CHAINE	=&amp;gt; STR_LENGTH	: NATURAL;&lt;br /&gt;
			  when ENTIER	=&amp;gt; INT_VALUE	: INTEGER;&lt;br /&gt;
			  when FLOTTANT	=&amp;gt; FLOAT_VALUE	: LONG_FLOAT;&lt;br /&gt;
			  when others	=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
    TOKEN_BUFFER		: STRING( 1 .. 512 );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--------------------&lt;br /&gt;
  procedure		PROCESS_SYNTAX_ERROR		( ENCOUNTERED, EXPECTED : TOKEN_TYPE := END_TOKEN )&lt;br /&gt;
  			--------------------&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
  begin&lt;br /&gt;
    PUT( &amp;quot;syntax error ! (&amp;quot; &amp;amp; COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) )&lt;br /&gt;
		  &amp;amp; &#039;:&#039; &amp;amp; COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 ) &amp;amp; &amp;quot;) : &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    if  ENCOUNTERED = END_TOKEN  and  EXPECTED = END_TOKEN&lt;br /&gt;
    then&lt;br /&gt;
      PUT_LINE( &amp;quot;unexpected end of file &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      if  EXPECTED /= END_TOKEN&lt;br /&gt;
      then&lt;br /&gt;
        PUT( &amp;quot;expected &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( EXPECTED ) );&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
      if  ENCOUNTERED /= END_TOKEN&lt;br /&gt;
      then&lt;br /&gt;
        PUT_LINE( &amp;quot; encountered &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( ENCOUNTERED ) );&lt;br /&gt;
      else&lt;br /&gt;
        NEW_LINE;&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	PROCESS_SYNTAX_ERROR;&lt;br /&gt;
	--------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		GET			( THE_TOKEN :out TOKEN )&lt;br /&gt;
			---&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
    C	: CHARACTER;&lt;br /&gt;
  begin&lt;br /&gt;
    THE_TOKEN := ( KIND=&amp;gt; END_TOKEN );&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
			SKIP_BLANKS:&lt;br /&gt;
    loop&lt;br /&gt;
      if  END_OF_FILE( FILE )  then  return;  end if;&lt;br /&gt;
      GET( FILE, C );&lt;br /&gt;
      exit when  not (C = &#039; &#039;  or  C = ASCII.HT);&lt;br /&gt;
      if  END_OF_FILE( FILE )  then  return;  end if;&lt;br /&gt;
&lt;br /&gt;
    end loop	SKIP_BLANKS;&lt;br /&gt;
		-----------&lt;br /&gt;
&lt;br /&gt;
    if  DEBUG&lt;br /&gt;
    then&lt;br /&gt;
      PUT( C &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
	   &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL(FILE )-1 ) &amp;amp; &#039;.&#039; );&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    case  C  is&lt;br /&gt;
&lt;br /&gt;
      when  &#039;{&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; LEFT_ACCOLADE  );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;}&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; RIGHT_ACCOLADE );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;[&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; LEFT_CROCHET   );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;]&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; RIGHT_CROCHET  );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;,&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; COMMA );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;:&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; COLON );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;&amp;quot;&#039;&lt;br /&gt;
	  =&amp;gt;		------------&lt;br /&gt;
			GET_A_STRING:&lt;br /&gt;
        declare&lt;br /&gt;
	LEN		: NATURAL		:= 0;&lt;br /&gt;
	INDEX_BUFFER	: POSITIVE	:= 1;&lt;br /&gt;
        begin&lt;br /&gt;
	loop&lt;br /&gt;
	  GET( FILE, C );&lt;br /&gt;
&lt;br /&gt;
	  if  DEBUG&lt;br /&gt;
	  then&lt;br /&gt;
	    PUT( C &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
		 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 ) &amp;amp; &#039;.&#039; );&lt;br /&gt;
	  end if;&lt;br /&gt;
&lt;br /&gt;
            exit when  C = &#039;&amp;quot;&#039;;&lt;br /&gt;
	  TOKEN_BUFFER( INDEX_BUFFER ) := C;&lt;br /&gt;
	  LEN := LEN + 1;&lt;br /&gt;
	  INDEX_BUFFER := INDEX_BUFFER + 1;&lt;br /&gt;
	end loop;&lt;br /&gt;
	THE_TOKEN := ( KIND=&amp;gt; CHAINE, STR_LENGTH=&amp;gt; LEN );&lt;br /&gt;
&lt;br /&gt;
        end	GET_A_STRING;&lt;br /&gt;
		------------&lt;br /&gt;
&lt;br /&gt;
      when  others&lt;br /&gt;
	  =&amp;gt; raise SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end case;&lt;br /&gt;
&lt;br /&gt;
    if  DEBUG&lt;br /&gt;
    then&lt;br /&gt;
      PUT( &amp;quot;token &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( THE_TOKEN.KIND ) &amp;amp; &amp;quot; at&amp;quot;&lt;br /&gt;
	 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
	 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 )&lt;br /&gt;
         );&lt;br /&gt;
      if THE_TOKEN.KIND = CHAINE&lt;br /&gt;
      then  PUT_LINE( &amp;quot;  &amp;quot; &amp;amp; &#039;&amp;quot;&#039; &amp;amp; TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH ) &amp;amp; &#039;&amp;quot;&#039; );&lt;br /&gt;
      else  NEW_LINE;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
  exception&lt;br /&gt;
    when END_ERROR | SYNTAX_ERROR =&amp;gt; PROCESS_SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	GET;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  procedure		GET_VERIFY	( WHAT_IS_EXPECTED :TOKEN_TYPE; THE_TOKEN :out TOKEN )&lt;br /&gt;
			----------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    GET( THE_TOKEN );&lt;br /&gt;
    if  THE_TOKEN.KIND /= WHAT_IS_EXPECTED&lt;br /&gt;
    then&lt;br /&gt;
      PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; WHAT_IS_EXPECTED );&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
  end	GET_VERIFY;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  GET_OBJECT	return JSON.ITEM;&lt;br /&gt;
  function  GET_ARRAY	return JSON.ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--------&lt;br /&gt;
  function		GET_ITEM		( THE_TOKEN :TOKEN )	return JSON.ITEM&lt;br /&gt;
			--------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
&lt;br /&gt;
    case  THE_TOKEN.KIND  is&lt;br /&gt;
&lt;br /&gt;
      when  LEFT_ACCOLADE&lt;br /&gt;
	  =&amp;gt; return GET_OBJECT;&lt;br /&gt;
&lt;br /&gt;
      when  LEFT_CROCHET&lt;br /&gt;
	  =&amp;gt; return GET_ARRAY;&lt;br /&gt;
&lt;br /&gt;
      when  CHAINE&lt;br /&gt;
 	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; STRING_ITEM,&lt;br /&gt;
				    STR_ACCESS=&amp;gt; new STRING&#039;(TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH )) );&lt;br /&gt;
&lt;br /&gt;
      when  ENTIER&lt;br /&gt;
	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; INTEGER_ITEM, INT_VAL=&amp;gt; THE_TOKEN.INT_VALUE );&lt;br /&gt;
&lt;br /&gt;
      when  FLOTTANT&lt;br /&gt;
	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; FLOAT_ITEM, FLOAT_VAL=&amp;gt; THE_TOKEN.FLOAT_VALUE );&lt;br /&gt;
&lt;br /&gt;
      when  others&lt;br /&gt;
	  =&amp;gt; raise SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end case;&lt;br /&gt;
&lt;br /&gt;
  exception&lt;br /&gt;
    when SYNTAX_ERROR&lt;br /&gt;
         =&amp;gt; PROCESS_SYNTAX_ERROR( THE_TOKEN.KIND );&lt;br /&gt;
	  raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	GET_ITEM;&lt;br /&gt;
	--------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
    function		GET_OBJECT		return JSON.ITEM&lt;br /&gt;
			----------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN		: TOKEN;&lt;br /&gt;
      FIELDS_LIST_HEAD,&lt;br /&gt;
      FIELDS_LIST_LAST	: OBJECT_FIELD_ACCESS	:= null;&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = RIGHT_ACCOLADE  then  return new ITEM_DEFINITION&#039;( OBJECT_ITEM, null );  end if;&lt;br /&gt;
      if  THE_TOKEN.KIND /= CHAINE  then  PROCESS_SYNTAX_ERROR;  end if;&lt;br /&gt;
&lt;br /&gt;
      loop&lt;br /&gt;
&lt;br /&gt;
        declare&lt;br /&gt;
	KEY	: STRING_ACCESS		:= new STRING&#039;(TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH ));&lt;br /&gt;
	OFA	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
        begin&lt;br /&gt;
	GET_VERIFY( COLON, THE_TOKEN );&lt;br /&gt;
	GET( THE_TOKEN );&lt;br /&gt;
	OFA := new OBJECT_FIELD&#039;( KEY, GET_ITEM( THE_TOKEN ), null );&lt;br /&gt;
&lt;br /&gt;
	if  FIELDS_LIST_HEAD = null  then&lt;br /&gt;
	  FIELDS_LIST_HEAD := OFA; FIELDS_LIST_LAST := OFA;&lt;br /&gt;
	else&lt;br /&gt;
	  FIELDS_LIST_LAST.all.NEXT := OFA; FIELDS_LIST_LAST := OFA;&lt;br /&gt;
	end if;&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        GET( THE_TOKEN );&lt;br /&gt;
        if  THE_TOKEN.KIND = COMMA&lt;br /&gt;
        then&lt;br /&gt;
	GET_VERIFY( CHAINE, THE_TOKEN );&lt;br /&gt;
        else&lt;br /&gt;
	if  THE_TOKEN.KIND /= RIGHT_ACCOLADE&lt;br /&gt;
	then&lt;br /&gt;
	  PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; RIGHT_ACCOLADE );&lt;br /&gt;
	end if;&lt;br /&gt;
	exit;&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
      end loop;&lt;br /&gt;
&lt;br /&gt;
      return new ITEM_DEFINITION&#039;( OBJECT_ITEM, FIELDS_LIST_HEAD );&lt;br /&gt;
&lt;br /&gt;
    end	GET_OBJECT;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---------&lt;br /&gt;
    function		GET_ARRAY			return JSON.ITEM&lt;br /&gt;
			---------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN		: TOKEN;&lt;br /&gt;
      STRUC_LIST_HEAD,&lt;br /&gt;
      STRUC_LIST_LAST	: LIST_OF_ITEMS	:= null;&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = RIGHT_CROCHET  then  return new ITEM_DEFINITION&#039;( ARRAY_ITEM, null );  end if;&lt;br /&gt;
&lt;br /&gt;
			-------------&lt;br /&gt;
			PROCESS_ITEMS:&lt;br /&gt;
      loop&lt;br /&gt;
&lt;br /&gt;
        declare&lt;br /&gt;
	LOI	: LIST_OF_ITEMS	:= new ITEM_LIST_ELEMENT&#039;( GET_ITEM( THE_TOKEN ), null );&lt;br /&gt;
        begin&lt;br /&gt;
	if  STRUC_LIST_HEAD = null  then&lt;br /&gt;
	  STRUC_LIST_HEAD := LOI; STRUC_LIST_LAST := LOI;&lt;br /&gt;
	else&lt;br /&gt;
	  STRUC_LIST_LAST.all.NEXT := LOI; STRUC_LIST_LAST := LOI;&lt;br /&gt;
	end if;&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        GET( THE_TOKEN );&lt;br /&gt;
        if  THE_TOKEN.KIND = COMMA&lt;br /&gt;
        then&lt;br /&gt;
	GET( THE_TOKEN );&lt;br /&gt;
        else&lt;br /&gt;
	if  THE_TOKEN.KIND = RIGHT_CROCHET&lt;br /&gt;
	then  exit PROCESS_ITEMS;&lt;br /&gt;
	else  PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; RIGHT_CROCHET );&lt;br /&gt;
	end if;&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
      end loop	PROCESS_ITEMS;&lt;br /&gt;
		-------------&lt;br /&gt;
&lt;br /&gt;
      return new ITEM_DEFINITION&#039;( ARRAY_ITEM, STRUC_LIST_HEAD );&lt;br /&gt;
&lt;br /&gt;
    end	GET_ARRAY;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
    function		READ_OBJECT		return JSON.ITEM&lt;br /&gt;
  			-----------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN	: TOKEN;&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = LEFT_ACCOLADE  then&lt;br /&gt;
        return GET_OBJECT;&lt;br /&gt;
      else  raise SYNTAX_ERROR;&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
    exception&lt;br /&gt;
      when SYNTAX_ERROR&lt;br /&gt;
	  =&amp;gt; PROCESS_SYNTAX_ERROR;&lt;br /&gt;
	     raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end	READ_OBJECT;&lt;br /&gt;
	-----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		------&lt;br /&gt;
  end		PARSER;&lt;br /&gt;
		------&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    THE_ITEM := PARSER.READ_OBJECT;&lt;br /&gt;
&lt;br /&gt;
  end	GET;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		PUT		( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM )&lt;br /&gt;
			---&lt;br /&gt;
  is&lt;br /&gt;
			  -------&lt;br /&gt;
    procedure		  LAY_ONE		( ITEM :JSON.ITEM; AT_COL :TEXT_IO.COUNT )&lt;br /&gt;
			  -------&lt;br /&gt;
    is&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
			    -----------------&lt;br /&gt;
      procedure		    PUT_OBJECT_FIELDS	( OF_OBJECT :JSON.ITEM )&lt;br /&gt;
			    -----------------&lt;br /&gt;
      is&lt;br /&gt;
			      -----------------&lt;br /&gt;
        procedure		      PROCESS_ONE_FIELD	( KEY	     :STRING;&lt;br /&gt;
						  ITEM	     :in out JSON.ITEM;&lt;br /&gt;
						  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
						  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
			      -----------------&lt;br /&gt;
        is&lt;br /&gt;
        begin&lt;br /&gt;
	SET_COL( AT_COL+2 );&lt;br /&gt;
	PUT( &#039;&amp;quot;&#039; &amp;amp; KEY &amp;amp; &#039;&amp;quot;&#039; &amp;amp; &amp;quot; : &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	LAY_ONE( ITEM, TEXT_IO.COL );&lt;br /&gt;
&lt;br /&gt;
	if  not LAST_ONE  then  PUT( &#039;,&#039; );  end if; NEW_LINE;&lt;br /&gt;
	STOP_PROCESS := FALSE;&lt;br /&gt;
&lt;br /&gt;
        end	  PROCESS_ONE_FIELD;&lt;br /&gt;
		  -----------------&lt;br /&gt;
&lt;br /&gt;
        procedure PUT_FOR_EACH_FIELD is new FOR_EACH_JSON_FIELD( PROCESS_ONE_FIELD );&lt;br /&gt;
&lt;br /&gt;
      begin&lt;br /&gt;
	PUT_FOR_EACH_FIELD( OF_OBJECT );&lt;br /&gt;
&lt;br /&gt;
      end	PUT_OBJECT_FIELDS;&lt;br /&gt;
	-----------------&lt;br /&gt;
&lt;br /&gt;
			    ---------------&lt;br /&gt;
      procedure		    PUT_ARRAY_ITEMS	(THE_ITEM :JSON.ITEM )&lt;br /&gt;
			    ---------------&lt;br /&gt;
      is&lt;br /&gt;
        START_COL	: TEXT_IO.COUNT	:= TEXT_IO.COL;&lt;br /&gt;
&lt;br /&gt;
			      ----------------&lt;br /&gt;
	procedure		      PROCESS_ONE_ITEM	( ITEM	     :in out JSON.ITEM;&lt;br /&gt;
						  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
						  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
			      ----------------&lt;br /&gt;
	is&lt;br /&gt;
	begin&lt;br /&gt;
	  NEW_LINE;&lt;br /&gt;
&lt;br /&gt;
	  LAY_ONE( ITEM, START_COL+2 );&lt;br /&gt;
&lt;br /&gt;
	  if  not LAST_ONE  then  PUT( &#039;,&#039; );  end if;&lt;br /&gt;
	  STOP_PROCESS := FALSE;&lt;br /&gt;
&lt;br /&gt;
	end	    PROCESS_ONE_ITEM;&lt;br /&gt;
		    ----------------&lt;br /&gt;
&lt;br /&gt;
	procedure PUT_FOR_EACH_ITEM is new FOR_EACH_JSON_ITEM( PROCESS_ONE_ITEM );&lt;br /&gt;
&lt;br /&gt;
      begin&lt;br /&gt;
        PUT_FOR_EACH_ITEM( ITEM );&lt;br /&gt;
&lt;br /&gt;
      end	PUT_ARRAY_ITEMS;&lt;br /&gt;
	---------------&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      SET_COL( AT_COL );&lt;br /&gt;
&lt;br /&gt;
      case KIND( ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;{&#039; );&lt;br /&gt;
	 PUT_OBJECT_FIELDS( ITEM );&lt;br /&gt;
	 SET_COL( AT_COL+1 );&lt;br /&gt;
	 PUT( &#039;}&#039; );&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;[&#039; );&lt;br /&gt;
	 PUT_ARRAY_ITEMS( ITEM );&lt;br /&gt;
	 SET_COL( AT_COL+1 );&lt;br /&gt;
	 PUT( &#039;]&#039; );&lt;br /&gt;
&lt;br /&gt;
      when STRING_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;&amp;quot;&#039; &amp;amp; ITEM.all.STR_ACCESS.all &amp;amp; &#039;&amp;quot;&#039; );&lt;br /&gt;
&lt;br /&gt;
      when INTEGER_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( INTEGER&#039;IMAGE( ITEM.all.INT_VAL ) );&lt;br /&gt;
&lt;br /&gt;
      when FLOAT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 declare&lt;br /&gt;
	  package LONG_FLOAT_IO	is new FLOAT_IO( LONG_FLOAT );&lt;br /&gt;
	  begin&lt;br /&gt;
	    LONG_FLOAT_IO.PUT( ITEM.all.FLOAT_VAL );&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when BOOLEAN_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( BOOLEAN&#039;IMAGE( ITEM.all.BOOL_VAL ) );&lt;br /&gt;
&lt;br /&gt;
      when NULL_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &amp;quot;null&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
    end	  LAY_ONE;&lt;br /&gt;
	  -------&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    TEXT_IO.SET_OUTPUT( FILE );&lt;br /&gt;
    LAY_ONE( THE_ITEM, AT_COL=&amp;gt; 1 );&lt;br /&gt;
    TEXT_IO.SET_OUTPUT( TEXT_IO.STANDARD_OUTPUT );&lt;br /&gt;
&lt;br /&gt;
  end	PUT;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---------&lt;br /&gt;
  function		STRING_OF		( THE_ITEM : ITEM)			return STRING&lt;br /&gt;
			---------&lt;br /&gt;
  is&lt;br /&gt;
    TEMP_FILE_NAME	:constant STRING	:= &amp;quot;JSON$$$.tmp&amp;quot;;&lt;br /&gt;
  begin&lt;br /&gt;
		------------------&lt;br /&gt;
		WRITE_ITEM_TO_FILE:&lt;br /&gt;
    declare&lt;br /&gt;
      TEMP_FILE	: TEXT_IO.FILE_TYPE;&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
    begin&lt;br /&gt;
      CREATE( TEMP_FILE, OUT_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      JSON.PUT( TEMP_FILE, THE_ITEM );&lt;br /&gt;
      CLOSE( TEMP_FILE );&lt;br /&gt;
&lt;br /&gt;
    end	WRITE_ITEM_TO_FILE;&lt;br /&gt;
	------------------&lt;br /&gt;
&lt;br /&gt;
		-------------------&lt;br /&gt;
		READ_FILE_TO_STRING:&lt;br /&gt;
    declare&lt;br /&gt;
      package CHAR_IO is new DIRECT_IO( CHARACTER );&lt;br /&gt;
      use CHAR_IO;&lt;br /&gt;
      TEMP_FILE	: CHAR_IO.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      CHAR_IO.OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      declare&lt;br /&gt;
        ITEM_STRING_LENGTH	:constant INTEGER	:= INTEGER( CHAR_IO.SIZE( TEMP_FILE ) );&lt;br /&gt;
        ITEM_STRING		: STRING( 1 .. ITEM_STRING_LENGTH );&lt;br /&gt;
      begin&lt;br /&gt;
        for I in ITEM_STRING&#039;RANGE loop&lt;br /&gt;
	READ( TEMP_FILE, ITEM_STRING( I ) );&lt;br /&gt;
        end loop;&lt;br /&gt;
        DELETE( TEMP_FILE );&lt;br /&gt;
        return  ITEM_STRING;&lt;br /&gt;
      end;&lt;br /&gt;
&lt;br /&gt;
    end	READ_FILE_TO_STRING;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
  end	STRING_OF;&lt;br /&gt;
	---------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------&lt;br /&gt;
  function		ITEM_OF		( THE_STRING :STRING)		return ITEM&lt;br /&gt;
  			-------&lt;br /&gt;
  is&lt;br /&gt;
    TEMP_FILE_NAME	:constant STRING	:= &amp;quot;JSON$$$.tmp&amp;quot;;&lt;br /&gt;
    OUT_ITEM	: ITEM;&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    declare&lt;br /&gt;
      package CHAR_IO is new DIRECT_IO( CHARACTER );&lt;br /&gt;
      use CHAR_IO;&lt;br /&gt;
      TEMP_FILE	: CHAR_IO.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      CREATE( TEMP_FILE, OUT_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      for I in THE_STRING&#039;RANGE loop&lt;br /&gt;
        WRITE( TEMP_FILE, THE_STRING( I ) );&lt;br /&gt;
      end loop;&lt;br /&gt;
      CLOSE( TEMP_FILE );&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
      TEMP_FILE	: JSON.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      TEXT_IO.OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      JSON.GET( TEMP_FILE, OUT_ITEM );&lt;br /&gt;
      OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      DELETE( TEMP_FILE );&lt;br /&gt;
    end;&lt;br /&gt;
    return  OUT_ITEM;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_OF;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--  J S O N   S T R U C T U R E   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----&lt;br /&gt;
  function 		KIND		( OF_ITEM :ITEM )		return ITEM_TYPE&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    return  OF_ITEM.all.KIND;&lt;br /&gt;
&lt;br /&gt;
  end	KIND;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  function 		IS_PRESENT	( KEY :STRING; IN_OBJECT :ITEM )	return BOOLEAN&lt;br /&gt;
  			----------&lt;br /&gt;
  is&lt;br /&gt;
    SEARCH_KEY	: STRING		renames KEY;&lt;br /&gt;
    KEY_SEEN	: BOOLEAN		:= FALSE;&lt;br /&gt;
&lt;br /&gt;
		-------&lt;br /&gt;
    procedure	PROCESS	( THE_KEY	     :STRING;&lt;br /&gt;
			  THE_ITEM     :in out ITEM;&lt;br /&gt;
			  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
			  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
    is		-------&lt;br /&gt;
    begin&lt;br /&gt;
      if  THE_KEY = SEARCH_KEY  then  KEY_SEEN := TRUE;  end if;&lt;br /&gt;
      STOP_PROCESS := KEY_SEEN;&lt;br /&gt;
&lt;br /&gt;
    end	PROCESS;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
    procedure SCAN is new FOR_EACH_JSON_FIELD( PROCESS );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    if  IN_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    SCAN( IN_OBJECT );&lt;br /&gt;
    return  KEY_SEEN;&lt;br /&gt;
&lt;br /&gt;
  end	IS_PRESENT;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
  function		ITEM_BY_KEY	( KEY :STRING; IN_OBJECT :ITEM )	return ITEM&lt;br /&gt;
			-----------&lt;br /&gt;
  is&lt;br /&gt;
    SEARCH_KEY		: STRING		renames KEY;&lt;br /&gt;
    FOUND_ITEM		: ITEM		:= null;&lt;br /&gt;
&lt;br /&gt;
		-------&lt;br /&gt;
    procedure	PROCESS	( THE_KEY	     :STRING;&lt;br /&gt;
			  THE_ITEM     :in out ITEM;&lt;br /&gt;
			  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
			  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
    is		-------&lt;br /&gt;
    begin&lt;br /&gt;
      if  THE_KEY = SEARCH_KEY  then  FOUND_ITEM := THE_ITEM;  end if;&lt;br /&gt;
      STOP_PROCESS := (FOUND_ITEM /= null);&lt;br /&gt;
&lt;br /&gt;
    end	PROCESS;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
    procedure SCAN is new FOR_EACH_JSON_FIELD( PROCESS );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    if  IN_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    SCAN( IN_OBJECT );&lt;br /&gt;
    if  FOUND_ITEM = null  then  raise VALUE_NOT_FOUND;  end if;&lt;br /&gt;
    return  FOUND_ITEM;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_BY_KEY;&lt;br /&gt;
	------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  function		ITEM_VALUE		( OF_ITEM :ITEM )		return VALUE_DATA&lt;br /&gt;
			----------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    case KIND( OF_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM | ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  raise BAD_ITEM_TYPE;&lt;br /&gt;
&lt;br /&gt;
      when STRING_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_STRING	: STRING	renames	OF_ITEM.all.STR_ACCESS.all;&lt;br /&gt;
	    STRING_LENGTH	:constant NATURAL	:= THE_STRING&#039;LENGTH;&lt;br /&gt;
	  begin&lt;br /&gt;
	    return ( STRING_ITEM, STRING_LENGTH, THE_STRING );&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when INTEGER_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( INTEGER_ITEM, 0, OF_ITEM.all.INT_VAL );&lt;br /&gt;
&lt;br /&gt;
      when FLOAT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( FLOAT_ITEM, 0, OF_ITEM.all.FLOAT_VAL );&lt;br /&gt;
&lt;br /&gt;
      when BOOLEAN_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( BOOLEAN_ITEM, 0, OF_ITEM.all.BOOL_VAL );&lt;br /&gt;
&lt;br /&gt;
      when NULL_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( NULL_ITEM, 0 );&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_VALUE;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------------------&lt;br /&gt;
  function		NUMBER_OF_SUB_ITEMS		( IN_ITEM :ITEM )		return NATURAL&lt;br /&gt;
			-------------------&lt;br /&gt;
  is&lt;br /&gt;
    COUNT		: NATURAL	:= 0;&lt;br /&gt;
  begin&lt;br /&gt;
     case KIND( IN_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: OBJECT_FIELD_ACCESS	:= IN_ITEM.all.FIELDS_LIST;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      COUNT := COUNT + 1;&lt;br /&gt;
	      THE_LIST := THE_LIST.all.NEXT;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: LIST_OF_ITEMS	:= IN_ITEM.all.ITEMS_LIST;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      COUNT := COUNT + 1;&lt;br /&gt;
	      THE_LIST := THE_LIST.all.NEXT;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when others =&amp;gt; null;&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
      return COUNT;&lt;br /&gt;
&lt;br /&gt;
  end	NUMBER_OF_SUB_ITEMS;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----&lt;br /&gt;
  procedure		FREE			( THE_ITEM :in out ITEM )&lt;br /&gt;
			----&lt;br /&gt;
  is&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( ITEM_DEFINITION, ITEM );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( OBJECT_FIELD, OBJECT_FIELD_ACCESS );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( ITEM_LIST_ELEMENT, LIST_OF_ITEMS );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( STRING, STRING_ACCESS );&lt;br /&gt;
  begin&lt;br /&gt;
     case KIND( THE_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: OBJECT_FIELD_ACCESS	:= THE_ITEM.all.FIELDS_LIST;&lt;br /&gt;
	    SUITE		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      FREE( THE_LIST.all.FIELD_KEY );&lt;br /&gt;
	      FREE( THE_LIST.all.FIELD_ITEM );&lt;br /&gt;
	      SUITE := THE_LIST.all.NEXT;&lt;br /&gt;
	      FREE( THE_LIST );&lt;br /&gt;
	      THE_LIST := SUITE;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: LIST_OF_ITEMS	:= THE_ITEM.all.ITEMS_LIST;&lt;br /&gt;
	    SUITE		: LIST_OF_ITEMS;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      FREE( THE_LIST.all.LIST_ITEM );&lt;br /&gt;
	      SUITE := THE_LIST.all.NEXT;&lt;br /&gt;
	      FREE( THE_LIST );&lt;br /&gt;
	      THE_LIST := SUITE;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when others =&amp;gt; null;&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
      THE_ITEM.all := ( KIND=&amp;gt; NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  end	FREE;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			------------------&lt;br /&gt;
  procedure		FOR_EACH_JSON_ITEM		( OF_ARRAY :JSON.ITEM )&lt;br /&gt;
			------------------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    if  OF_ARRAY = null  or else  OF_ARRAY.all.KIND /= ARRAY_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      STOP_PROCESS		: BOOLEAN;&lt;br /&gt;
      ITEM_LIST		: LIST_OF_ITEMS	:= OF_ARRAY.all.ITEMS_LIST;&lt;br /&gt;
      LAST_ONE		: BOOLEAN;&lt;br /&gt;
    begin&lt;br /&gt;
      loop&lt;br /&gt;
        exit when  ITEM_LIST = null;&lt;br /&gt;
        LAST_ONE := (ITEM_LIST.all.NEXT = null);&lt;br /&gt;
        APPLY_PROCESS( ITEM_LIST.all.LIST_ITEM, LAST_ONE, STOP_PROCESS );&lt;br /&gt;
        exit when  STOP_PROCESS;&lt;br /&gt;
        ITEM_LIST := ITEM_LIST.all.NEXT;&lt;br /&gt;
      end loop;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
  end	FOR_EACH_JSON_ITEM;&lt;br /&gt;
	------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------------------&lt;br /&gt;
  procedure		FOR_EACH_JSON_FIELD		( OF_OBJECT :JSON.ITEM )&lt;br /&gt;
			-------------------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    if  OF_OBJECT = null  or else  OF_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      FIELDS		: OBJECT_FIELD_ACCESS	:= OF_OBJECT.all.FIELDS_LIST;&lt;br /&gt;
      STOP_PROCESS		: BOOLEAN;&lt;br /&gt;
      LAST_ONE		: BOOLEAN;&lt;br /&gt;
    begin&lt;br /&gt;
      while  FIELDS /= null  loop&lt;br /&gt;
        LAST_ONE := (FIELDS.all.NEXT = null);&lt;br /&gt;
        APPLY_PROCESS( FIELDS.all.FIELD_KEY.all, FIELDS.all.FIELD_ITEM, LAST_ONE, STOP_PROCESS );&lt;br /&gt;
        exit when  STOP_PROCESS;&lt;br /&gt;
        FIELDS := FIELDS.all.NEXT;&lt;br /&gt;
      end loop;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
  end	FOR_EACH_JSON_FIELD;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=81</id>
		<title>JSON package</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=81"/>
		<updated>2025-03-02T15:18:25Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
						----&lt;br /&gt;
			package			JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
  type ITEM		is private;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_TYPE		is ( OBJECT_ITEM, ARRAY_ITEM,&lt;br /&gt;
			     STRING_ITEM, INTEGER_ITEM, FLOAT_ITEM, BOOLEAN_ITEM, NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  subtype TERMINAL_TYPE	is ITEM_TYPE range STRING_ITEM .. NULL_ITEM;&lt;br /&gt;
&lt;br /&gt;
  subtype FILE_TYPE		is TEXT_IO.FILE_TYPE;&lt;br /&gt;
&lt;br /&gt;
  MAX_STRING_LENGTH		:constant NATURAL	:= 2**15-1;&lt;br /&gt;
  subtype STRING_LENGTH	is NATURAL range 0 .. MAX_STRING_LENGTH;&lt;br /&gt;
&lt;br /&gt;
  type VALUE_DATA (KIND :TERMINAL_TYPE := NULL_ITEM; LENGTH :STRING_LENGTH := 0)&lt;br /&gt;
			is record&lt;br /&gt;
			  case  KIND&lt;br /&gt;
			  is&lt;br /&gt;
			    when STRING_ITEM	=&amp;gt; STRING_VAL	:STRING( 1 .. LENGTH );&lt;br /&gt;
			    when INTEGER_ITEM	=&amp;gt; INT_VAL	:INTEGER;&lt;br /&gt;
			    when FLOAT_ITEM		=&amp;gt; FLOAT_VAL	:LONG_FLOAT;&lt;br /&gt;
			    when BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	:BOOLEAN;&lt;br /&gt;
			    when NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I / O&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  procedure GET			( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM );&lt;br /&gt;
  procedure PUT			( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM );&lt;br /&gt;
  function  STRING_OF		( THE_ITEM :ITEM)				return STRING;&lt;br /&gt;
  function  ITEM_OF			( THE_STRING :STRING)			return ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  KIND			( OF_ITEM :ITEM )				return ITEM_TYPE;&lt;br /&gt;
  function  IS_PRESENT		( KEY :STRING; IN_OBJECT :ITEM )		return BOOLEAN;&lt;br /&gt;
  function  ITEM_BY_KEY		( KEY :STRING; IN_OBJECT :ITEM )		return ITEM;&lt;br /&gt;
  function  ITEM_VALUE		( OF_ITEM :ITEM )				return VALUE_DATA;&lt;br /&gt;
  function  NUMBER_OF_SUB_ITEMS	( IN_ITEM :ITEM )				return NATURAL;&lt;br /&gt;
  procedure FREE			( THE_ITEM :in out ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_ITEM	( OF_ARRAY :ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( KEY :STRING; ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_FIELD	( OF_OBJECT :ITEM );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  SYNTAX_ERROR, BAD_ITEM_TYPE, VALUE_NOT_FOUND	: exception;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
										pragma PAGE;&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :JSON.ITEM_TYPE);&lt;br /&gt;
  type ITEM			is access ITEM_DEFINITION;&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD;&lt;br /&gt;
  type OBJECT_FIELD_ACCESS		is access OBJECT_FIELD;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT;&lt;br /&gt;
  type LIST_OF_ITEMS		is access ITEM_LIST_ELEMENT;&lt;br /&gt;
&lt;br /&gt;
  type STRING_ACCESS		is access STRING;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :ITEM_TYPE)	is record&lt;br /&gt;
				  case KIND is&lt;br /&gt;
				  when  OBJECT_ITEM		=&amp;gt; FIELDS_LIST	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				  when  ARRAY_ITEM		=&amp;gt; ITEMS_LIST	: LIST_OF_ITEMS;&lt;br /&gt;
				  when  STRING_ITEM		=&amp;gt; STR_ACCESS	: STRING_ACCESS;&lt;br /&gt;
				  when  INTEGER_ITEM	=&amp;gt; INT_VAL	: INTEGER;&lt;br /&gt;
				  when  FLOAT_ITEM		=&amp;gt; FLOAT_VAL	: LONG_FLOAT;&lt;br /&gt;
				  when  BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	: BOOLEAN;&lt;br /&gt;
				  when  NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
				  end case;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD			is record&lt;br /&gt;
				  FIELD_KEY	: STRING_ACCESS;&lt;br /&gt;
				  FIELD_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT		is record&lt;br /&gt;
				  LIST_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: LIST_OF_ITEMS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The package body :&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
--	JSON.ADB	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with UNCHECKED_DEALLOCATION, DIRECT_IO;&lt;br /&gt;
&lt;br /&gt;
						----&lt;br /&gt;
			package body		JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
  DEBUG		: BOOLEAN		:= FALSE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		GET		( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM )&lt;br /&gt;
  			---&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
&lt;br /&gt;
		------&lt;br /&gt;
  package		PARSER&lt;br /&gt;
		------&lt;br /&gt;
  is&lt;br /&gt;
&lt;br /&gt;
    function  READ_OBJECT		return JSON.ITEM;&lt;br /&gt;
&lt;br /&gt;
	------&lt;br /&gt;
  end	PARSER;&lt;br /&gt;
	------&lt;br /&gt;
&lt;br /&gt;
  package body				PARSER&lt;br /&gt;
					------&lt;br /&gt;
  is&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    type TOKEN_TYPE		is ( END_TOKEN, LEFT_ACCOLADE, RIGHT_ACCOLADE, LEFT_CROCHET, RIGHT_CROCHET,&lt;br /&gt;
			     COMMA, COLON, CHAINE, ENTIER, FLOTTANT );&lt;br /&gt;
&lt;br /&gt;
    type TOKEN (KIND :TOKEN_TYPE := END_TOKEN)	is record&lt;br /&gt;
			  case KIND is&lt;br /&gt;
			  when CHAINE	=&amp;gt; STR_LENGTH	: NATURAL;&lt;br /&gt;
			  when ENTIER	=&amp;gt; INT_VALUE	: INTEGER;&lt;br /&gt;
			  when FLOTTANT	=&amp;gt; FLOAT_VALUE	: LONG_FLOAT;&lt;br /&gt;
			  when others	=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
    TOKEN_BUFFER		: STRING( 1 .. 512 );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--------------------&lt;br /&gt;
  procedure		PROCESS_SYNTAX_ERROR		( ENCOUNTERED, EXPECTED : TOKEN_TYPE := END_TOKEN )&lt;br /&gt;
  			--------------------&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
  begin&lt;br /&gt;
    PUT( &amp;quot;syntax error ! (&amp;quot; &amp;amp; COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) )&lt;br /&gt;
		  &amp;amp; &#039;:&#039; &amp;amp; COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 ) &amp;amp; &amp;quot;) : &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    if  ENCOUNTERED = END_TOKEN  and  EXPECTED = END_TOKEN&lt;br /&gt;
    then&lt;br /&gt;
      PUT_LINE( &amp;quot;unexpected end of file &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      if  EXPECTED /= END_TOKEN&lt;br /&gt;
      then&lt;br /&gt;
        PUT( &amp;quot;expected &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( EXPECTED ) );&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
      if  ENCOUNTERED /= END_TOKEN&lt;br /&gt;
      then&lt;br /&gt;
        PUT_LINE( &amp;quot; encountered &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( ENCOUNTERED ) );&lt;br /&gt;
      else&lt;br /&gt;
        NEW_LINE;&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	PROCESS_SYNTAX_ERROR;&lt;br /&gt;
	--------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		GET			( THE_TOKEN :out TOKEN )&lt;br /&gt;
			---&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
    C	: CHARACTER;&lt;br /&gt;
  begin&lt;br /&gt;
    THE_TOKEN := ( KIND=&amp;gt; END_TOKEN );&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
			SKIP_BLANKS:&lt;br /&gt;
    loop&lt;br /&gt;
      if  END_OF_FILE( FILE )  then  return;  end if;&lt;br /&gt;
      GET( FILE, C );&lt;br /&gt;
      exit when  not (C = &#039; &#039;  or  C = ASCII.HT);&lt;br /&gt;
      if  END_OF_FILE( FILE )  then  return;  end if;&lt;br /&gt;
&lt;br /&gt;
    end loop	SKIP_BLANKS;&lt;br /&gt;
		-----------&lt;br /&gt;
&lt;br /&gt;
    if  DEBUG&lt;br /&gt;
    then&lt;br /&gt;
      PUT( C &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
	   &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL(FILE )-1 ) &amp;amp; &#039;.&#039; );&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    case  C  is&lt;br /&gt;
&lt;br /&gt;
      when  &#039;{&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; LEFT_ACCOLADE  );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;}&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; RIGHT_ACCOLADE );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;[&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; LEFT_CROCHET   );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;]&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; RIGHT_CROCHET  );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;,&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; COMMA );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;:&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; COLON );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;&amp;quot;&#039;&lt;br /&gt;
	  =&amp;gt;		------------&lt;br /&gt;
			GET_A_STRING:&lt;br /&gt;
        declare&lt;br /&gt;
	LEN		: NATURAL		:= 0;&lt;br /&gt;
	INDEX_BUFFER	: POSITIVE	:= 1;&lt;br /&gt;
        begin&lt;br /&gt;
	loop&lt;br /&gt;
	  GET( FILE, C );&lt;br /&gt;
&lt;br /&gt;
	  if  DEBUG&lt;br /&gt;
	  then&lt;br /&gt;
	    PUT( C &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
		 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 ) &amp;amp; &#039;.&#039; );&lt;br /&gt;
	  end if;&lt;br /&gt;
&lt;br /&gt;
            exit when  C = &#039;&amp;quot;&#039;;&lt;br /&gt;
	  TOKEN_BUFFER( INDEX_BUFFER ) := C;&lt;br /&gt;
	  LEN := LEN + 1;&lt;br /&gt;
	  INDEX_BUFFER := INDEX_BUFFER + 1;&lt;br /&gt;
	end loop;&lt;br /&gt;
	THE_TOKEN := ( KIND=&amp;gt; CHAINE, STR_LENGTH=&amp;gt; LEN );&lt;br /&gt;
&lt;br /&gt;
        end	GET_A_STRING;&lt;br /&gt;
		------------&lt;br /&gt;
&lt;br /&gt;
      when  others&lt;br /&gt;
	  =&amp;gt; raise SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end case;&lt;br /&gt;
&lt;br /&gt;
    if  DEBUG&lt;br /&gt;
    then&lt;br /&gt;
      PUT( &amp;quot;token &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( THE_TOKEN.KIND ) &amp;amp; &amp;quot; at&amp;quot;&lt;br /&gt;
	 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
	 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 )&lt;br /&gt;
         );&lt;br /&gt;
      if THE_TOKEN.KIND = CHAINE&lt;br /&gt;
      then  PUT_LINE( &amp;quot;  &amp;quot; &amp;amp; &#039;&amp;quot;&#039; &amp;amp; TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH ) &amp;amp; &#039;&amp;quot;&#039; );&lt;br /&gt;
      else  NEW_LINE;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
  exception&lt;br /&gt;
    when END_ERROR | SYNTAX_ERROR =&amp;gt; PROCESS_SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	GET;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  procedure		GET_VERIFY	( WHAT_IS_EXPECTED :TOKEN_TYPE; THE_TOKEN :out TOKEN )&lt;br /&gt;
			----------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    GET( THE_TOKEN );&lt;br /&gt;
    if  THE_TOKEN.KIND /= WHAT_IS_EXPECTED&lt;br /&gt;
    then&lt;br /&gt;
      PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; WHAT_IS_EXPECTED );&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
  end	GET_VERIFY;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  GET_OBJECT	return JSON.ITEM;&lt;br /&gt;
  function  GET_ARRAY	return JSON.ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--------&lt;br /&gt;
  function		GET_ITEM		( THE_TOKEN :TOKEN )	return JSON.ITEM&lt;br /&gt;
			--------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
&lt;br /&gt;
    case  THE_TOKEN.KIND  is&lt;br /&gt;
&lt;br /&gt;
      when  LEFT_ACCOLADE&lt;br /&gt;
	  =&amp;gt; return GET_OBJECT;&lt;br /&gt;
&lt;br /&gt;
      when  LEFT_CROCHET&lt;br /&gt;
	  =&amp;gt; return GET_ARRAY;&lt;br /&gt;
&lt;br /&gt;
      when  CHAINE&lt;br /&gt;
 	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; STRING_ITEM,&lt;br /&gt;
				    STR_ACCESS=&amp;gt; new STRING&#039;(TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH )) );&lt;br /&gt;
&lt;br /&gt;
      when  ENTIER&lt;br /&gt;
	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; INTEGER_ITEM, INT_VAL=&amp;gt; THE_TOKEN.INT_VALUE );&lt;br /&gt;
&lt;br /&gt;
      when  FLOTTANT&lt;br /&gt;
	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; FLOAT_ITEM, FLOAT_VAL=&amp;gt; THE_TOKEN.FLOAT_VALUE );&lt;br /&gt;
&lt;br /&gt;
      when  others&lt;br /&gt;
	  =&amp;gt; raise SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end case;&lt;br /&gt;
&lt;br /&gt;
  exception&lt;br /&gt;
    when SYNTAX_ERROR&lt;br /&gt;
         =&amp;gt; PROCESS_SYNTAX_ERROR( THE_TOKEN.KIND );&lt;br /&gt;
	  raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	GET_ITEM;&lt;br /&gt;
	--------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
    function		GET_OBJECT		return JSON.ITEM&lt;br /&gt;
			----------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN		: TOKEN;&lt;br /&gt;
      FIELDS_LIST_HEAD,&lt;br /&gt;
      FIELDS_LIST_LAST	: OBJECT_FIELD_ACCESS	:= null;&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = RIGHT_ACCOLADE  then  return new ITEM_DEFINITION&#039;( OBJECT_ITEM, null );  end if;&lt;br /&gt;
      if  THE_TOKEN.KIND /= CHAINE  then  PROCESS_SYNTAX_ERROR;  end if;&lt;br /&gt;
&lt;br /&gt;
      loop&lt;br /&gt;
&lt;br /&gt;
        declare&lt;br /&gt;
	KEY	: STRING_ACCESS		:= new STRING&#039;(TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH ));&lt;br /&gt;
	OFA	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
        begin&lt;br /&gt;
	GET_VERIFY( COLON, THE_TOKEN );&lt;br /&gt;
	GET( THE_TOKEN );&lt;br /&gt;
	OFA := new OBJECT_FIELD&#039;( KEY, GET_ITEM( THE_TOKEN ), null );&lt;br /&gt;
&lt;br /&gt;
	if  FIELDS_LIST_HEAD = null  then&lt;br /&gt;
	  FIELDS_LIST_HEAD := OFA; FIELDS_LIST_LAST := OFA;&lt;br /&gt;
	else&lt;br /&gt;
	  FIELDS_LIST_LAST.all.NEXT := OFA; FIELDS_LIST_LAST := OFA;&lt;br /&gt;
	end if;&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        GET( THE_TOKEN );&lt;br /&gt;
        if  THE_TOKEN.KIND = COMMA&lt;br /&gt;
        then&lt;br /&gt;
	GET_VERIFY( CHAINE, THE_TOKEN );&lt;br /&gt;
        else&lt;br /&gt;
	if  THE_TOKEN.KIND /= RIGHT_ACCOLADE&lt;br /&gt;
	then&lt;br /&gt;
	  PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; RIGHT_ACCOLADE );&lt;br /&gt;
	end if;&lt;br /&gt;
	exit;&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
      end loop;&lt;br /&gt;
&lt;br /&gt;
      return new ITEM_DEFINITION&#039;( OBJECT_ITEM, FIELDS_LIST_HEAD );&lt;br /&gt;
&lt;br /&gt;
    end	GET_OBJECT;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---------&lt;br /&gt;
    function		GET_ARRAY			return JSON.ITEM&lt;br /&gt;
			---------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN		: TOKEN;&lt;br /&gt;
      STRUC_LIST_HEAD,&lt;br /&gt;
      STRUC_LIST_LAST	: LIST_OF_ITEMS	:= null;&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = RIGHT_CROCHET  then  return new ITEM_DEFINITION&#039;( ARRAY_ITEM, null );  end if;&lt;br /&gt;
&lt;br /&gt;
			-------------&lt;br /&gt;
			PROCESS_ITEMS:&lt;br /&gt;
      loop&lt;br /&gt;
&lt;br /&gt;
        declare&lt;br /&gt;
	LOI	: LIST_OF_ITEMS	:= new ITEM_LIST_ELEMENT&#039;( GET_ITEM( THE_TOKEN ), null );&lt;br /&gt;
        begin&lt;br /&gt;
	if  STRUC_LIST_HEAD = null  then&lt;br /&gt;
	  STRUC_LIST_HEAD := LOI; STRUC_LIST_LAST := LOI;&lt;br /&gt;
	else&lt;br /&gt;
	  STRUC_LIST_LAST.all.NEXT := LOI; STRUC_LIST_LAST := LOI;&lt;br /&gt;
	end if;&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        GET( THE_TOKEN );&lt;br /&gt;
        if  THE_TOKEN.KIND = COMMA&lt;br /&gt;
        then&lt;br /&gt;
	GET( THE_TOKEN );&lt;br /&gt;
        else&lt;br /&gt;
	if  THE_TOKEN.KIND = RIGHT_CROCHET&lt;br /&gt;
	then  exit PROCESS_ITEMS;&lt;br /&gt;
	else  PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; RIGHT_CROCHET );&lt;br /&gt;
	end if;&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
      end loop	PROCESS_ITEMS;&lt;br /&gt;
		-------------&lt;br /&gt;
&lt;br /&gt;
      return new ITEM_DEFINITION&#039;( ARRAY_ITEM, STRUC_LIST_HEAD );&lt;br /&gt;
&lt;br /&gt;
    end	GET_ARRAY;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
    function		READ_OBJECT		return JSON.ITEM&lt;br /&gt;
  			-----------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN	: TOKEN;&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = LEFT_ACCOLADE  then&lt;br /&gt;
        return GET_OBJECT;&lt;br /&gt;
      else  raise SYNTAX_ERROR;&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
    exception&lt;br /&gt;
      when SYNTAX_ERROR&lt;br /&gt;
	  =&amp;gt; PROCESS_SYNTAX_ERROR;&lt;br /&gt;
	     raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end	READ_OBJECT;&lt;br /&gt;
	-----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		------&lt;br /&gt;
  end		PARSER;&lt;br /&gt;
		------&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    THE_ITEM := PARSER.READ_OBJECT;&lt;br /&gt;
&lt;br /&gt;
  end	GET;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		PUT		( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM )&lt;br /&gt;
			---&lt;br /&gt;
  is&lt;br /&gt;
			  -------&lt;br /&gt;
    procedure		  LAY_ONE		( ITEM :JSON.ITEM; AT_COL :TEXT_IO.COUNT )&lt;br /&gt;
			  -------&lt;br /&gt;
    is&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
			    -----------------&lt;br /&gt;
      procedure		    PUT_OBJECT_FIELDS	( OF_OBJECT :JSON.ITEM )&lt;br /&gt;
			    -----------------&lt;br /&gt;
      is&lt;br /&gt;
			      -----------------&lt;br /&gt;
        procedure		      PROCESS_ONE_FIELD	( KEY	     :STRING;&lt;br /&gt;
						  ITEM	     :in out JSON.ITEM;&lt;br /&gt;
						  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
						  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
			      -----------------&lt;br /&gt;
        is&lt;br /&gt;
        begin&lt;br /&gt;
	SET_COL( AT_COL+2 );&lt;br /&gt;
	PUT( &#039;&amp;quot;&#039; &amp;amp; KEY &amp;amp; &#039;&amp;quot;&#039; &amp;amp; &amp;quot; : &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	LAY_ONE( ITEM, TEXT_IO.COL );&lt;br /&gt;
&lt;br /&gt;
	if  not LAST_ONE  then  PUT( &#039;,&#039; );  end if; NEW_LINE;&lt;br /&gt;
	STOP_PROCESS := FALSE;&lt;br /&gt;
&lt;br /&gt;
        end	  PROCESS_ONE_FIELD;&lt;br /&gt;
		  -----------------&lt;br /&gt;
&lt;br /&gt;
        procedure PUT_FOR_EACH_FIELD is new FOR_EACH_JSON_FIELD( PROCESS_ONE_FIELD );&lt;br /&gt;
&lt;br /&gt;
      begin&lt;br /&gt;
	PUT_FOR_EACH_FIELD( OF_OBJECT );&lt;br /&gt;
&lt;br /&gt;
      end	PUT_OBJECT_FIELDS;&lt;br /&gt;
	-----------------&lt;br /&gt;
&lt;br /&gt;
			    ---------------&lt;br /&gt;
      procedure		    PUT_ARRAY_ITEMS	(THE_ITEM :JSON.ITEM )&lt;br /&gt;
			    ---------------&lt;br /&gt;
      is&lt;br /&gt;
        START_COL	: TEXT_IO.COUNT	:= TEXT_IO.COL;&lt;br /&gt;
&lt;br /&gt;
			      ----------------&lt;br /&gt;
	procedure		      PROCESS_ONE_ITEM	( ITEM	     :in out JSON.ITEM;&lt;br /&gt;
						  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
						  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
			      ----------------&lt;br /&gt;
	is&lt;br /&gt;
	begin&lt;br /&gt;
	  NEW_LINE;&lt;br /&gt;
&lt;br /&gt;
	  LAY_ONE( ITEM, START_COL+2 );&lt;br /&gt;
&lt;br /&gt;
	  if  not LAST_ONE  then  PUT( &#039;,&#039; );  end if;&lt;br /&gt;
	  STOP_PROCESS := FALSE;&lt;br /&gt;
&lt;br /&gt;
	end	    PROCESS_ONE_ITEM;&lt;br /&gt;
		    ----------------&lt;br /&gt;
&lt;br /&gt;
	procedure PUT_FOR_EACH_ITEM is new FOR_EACH_JSON_ITEM( PROCESS_ONE_ITEM );&lt;br /&gt;
&lt;br /&gt;
      begin&lt;br /&gt;
        PUT_FOR_EACH_ITEM( ITEM );&lt;br /&gt;
&lt;br /&gt;
      end	PUT_ARRAY_ITEMS;&lt;br /&gt;
	---------------&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      SET_COL( AT_COL );&lt;br /&gt;
&lt;br /&gt;
      case KIND( ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;{&#039; );&lt;br /&gt;
	 PUT_OBJECT_FIELDS( ITEM );&lt;br /&gt;
	 SET_COL( AT_COL+1 );&lt;br /&gt;
	 PUT( &#039;}&#039; );&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;[&#039; );&lt;br /&gt;
	 PUT_ARRAY_ITEMS( ITEM );&lt;br /&gt;
	 SET_COL( AT_COL+1 );&lt;br /&gt;
	 PUT( &#039;]&#039; );&lt;br /&gt;
&lt;br /&gt;
      when STRING_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;&amp;quot;&#039; &amp;amp; ITEM.all.STR_ACCESS.all &amp;amp; &#039;&amp;quot;&#039; );&lt;br /&gt;
&lt;br /&gt;
      when INTEGER_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( INTEGER&#039;IMAGE( ITEM.all.INT_VAL ) );&lt;br /&gt;
&lt;br /&gt;
      when FLOAT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 declare&lt;br /&gt;
	  package LONG_FLOAT_IO	is new FLOAT_IO( LONG_FLOAT );&lt;br /&gt;
	  begin&lt;br /&gt;
	    LONG_FLOAT_IO.PUT( ITEM.all.FLOAT_VAL );&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when BOOLEAN_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( BOOLEAN&#039;IMAGE( ITEM.all.BOOL_VAL ) );&lt;br /&gt;
&lt;br /&gt;
      when NULL_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &amp;quot;null&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
    end	  LAY_ONE;&lt;br /&gt;
	  -------&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    TEXT_IO.SET_OUTPUT( FILE );&lt;br /&gt;
    LAY_ONE( THE_ITEM, AT_COL=&amp;gt; 1 );&lt;br /&gt;
    TEXT_IO.SET_OUTPUT( TEXT_IO.STANDARD_OUTPUT );&lt;br /&gt;
&lt;br /&gt;
  end	PUT;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---------&lt;br /&gt;
  function		STRING_OF		( THE_ITEM : ITEM)			return STRING&lt;br /&gt;
			---------&lt;br /&gt;
  is&lt;br /&gt;
    TEMP_FILE_NAME	:constant STRING	:= &amp;quot;JSON$$$.tmp&amp;quot;;&lt;br /&gt;
  begin&lt;br /&gt;
		------------------&lt;br /&gt;
		WRITE_ITEM_TO_FILE:&lt;br /&gt;
    declare&lt;br /&gt;
      TEMP_FILE	: TEXT_IO.FILE_TYPE;&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
    begin&lt;br /&gt;
      CREATE( TEMP_FILE, OUT_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      JSON.PUT( TEMP_FILE, THE_ITEM );&lt;br /&gt;
      CLOSE( TEMP_FILE );&lt;br /&gt;
&lt;br /&gt;
    end	WRITE_ITEM_TO_FILE;&lt;br /&gt;
	------------------&lt;br /&gt;
&lt;br /&gt;
		-------------------&lt;br /&gt;
		READ_FILE_TO_STRING:&lt;br /&gt;
    declare&lt;br /&gt;
      package CHAR_IO is new DIRECT_IO( CHARACTER );&lt;br /&gt;
      use CHAR_IO;&lt;br /&gt;
      TEMP_FILE	: CHAR_IO.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      CHAR_IO.OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      declare&lt;br /&gt;
        ITEM_STRING_LENGTH	:constant INTEGER	:= INTEGER( CHAR_IO.SIZE( TEMP_FILE ) );&lt;br /&gt;
        ITEM_STRING		: STRING( 1 .. ITEM_STRING_LENGTH );&lt;br /&gt;
      begin&lt;br /&gt;
        for I in ITEM_STRING&#039;RANGE loop&lt;br /&gt;
	READ( TEMP_FILE, ITEM_STRING( I ) );&lt;br /&gt;
        end loop;&lt;br /&gt;
        DELETE( TEMP_FILE );&lt;br /&gt;
        return  ITEM_STRING;&lt;br /&gt;
      end;&lt;br /&gt;
&lt;br /&gt;
    end	READ_FILE_TO_STRING;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
  end	STRING_OF;&lt;br /&gt;
	---------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------&lt;br /&gt;
  function		ITEM_OF		( THE_STRING :STRING)		return ITEM&lt;br /&gt;
  			-------&lt;br /&gt;
  is&lt;br /&gt;
    TEMP_FILE_NAME	:constant STRING	:= &amp;quot;JSON$$$.tmp&amp;quot;;&lt;br /&gt;
    OUT_ITEM	: ITEM;&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    declare&lt;br /&gt;
      package CHAR_IO is new DIRECT_IO( CHARACTER );&lt;br /&gt;
      use CHAR_IO;&lt;br /&gt;
      TEMP_FILE	: CHAR_IO.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      CREATE( TEMP_FILE, OUT_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      for I in THE_STRING&#039;RANGE loop&lt;br /&gt;
        WRITE( TEMP_FILE, THE_STRING( I ) );&lt;br /&gt;
      end loop;&lt;br /&gt;
      CLOSE( TEMP_FILE );&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
      TEMP_FILE	: JSON.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      TEXT_IO.OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      JSON.GET( TEMP_FILE, OUT_ITEM );&lt;br /&gt;
      OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      DELETE( TEMP_FILE );&lt;br /&gt;
    end;&lt;br /&gt;
    return  OUT_ITEM;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_OF;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--  J S O N   S T R U C T U R E   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----&lt;br /&gt;
  function 		KIND		( OF_ITEM :ITEM )		return ITEM_TYPE&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    return  OF_ITEM.all.KIND;&lt;br /&gt;
&lt;br /&gt;
  end	KIND;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  function 		IS_PRESENT	( KEY :STRING; IN_OBJECT :ITEM )	return BOOLEAN&lt;br /&gt;
  			----------&lt;br /&gt;
  is&lt;br /&gt;
    SEARCH_KEY	: STRING		renames KEY;&lt;br /&gt;
    KEY_SEEN	: BOOLEAN		:= FALSE;&lt;br /&gt;
&lt;br /&gt;
		-------&lt;br /&gt;
    procedure	PROCESS	( THE_KEY	     :STRING;&lt;br /&gt;
			  THE_ITEM     :in out ITEM;&lt;br /&gt;
			  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
			  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
    is		-------&lt;br /&gt;
    begin&lt;br /&gt;
      if  THE_KEY = SEARCH_KEY  then  KEY_SEEN := TRUE;  end if;&lt;br /&gt;
      STOP_PROCESS := KEY_SEEN;&lt;br /&gt;
&lt;br /&gt;
    end	PROCESS;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
    procedure SCAN is new FOR_EACH_JSON_FIELD( PROCESS );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    if  IN_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    SCAN( IN_OBJECT );&lt;br /&gt;
    return  KEY_SEEN;&lt;br /&gt;
&lt;br /&gt;
  end	IS_PRESENT;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
  function		ITEM_BY_KEY	( KEY :STRING; IN_OBJECT :ITEM )	return ITEM&lt;br /&gt;
			-----------&lt;br /&gt;
  is&lt;br /&gt;
    SEARCH_KEY		: STRING		renames KEY;&lt;br /&gt;
    FOUND_ITEM		: ITEM		:= null;&lt;br /&gt;
&lt;br /&gt;
		-------&lt;br /&gt;
    procedure	PROCESS	( THE_KEY	     :STRING;&lt;br /&gt;
			  THE_ITEM     :in out ITEM;&lt;br /&gt;
			  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
			  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
    is		-------&lt;br /&gt;
    begin&lt;br /&gt;
      if  THE_KEY = SEARCH_KEY  then  FOUND_ITEM := THE_ITEM;  end if;&lt;br /&gt;
      STOP_PROCESS := (FOUND_ITEM /= null);&lt;br /&gt;
&lt;br /&gt;
    end	PROCESS;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
    procedure SCAN is new FOR_EACH_JSON_FIELD( PROCESS );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    if  IN_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    SCAN( IN_OBJECT );&lt;br /&gt;
    if  FOUND_ITEM = null  then  raise VALUE_NOT_FOUND;  end if;&lt;br /&gt;
    return  FOUND_ITEM;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_BY_KEY;&lt;br /&gt;
	------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  function		ITEM_VALUE		( OF_ITEM :ITEM )		return VALUE_DATA&lt;br /&gt;
			----------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    case KIND( OF_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM | ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  raise BAD_ITEM_TYPE;&lt;br /&gt;
&lt;br /&gt;
      when STRING_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_STRING	: STRING	renames	OF_ITEM.all.STR_ACCESS.all;&lt;br /&gt;
	    STRING_LENGTH	:constant NATURAL	:= THE_STRING&#039;LENGTH;&lt;br /&gt;
	  begin&lt;br /&gt;
	    return ( STRING_ITEM, STRING_LENGTH, THE_STRING );&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when INTEGER_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( INTEGER_ITEM, 0, OF_ITEM.all.INT_VAL );&lt;br /&gt;
&lt;br /&gt;
      when FLOAT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( FLOAT_ITEM, 0, OF_ITEM.all.FLOAT_VAL );&lt;br /&gt;
&lt;br /&gt;
      when BOOLEAN_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( BOOLEAN_ITEM, 0, OF_ITEM.all.BOOL_VAL );&lt;br /&gt;
&lt;br /&gt;
      when NULL_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( NULL_ITEM, 0 );&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_VALUE;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------------------&lt;br /&gt;
  function		NUMBER_OF_SUB_ITEMS		( IN_ITEM :ITEM )		return NATURAL&lt;br /&gt;
			-------------------&lt;br /&gt;
  is&lt;br /&gt;
    COUNT		: NATURAL	:= 0;&lt;br /&gt;
  begin&lt;br /&gt;
     case KIND( IN_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: OBJECT_FIELD_ACCESS	:= IN_ITEM.all.FIELDS_LIST;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      COUNT := COUNT + 1;&lt;br /&gt;
	      THE_LIST := THE_LIST.all.NEXT;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: LIST_OF_ITEMS	:= IN_ITEM.all.ITEMS_LIST;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      COUNT := COUNT + 1;&lt;br /&gt;
	      THE_LIST := THE_LIST.all.NEXT;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when others =&amp;gt; null;&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
      return COUNT;&lt;br /&gt;
&lt;br /&gt;
  end	NUMBER_OF_SUB_ITEMS;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----&lt;br /&gt;
  procedure		FREE			( THE_ITEM :in out ITEM )&lt;br /&gt;
			----&lt;br /&gt;
  is&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( ITEM_DEFINITION, ITEM );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( OBJECT_FIELD, OBJECT_FIELD_ACCESS );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( ITEM_LIST_ELEMENT, LIST_OF_ITEMS );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( STRING, STRING_ACCESS );&lt;br /&gt;
  begin&lt;br /&gt;
     case KIND( THE_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: OBJECT_FIELD_ACCESS	:= THE_ITEM.all.FIELDS_LIST;&lt;br /&gt;
	    SUITE		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      FREE( THE_LIST.all.FIELD_KEY );&lt;br /&gt;
	      FREE( THE_LIST.all.FIELD_ITEM );&lt;br /&gt;
	      SUITE := THE_LIST.all.NEXT;&lt;br /&gt;
	      FREE( THE_LIST );&lt;br /&gt;
	      THE_LIST := SUITE;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: LIST_OF_ITEMS	:= THE_ITEM.all.ITEMS_LIST;&lt;br /&gt;
	    SUITE		: LIST_OF_ITEMS;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      FREE( THE_LIST.all.LIST_ITEM );&lt;br /&gt;
	      SUITE := THE_LIST.all.NEXT;&lt;br /&gt;
	      FREE( THE_LIST );&lt;br /&gt;
	      THE_LIST := SUITE;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when others =&amp;gt; null;&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
      THE_ITEM.all := ( KIND=&amp;gt; NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  end	FREE;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			------------------&lt;br /&gt;
  procedure		FOR_EACH_JSON_ITEM		( OF_ARRAY :JSON.ITEM )&lt;br /&gt;
			------------------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    if  OF_ARRAY = null  or else  OF_ARRAY.all.KIND /= ARRAY_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      STOP_PROCESS		: BOOLEAN;&lt;br /&gt;
      ITEM_LIST		: LIST_OF_ITEMS	:= OF_ARRAY.all.ITEMS_LIST;&lt;br /&gt;
      LAST_ONE		: BOOLEAN;&lt;br /&gt;
    begin&lt;br /&gt;
      loop&lt;br /&gt;
        exit when  ITEM_LIST = null;&lt;br /&gt;
        LAST_ONE := (ITEM_LIST.all.NEXT = null);&lt;br /&gt;
        APPLY_PROCESS( ITEM_LIST.all.LIST_ITEM, LAST_ONE, STOP_PROCESS );&lt;br /&gt;
        exit when  STOP_PROCESS;&lt;br /&gt;
        ITEM_LIST := ITEM_LIST.all.NEXT;&lt;br /&gt;
      end loop;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
  end	FOR_EACH_JSON_ITEM;&lt;br /&gt;
	------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------------------&lt;br /&gt;
  procedure		FOR_EACH_JSON_FIELD		( OF_OBJECT :JSON.ITEM )&lt;br /&gt;
			-------------------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    if  OF_OBJECT = null  or else  OF_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      FIELDS		: OBJECT_FIELD_ACCESS	:= OF_OBJECT.all.FIELDS_LIST;&lt;br /&gt;
      STOP_PROCESS		: BOOLEAN;&lt;br /&gt;
      LAST_ONE		: BOOLEAN;&lt;br /&gt;
    begin&lt;br /&gt;
      while  FIELDS /= null  loop&lt;br /&gt;
        LAST_ONE := (FIELDS.all.NEXT = null);&lt;br /&gt;
        APPLY_PROCESS( FIELDS.all.FIELD_KEY.all, FIELDS.all.FIELD_ITEM, LAST_ONE, STOP_PROCESS );&lt;br /&gt;
        exit when  STOP_PROCESS;&lt;br /&gt;
        FIELDS := FIELDS.all.NEXT;&lt;br /&gt;
      end loop;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
  end	FOR_EACH_JSON_FIELD;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=80</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=80"/>
		<updated>2025-03-02T15:16:43Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    font-size:11px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .kwd {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=79</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=79"/>
		<updated>2025-03-02T15:14:49Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    font-size:10px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .kwd {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=78</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=78"/>
		<updated>2025-03-02T15:13:59Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    font-size:9px;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .kwd {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=77</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=77"/>
		<updated>2025-03-02T15:13:19Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    font-size:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .kwd {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=76</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=76"/>
		<updated>2025-03-02T13:00:47Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .keyword {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=75</id>
		<title>JSON package</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=75"/>
		<updated>2025-03-02T12:56:36Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;&amp;gt;--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;ada&amp;quot;; style=&amp;quot;font-family:&#039;Nimbus Mono L&#039;;background:black;color:lime;tab-size:10;line-height: 1.2;&amp;quot;&amp;gt;--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
						----&lt;br /&gt;
			package			JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
  type ITEM		is private;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_TYPE		is ( OBJECT_ITEM, ARRAY_ITEM,&lt;br /&gt;
			     STRING_ITEM, INTEGER_ITEM, FLOAT_ITEM, BOOLEAN_ITEM, NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  subtype TERMINAL_TYPE	is ITEM_TYPE range STRING_ITEM .. NULL_ITEM;&lt;br /&gt;
&lt;br /&gt;
  subtype FILE_TYPE		is TEXT_IO.FILE_TYPE;&lt;br /&gt;
&lt;br /&gt;
  MAX_STRING_LENGTH		:constant NATURAL	:= 2**15-1;&lt;br /&gt;
  subtype STRING_LENGTH	is NATURAL range 0 .. MAX_STRING_LENGTH;&lt;br /&gt;
&lt;br /&gt;
  type VALUE_DATA (KIND :TERMINAL_TYPE := NULL_ITEM; LENGTH :STRING_LENGTH := 0)&lt;br /&gt;
			is record&lt;br /&gt;
			  case  KIND&lt;br /&gt;
			  is&lt;br /&gt;
			    when STRING_ITEM	=&amp;gt; STRING_VAL	:STRING( 1 .. LENGTH );&lt;br /&gt;
			    when INTEGER_ITEM	=&amp;gt; INT_VAL	:INTEGER;&lt;br /&gt;
			    when FLOAT_ITEM		=&amp;gt; FLOAT_VAL	:LONG_FLOAT;&lt;br /&gt;
			    when BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	:BOOLEAN;&lt;br /&gt;
			    when NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I / O&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  procedure GET			( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM );&lt;br /&gt;
  procedure PUT			( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM );&lt;br /&gt;
  function  STRING_OF		( THE_ITEM :ITEM)				return STRING;&lt;br /&gt;
  function  ITEM_OF			( THE_STRING :STRING)			return ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  KIND			( OF_ITEM :ITEM )				return ITEM_TYPE;&lt;br /&gt;
  function  IS_PRESENT		( KEY :STRING; IN_OBJECT :ITEM )		return BOOLEAN;&lt;br /&gt;
  function  ITEM_BY_KEY		( KEY :STRING; IN_OBJECT :ITEM )		return ITEM;&lt;br /&gt;
  function  ITEM_VALUE		( OF_ITEM :ITEM )				return VALUE_DATA;&lt;br /&gt;
  function  NUMBER_OF_SUB_ITEMS	( IN_ITEM :ITEM )				return NATURAL;&lt;br /&gt;
  procedure FREE			( THE_ITEM :in out ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_ITEM	( OF_ARRAY :ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( KEY :STRING; ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_FIELD	( OF_OBJECT :ITEM );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  SYNTAX_ERROR, BAD_ITEM_TYPE, VALUE_NOT_FOUND	: exception;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
										pragma PAGE;&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :JSON.ITEM_TYPE);&lt;br /&gt;
  type ITEM			is access ITEM_DEFINITION;&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD;&lt;br /&gt;
  type OBJECT_FIELD_ACCESS		is access OBJECT_FIELD;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT;&lt;br /&gt;
  type LIST_OF_ITEMS		is access ITEM_LIST_ELEMENT;&lt;br /&gt;
&lt;br /&gt;
  type STRING_ACCESS		is access STRING;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :ITEM_TYPE)	is record&lt;br /&gt;
				  case KIND is&lt;br /&gt;
				  when  OBJECT_ITEM		=&amp;gt; FIELDS_LIST	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				  when  ARRAY_ITEM		=&amp;gt; ITEMS_LIST	: LIST_OF_ITEMS;&lt;br /&gt;
				  when  STRING_ITEM		=&amp;gt; STR_ACCESS	: STRING_ACCESS;&lt;br /&gt;
				  when  INTEGER_ITEM	=&amp;gt; INT_VAL	: INTEGER;&lt;br /&gt;
				  when  FLOAT_ITEM		=&amp;gt; FLOAT_VAL	: LONG_FLOAT;&lt;br /&gt;
				  when  BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	: BOOLEAN;&lt;br /&gt;
				  when  NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
				  end case;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD			is record&lt;br /&gt;
				  FIELD_KEY	: STRING_ACCESS;&lt;br /&gt;
				  FIELD_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT		is record&lt;br /&gt;
				  LIST_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: LIST_OF_ITEMS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The package body :&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font-family:&#039;Noto Mono&#039;;background:black;color:lime;tab-size:10;line-height: 1;&amp;quot;&amp;gt;&lt;br /&gt;
--	JSON.ADB	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with UNCHECKED_DEALLOCATION, DIRECT_IO;&lt;br /&gt;
&lt;br /&gt;
						----&lt;br /&gt;
			package body		JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
  DEBUG		: BOOLEAN		:= FALSE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		GET		( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM )&lt;br /&gt;
  			---&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
&lt;br /&gt;
		------&lt;br /&gt;
  package		PARSER&lt;br /&gt;
		------&lt;br /&gt;
  is&lt;br /&gt;
&lt;br /&gt;
    function  READ_OBJECT		return JSON.ITEM;&lt;br /&gt;
&lt;br /&gt;
	------&lt;br /&gt;
  end	PARSER;&lt;br /&gt;
	------&lt;br /&gt;
&lt;br /&gt;
  package body				PARSER&lt;br /&gt;
					------&lt;br /&gt;
  is&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    type TOKEN_TYPE		is ( END_TOKEN, LEFT_ACCOLADE, RIGHT_ACCOLADE, LEFT_CROCHET, RIGHT_CROCHET,&lt;br /&gt;
			     COMMA, COLON, CHAINE, ENTIER, FLOTTANT );&lt;br /&gt;
&lt;br /&gt;
    type TOKEN (KIND :TOKEN_TYPE := END_TOKEN)	is record&lt;br /&gt;
			  case KIND is&lt;br /&gt;
			  when CHAINE	=&amp;gt; STR_LENGTH	: NATURAL;&lt;br /&gt;
			  when ENTIER	=&amp;gt; INT_VALUE	: INTEGER;&lt;br /&gt;
			  when FLOTTANT	=&amp;gt; FLOAT_VALUE	: LONG_FLOAT;&lt;br /&gt;
			  when others	=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
    TOKEN_BUFFER		: STRING( 1 .. 512 );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--------------------&lt;br /&gt;
  procedure		PROCESS_SYNTAX_ERROR		( ENCOUNTERED, EXPECTED : TOKEN_TYPE := END_TOKEN )&lt;br /&gt;
  			--------------------&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
  begin&lt;br /&gt;
    PUT( &amp;quot;syntax error ! (&amp;quot; &amp;amp; COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) )&lt;br /&gt;
		  &amp;amp; &#039;:&#039; &amp;amp; COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 ) &amp;amp; &amp;quot;) : &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    if  ENCOUNTERED = END_TOKEN  and  EXPECTED = END_TOKEN&lt;br /&gt;
    then&lt;br /&gt;
      PUT_LINE( &amp;quot;unexpected end of file &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      if  EXPECTED /= END_TOKEN&lt;br /&gt;
      then&lt;br /&gt;
        PUT( &amp;quot;expected &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( EXPECTED ) );&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
      if  ENCOUNTERED /= END_TOKEN&lt;br /&gt;
      then&lt;br /&gt;
        PUT_LINE( &amp;quot; encountered &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( ENCOUNTERED ) );&lt;br /&gt;
      else&lt;br /&gt;
        NEW_LINE;&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	PROCESS_SYNTAX_ERROR;&lt;br /&gt;
	--------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		GET			( THE_TOKEN :out TOKEN )&lt;br /&gt;
			---&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
    C	: CHARACTER;&lt;br /&gt;
  begin&lt;br /&gt;
    THE_TOKEN := ( KIND=&amp;gt; END_TOKEN );&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
			SKIP_BLANKS:&lt;br /&gt;
    loop&lt;br /&gt;
      if  END_OF_FILE( FILE )  then  return;  end if;&lt;br /&gt;
      GET( FILE, C );&lt;br /&gt;
      exit when  not (C = &#039; &#039;  or  C = ASCII.HT);&lt;br /&gt;
      if  END_OF_FILE( FILE )  then  return;  end if;&lt;br /&gt;
&lt;br /&gt;
    end loop	SKIP_BLANKS;&lt;br /&gt;
		-----------&lt;br /&gt;
&lt;br /&gt;
    if  DEBUG&lt;br /&gt;
    then&lt;br /&gt;
      PUT( C &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
	   &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL(FILE )-1 ) &amp;amp; &#039;.&#039; );&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    case  C  is&lt;br /&gt;
&lt;br /&gt;
      when  &#039;{&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; LEFT_ACCOLADE  );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;}&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; RIGHT_ACCOLADE );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;[&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; LEFT_CROCHET   );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;]&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; RIGHT_CROCHET  );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;,&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; COMMA );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;:&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; COLON );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;&amp;quot;&#039;&lt;br /&gt;
	  =&amp;gt;		------------&lt;br /&gt;
			GET_A_STRING:&lt;br /&gt;
        declare&lt;br /&gt;
	LEN		: NATURAL		:= 0;&lt;br /&gt;
	INDEX_BUFFER	: POSITIVE	:= 1;&lt;br /&gt;
        begin&lt;br /&gt;
	loop&lt;br /&gt;
	  GET( FILE, C );&lt;br /&gt;
&lt;br /&gt;
	  if  DEBUG&lt;br /&gt;
	  then&lt;br /&gt;
	    PUT( C &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
		 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 ) &amp;amp; &#039;.&#039; );&lt;br /&gt;
	  end if;&lt;br /&gt;
&lt;br /&gt;
            exit when  C = &#039;&amp;quot;&#039;;&lt;br /&gt;
	  TOKEN_BUFFER( INDEX_BUFFER ) := C;&lt;br /&gt;
	  LEN := LEN + 1;&lt;br /&gt;
	  INDEX_BUFFER := INDEX_BUFFER + 1;&lt;br /&gt;
	end loop;&lt;br /&gt;
	THE_TOKEN := ( KIND=&amp;gt; CHAINE, STR_LENGTH=&amp;gt; LEN );&lt;br /&gt;
&lt;br /&gt;
        end	GET_A_STRING;&lt;br /&gt;
		------------&lt;br /&gt;
&lt;br /&gt;
      when  others&lt;br /&gt;
	  =&amp;gt; raise SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end case;&lt;br /&gt;
&lt;br /&gt;
    if  DEBUG&lt;br /&gt;
    then&lt;br /&gt;
      PUT( &amp;quot;token &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( THE_TOKEN.KIND ) &amp;amp; &amp;quot; at&amp;quot;&lt;br /&gt;
	 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
	 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 )&lt;br /&gt;
         );&lt;br /&gt;
      if THE_TOKEN.KIND = CHAINE&lt;br /&gt;
      then  PUT_LINE( &amp;quot;  &amp;quot; &amp;amp; &#039;&amp;quot;&#039; &amp;amp; TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH ) &amp;amp; &#039;&amp;quot;&#039; );&lt;br /&gt;
      else  NEW_LINE;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
  exception&lt;br /&gt;
    when END_ERROR | SYNTAX_ERROR =&amp;gt; PROCESS_SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	GET;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  procedure		GET_VERIFY	( WHAT_IS_EXPECTED :TOKEN_TYPE; THE_TOKEN :out TOKEN )&lt;br /&gt;
			----------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    GET( THE_TOKEN );&lt;br /&gt;
    if  THE_TOKEN.KIND /= WHAT_IS_EXPECTED&lt;br /&gt;
    then&lt;br /&gt;
      PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; WHAT_IS_EXPECTED );&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
  end	GET_VERIFY;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  GET_OBJECT	return JSON.ITEM;&lt;br /&gt;
  function  GET_ARRAY	return JSON.ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--------&lt;br /&gt;
  function		GET_ITEM		( THE_TOKEN :TOKEN )	return JSON.ITEM&lt;br /&gt;
			--------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
&lt;br /&gt;
    case  THE_TOKEN.KIND  is&lt;br /&gt;
&lt;br /&gt;
      when  LEFT_ACCOLADE&lt;br /&gt;
	  =&amp;gt; return GET_OBJECT;&lt;br /&gt;
&lt;br /&gt;
      when  LEFT_CROCHET&lt;br /&gt;
	  =&amp;gt; return GET_ARRAY;&lt;br /&gt;
&lt;br /&gt;
      when  CHAINE&lt;br /&gt;
 	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; STRING_ITEM,&lt;br /&gt;
				    STR_ACCESS=&amp;gt; new STRING&#039;(TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH )) );&lt;br /&gt;
&lt;br /&gt;
      when  ENTIER&lt;br /&gt;
	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; INTEGER_ITEM, INT_VAL=&amp;gt; THE_TOKEN.INT_VALUE );&lt;br /&gt;
&lt;br /&gt;
      when  FLOTTANT&lt;br /&gt;
	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; FLOAT_ITEM, FLOAT_VAL=&amp;gt; THE_TOKEN.FLOAT_VALUE );&lt;br /&gt;
&lt;br /&gt;
      when  others&lt;br /&gt;
	  =&amp;gt; raise SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end case;&lt;br /&gt;
&lt;br /&gt;
  exception&lt;br /&gt;
    when SYNTAX_ERROR&lt;br /&gt;
         =&amp;gt; PROCESS_SYNTAX_ERROR( THE_TOKEN.KIND );&lt;br /&gt;
	  raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	GET_ITEM;&lt;br /&gt;
	--------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
    function		GET_OBJECT		return JSON.ITEM&lt;br /&gt;
			----------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN		: TOKEN;&lt;br /&gt;
      FIELDS_LIST_HEAD,&lt;br /&gt;
      FIELDS_LIST_LAST	: OBJECT_FIELD_ACCESS	:= null;&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = RIGHT_ACCOLADE  then  return new ITEM_DEFINITION&#039;( OBJECT_ITEM, null );  end if;&lt;br /&gt;
      if  THE_TOKEN.KIND /= CHAINE  then  PROCESS_SYNTAX_ERROR;  end if;&lt;br /&gt;
&lt;br /&gt;
      loop&lt;br /&gt;
&lt;br /&gt;
        declare&lt;br /&gt;
	KEY	: STRING_ACCESS		:= new STRING&#039;(TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH ));&lt;br /&gt;
	OFA	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
        begin&lt;br /&gt;
	GET_VERIFY( COLON, THE_TOKEN );&lt;br /&gt;
	GET( THE_TOKEN );&lt;br /&gt;
	OFA := new OBJECT_FIELD&#039;( KEY, GET_ITEM( THE_TOKEN ), null );&lt;br /&gt;
&lt;br /&gt;
	if  FIELDS_LIST_HEAD = null  then&lt;br /&gt;
	  FIELDS_LIST_HEAD := OFA; FIELDS_LIST_LAST := OFA;&lt;br /&gt;
	else&lt;br /&gt;
	  FIELDS_LIST_LAST.all.NEXT := OFA; FIELDS_LIST_LAST := OFA;&lt;br /&gt;
	end if;&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        GET( THE_TOKEN );&lt;br /&gt;
        if  THE_TOKEN.KIND = COMMA&lt;br /&gt;
        then&lt;br /&gt;
	GET_VERIFY( CHAINE, THE_TOKEN );&lt;br /&gt;
        else&lt;br /&gt;
	if  THE_TOKEN.KIND /= RIGHT_ACCOLADE&lt;br /&gt;
	then&lt;br /&gt;
	  PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; RIGHT_ACCOLADE );&lt;br /&gt;
	end if;&lt;br /&gt;
	exit;&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
      end loop;&lt;br /&gt;
&lt;br /&gt;
      return new ITEM_DEFINITION&#039;( OBJECT_ITEM, FIELDS_LIST_HEAD );&lt;br /&gt;
&lt;br /&gt;
    end	GET_OBJECT;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---------&lt;br /&gt;
    function		GET_ARRAY			return JSON.ITEM&lt;br /&gt;
			---------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN		: TOKEN;&lt;br /&gt;
      STRUC_LIST_HEAD,&lt;br /&gt;
      STRUC_LIST_LAST	: LIST_OF_ITEMS	:= null;&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = RIGHT_CROCHET  then  return new ITEM_DEFINITION&#039;( ARRAY_ITEM, null );  end if;&lt;br /&gt;
&lt;br /&gt;
			-------------&lt;br /&gt;
			PROCESS_ITEMS:&lt;br /&gt;
      loop&lt;br /&gt;
&lt;br /&gt;
        declare&lt;br /&gt;
	LOI	: LIST_OF_ITEMS	:= new ITEM_LIST_ELEMENT&#039;( GET_ITEM( THE_TOKEN ), null );&lt;br /&gt;
        begin&lt;br /&gt;
	if  STRUC_LIST_HEAD = null  then&lt;br /&gt;
	  STRUC_LIST_HEAD := LOI; STRUC_LIST_LAST := LOI;&lt;br /&gt;
	else&lt;br /&gt;
	  STRUC_LIST_LAST.all.NEXT := LOI; STRUC_LIST_LAST := LOI;&lt;br /&gt;
	end if;&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        GET( THE_TOKEN );&lt;br /&gt;
        if  THE_TOKEN.KIND = COMMA&lt;br /&gt;
        then&lt;br /&gt;
	GET( THE_TOKEN );&lt;br /&gt;
        else&lt;br /&gt;
	if  THE_TOKEN.KIND = RIGHT_CROCHET&lt;br /&gt;
	then  exit PROCESS_ITEMS;&lt;br /&gt;
	else  PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; RIGHT_CROCHET );&lt;br /&gt;
	end if;&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
      end loop	PROCESS_ITEMS;&lt;br /&gt;
		-------------&lt;br /&gt;
&lt;br /&gt;
      return new ITEM_DEFINITION&#039;( ARRAY_ITEM, STRUC_LIST_HEAD );&lt;br /&gt;
&lt;br /&gt;
    end	GET_ARRAY;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
    function		READ_OBJECT		return JSON.ITEM&lt;br /&gt;
  			-----------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN	: TOKEN;&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = LEFT_ACCOLADE  then&lt;br /&gt;
        return GET_OBJECT;&lt;br /&gt;
      else  raise SYNTAX_ERROR;&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
    exception&lt;br /&gt;
      when SYNTAX_ERROR&lt;br /&gt;
	  =&amp;gt; PROCESS_SYNTAX_ERROR;&lt;br /&gt;
	     raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end	READ_OBJECT;&lt;br /&gt;
	-----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		------&lt;br /&gt;
  end		PARSER;&lt;br /&gt;
		------&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    THE_ITEM := PARSER.READ_OBJECT;&lt;br /&gt;
&lt;br /&gt;
  end	GET;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		PUT		( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM )&lt;br /&gt;
			---&lt;br /&gt;
  is&lt;br /&gt;
			  -------&lt;br /&gt;
    procedure		  LAY_ONE		( ITEM :JSON.ITEM; AT_COL :TEXT_IO.COUNT )&lt;br /&gt;
			  -------&lt;br /&gt;
    is&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
			    -----------------&lt;br /&gt;
      procedure		    PUT_OBJECT_FIELDS	( OF_OBJECT :JSON.ITEM )&lt;br /&gt;
			    -----------------&lt;br /&gt;
      is&lt;br /&gt;
			      -----------------&lt;br /&gt;
        procedure		      PROCESS_ONE_FIELD	( KEY	     :STRING;&lt;br /&gt;
						  ITEM	     :in out JSON.ITEM;&lt;br /&gt;
						  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
						  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
			      -----------------&lt;br /&gt;
        is&lt;br /&gt;
        begin&lt;br /&gt;
	SET_COL( AT_COL+2 );&lt;br /&gt;
	PUT( &#039;&amp;quot;&#039; &amp;amp; KEY &amp;amp; &#039;&amp;quot;&#039; &amp;amp; &amp;quot; : &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	LAY_ONE( ITEM, TEXT_IO.COL );&lt;br /&gt;
&lt;br /&gt;
	if  not LAST_ONE  then  PUT( &#039;,&#039; );  end if; NEW_LINE;&lt;br /&gt;
	STOP_PROCESS := FALSE;&lt;br /&gt;
&lt;br /&gt;
        end	  PROCESS_ONE_FIELD;&lt;br /&gt;
		  -----------------&lt;br /&gt;
&lt;br /&gt;
        procedure PUT_FOR_EACH_FIELD is new FOR_EACH_JSON_FIELD( PROCESS_ONE_FIELD );&lt;br /&gt;
&lt;br /&gt;
      begin&lt;br /&gt;
	PUT_FOR_EACH_FIELD( OF_OBJECT );&lt;br /&gt;
&lt;br /&gt;
      end	PUT_OBJECT_FIELDS;&lt;br /&gt;
	-----------------&lt;br /&gt;
&lt;br /&gt;
			    ---------------&lt;br /&gt;
      procedure		    PUT_ARRAY_ITEMS	(THE_ITEM :JSON.ITEM )&lt;br /&gt;
			    ---------------&lt;br /&gt;
      is&lt;br /&gt;
        START_COL	: TEXT_IO.COUNT	:= TEXT_IO.COL;&lt;br /&gt;
&lt;br /&gt;
			      ----------------&lt;br /&gt;
	procedure		      PROCESS_ONE_ITEM	( ITEM	     :in out JSON.ITEM;&lt;br /&gt;
						  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
						  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
			      ----------------&lt;br /&gt;
	is&lt;br /&gt;
	begin&lt;br /&gt;
	  NEW_LINE;&lt;br /&gt;
&lt;br /&gt;
	  LAY_ONE( ITEM, START_COL+2 );&lt;br /&gt;
&lt;br /&gt;
	  if  not LAST_ONE  then  PUT( &#039;,&#039; );  end if;&lt;br /&gt;
	  STOP_PROCESS := FALSE;&lt;br /&gt;
&lt;br /&gt;
	end	    PROCESS_ONE_ITEM;&lt;br /&gt;
		    ----------------&lt;br /&gt;
&lt;br /&gt;
	procedure PUT_FOR_EACH_ITEM is new FOR_EACH_JSON_ITEM( PROCESS_ONE_ITEM );&lt;br /&gt;
&lt;br /&gt;
      begin&lt;br /&gt;
        PUT_FOR_EACH_ITEM( ITEM );&lt;br /&gt;
&lt;br /&gt;
      end	PUT_ARRAY_ITEMS;&lt;br /&gt;
	---------------&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      SET_COL( AT_COL );&lt;br /&gt;
&lt;br /&gt;
      case KIND( ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;{&#039; );&lt;br /&gt;
	 PUT_OBJECT_FIELDS( ITEM );&lt;br /&gt;
	 SET_COL( AT_COL+1 );&lt;br /&gt;
	 PUT( &#039;}&#039; );&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;[&#039; );&lt;br /&gt;
	 PUT_ARRAY_ITEMS( ITEM );&lt;br /&gt;
	 SET_COL( AT_COL+1 );&lt;br /&gt;
	 PUT( &#039;]&#039; );&lt;br /&gt;
&lt;br /&gt;
      when STRING_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;&amp;quot;&#039; &amp;amp; ITEM.all.STR_ACCESS.all &amp;amp; &#039;&amp;quot;&#039; );&lt;br /&gt;
&lt;br /&gt;
      when INTEGER_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( INTEGER&#039;IMAGE( ITEM.all.INT_VAL ) );&lt;br /&gt;
&lt;br /&gt;
      when FLOAT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 declare&lt;br /&gt;
	  package LONG_FLOAT_IO	is new FLOAT_IO( LONG_FLOAT );&lt;br /&gt;
	  begin&lt;br /&gt;
	    LONG_FLOAT_IO.PUT( ITEM.all.FLOAT_VAL );&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when BOOLEAN_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( BOOLEAN&#039;IMAGE( ITEM.all.BOOL_VAL ) );&lt;br /&gt;
&lt;br /&gt;
      when NULL_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &amp;quot;null&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
    end	  LAY_ONE;&lt;br /&gt;
	  -------&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    TEXT_IO.SET_OUTPUT( FILE );&lt;br /&gt;
    LAY_ONE( THE_ITEM, AT_COL=&amp;gt; 1 );&lt;br /&gt;
    TEXT_IO.SET_OUTPUT( TEXT_IO.STANDARD_OUTPUT );&lt;br /&gt;
&lt;br /&gt;
  end	PUT;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---------&lt;br /&gt;
  function		STRING_OF		( THE_ITEM : ITEM)			return STRING&lt;br /&gt;
			---------&lt;br /&gt;
  is&lt;br /&gt;
    TEMP_FILE_NAME	:constant STRING	:= &amp;quot;JSON$$$.tmp&amp;quot;;&lt;br /&gt;
  begin&lt;br /&gt;
		------------------&lt;br /&gt;
		WRITE_ITEM_TO_FILE:&lt;br /&gt;
    declare&lt;br /&gt;
      TEMP_FILE	: TEXT_IO.FILE_TYPE;&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
    begin&lt;br /&gt;
      CREATE( TEMP_FILE, OUT_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      JSON.PUT( TEMP_FILE, THE_ITEM );&lt;br /&gt;
      CLOSE( TEMP_FILE );&lt;br /&gt;
&lt;br /&gt;
    end	WRITE_ITEM_TO_FILE;&lt;br /&gt;
	------------------&lt;br /&gt;
&lt;br /&gt;
		-------------------&lt;br /&gt;
		READ_FILE_TO_STRING:&lt;br /&gt;
    declare&lt;br /&gt;
      package CHAR_IO is new DIRECT_IO( CHARACTER );&lt;br /&gt;
      use CHAR_IO;&lt;br /&gt;
      TEMP_FILE	: CHAR_IO.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      CHAR_IO.OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      declare&lt;br /&gt;
        ITEM_STRING_LENGTH	:constant INTEGER	:= INTEGER( CHAR_IO.SIZE( TEMP_FILE ) );&lt;br /&gt;
        ITEM_STRING		: STRING( 1 .. ITEM_STRING_LENGTH );&lt;br /&gt;
      begin&lt;br /&gt;
        for I in ITEM_STRING&#039;RANGE loop&lt;br /&gt;
	READ( TEMP_FILE, ITEM_STRING( I ) );&lt;br /&gt;
        end loop;&lt;br /&gt;
        DELETE( TEMP_FILE );&lt;br /&gt;
        return  ITEM_STRING;&lt;br /&gt;
      end;&lt;br /&gt;
&lt;br /&gt;
    end	READ_FILE_TO_STRING;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
  end	STRING_OF;&lt;br /&gt;
	---------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------&lt;br /&gt;
  function		ITEM_OF		( THE_STRING :STRING)		return ITEM&lt;br /&gt;
  			-------&lt;br /&gt;
  is&lt;br /&gt;
    TEMP_FILE_NAME	:constant STRING	:= &amp;quot;JSON$$$.tmp&amp;quot;;&lt;br /&gt;
    OUT_ITEM	: ITEM;&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    declare&lt;br /&gt;
      package CHAR_IO is new DIRECT_IO( CHARACTER );&lt;br /&gt;
      use CHAR_IO;&lt;br /&gt;
      TEMP_FILE	: CHAR_IO.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      CREATE( TEMP_FILE, OUT_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      for I in THE_STRING&#039;RANGE loop&lt;br /&gt;
        WRITE( TEMP_FILE, THE_STRING( I ) );&lt;br /&gt;
      end loop;&lt;br /&gt;
      CLOSE( TEMP_FILE );&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
      TEMP_FILE	: JSON.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      TEXT_IO.OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      JSON.GET( TEMP_FILE, OUT_ITEM );&lt;br /&gt;
      OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      DELETE( TEMP_FILE );&lt;br /&gt;
    end;&lt;br /&gt;
    return  OUT_ITEM;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_OF;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--  J S O N   S T R U C T U R E   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----&lt;br /&gt;
  function 		KIND		( OF_ITEM :ITEM )		return ITEM_TYPE&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    return  OF_ITEM.all.KIND;&lt;br /&gt;
&lt;br /&gt;
  end	KIND;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  function 		IS_PRESENT	( KEY :STRING; IN_OBJECT :ITEM )	return BOOLEAN&lt;br /&gt;
  			----------&lt;br /&gt;
  is&lt;br /&gt;
    SEARCH_KEY	: STRING		renames KEY;&lt;br /&gt;
    KEY_SEEN	: BOOLEAN		:= FALSE;&lt;br /&gt;
&lt;br /&gt;
		-------&lt;br /&gt;
    procedure	PROCESS	( THE_KEY	     :STRING;&lt;br /&gt;
			  THE_ITEM     :in out ITEM;&lt;br /&gt;
			  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
			  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
    is		-------&lt;br /&gt;
    begin&lt;br /&gt;
      if  THE_KEY = SEARCH_KEY  then  KEY_SEEN := TRUE;  end if;&lt;br /&gt;
      STOP_PROCESS := KEY_SEEN;&lt;br /&gt;
&lt;br /&gt;
    end	PROCESS;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
    procedure SCAN is new FOR_EACH_JSON_FIELD( PROCESS );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    if  IN_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    SCAN( IN_OBJECT );&lt;br /&gt;
    return  KEY_SEEN;&lt;br /&gt;
&lt;br /&gt;
  end	IS_PRESENT;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
  function		ITEM_BY_KEY	( KEY :STRING; IN_OBJECT :ITEM )	return ITEM&lt;br /&gt;
			-----------&lt;br /&gt;
  is&lt;br /&gt;
    SEARCH_KEY		: STRING		renames KEY;&lt;br /&gt;
    FOUND_ITEM		: ITEM		:= null;&lt;br /&gt;
&lt;br /&gt;
		-------&lt;br /&gt;
    procedure	PROCESS	( THE_KEY	     :STRING;&lt;br /&gt;
			  THE_ITEM     :in out ITEM;&lt;br /&gt;
			  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
			  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
    is		-------&lt;br /&gt;
    begin&lt;br /&gt;
      if  THE_KEY = SEARCH_KEY  then  FOUND_ITEM := THE_ITEM;  end if;&lt;br /&gt;
      STOP_PROCESS := (FOUND_ITEM /= null);&lt;br /&gt;
&lt;br /&gt;
    end	PROCESS;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
    procedure SCAN is new FOR_EACH_JSON_FIELD( PROCESS );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    if  IN_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    SCAN( IN_OBJECT );&lt;br /&gt;
    if  FOUND_ITEM = null  then  raise VALUE_NOT_FOUND;  end if;&lt;br /&gt;
    return  FOUND_ITEM;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_BY_KEY;&lt;br /&gt;
	------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  function		ITEM_VALUE		( OF_ITEM :ITEM )		return VALUE_DATA&lt;br /&gt;
			----------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    case KIND( OF_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM | ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  raise BAD_ITEM_TYPE;&lt;br /&gt;
&lt;br /&gt;
      when STRING_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_STRING	: STRING	renames	OF_ITEM.all.STR_ACCESS.all;&lt;br /&gt;
	    STRING_LENGTH	:constant NATURAL	:= THE_STRING&#039;LENGTH;&lt;br /&gt;
	  begin&lt;br /&gt;
	    return ( STRING_ITEM, STRING_LENGTH, THE_STRING );&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when INTEGER_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( INTEGER_ITEM, 0, OF_ITEM.all.INT_VAL );&lt;br /&gt;
&lt;br /&gt;
      when FLOAT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( FLOAT_ITEM, 0, OF_ITEM.all.FLOAT_VAL );&lt;br /&gt;
&lt;br /&gt;
      when BOOLEAN_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( BOOLEAN_ITEM, 0, OF_ITEM.all.BOOL_VAL );&lt;br /&gt;
&lt;br /&gt;
      when NULL_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( NULL_ITEM, 0 );&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_VALUE;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------------------&lt;br /&gt;
  function		NUMBER_OF_SUB_ITEMS		( IN_ITEM :ITEM )		return NATURAL&lt;br /&gt;
			-------------------&lt;br /&gt;
  is&lt;br /&gt;
    COUNT		: NATURAL	:= 0;&lt;br /&gt;
  begin&lt;br /&gt;
     case KIND( IN_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: OBJECT_FIELD_ACCESS	:= IN_ITEM.all.FIELDS_LIST;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      COUNT := COUNT + 1;&lt;br /&gt;
	      THE_LIST := THE_LIST.all.NEXT;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: LIST_OF_ITEMS	:= IN_ITEM.all.ITEMS_LIST;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      COUNT := COUNT + 1;&lt;br /&gt;
	      THE_LIST := THE_LIST.all.NEXT;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when others =&amp;gt; null;&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
      return COUNT;&lt;br /&gt;
&lt;br /&gt;
  end	NUMBER_OF_SUB_ITEMS;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----&lt;br /&gt;
  procedure		FREE			( THE_ITEM :in out ITEM )&lt;br /&gt;
			----&lt;br /&gt;
  is&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( ITEM_DEFINITION, ITEM );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( OBJECT_FIELD, OBJECT_FIELD_ACCESS );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( ITEM_LIST_ELEMENT, LIST_OF_ITEMS );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( STRING, STRING_ACCESS );&lt;br /&gt;
  begin&lt;br /&gt;
     case KIND( THE_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: OBJECT_FIELD_ACCESS	:= THE_ITEM.all.FIELDS_LIST;&lt;br /&gt;
	    SUITE		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      FREE( THE_LIST.all.FIELD_KEY );&lt;br /&gt;
	      FREE( THE_LIST.all.FIELD_ITEM );&lt;br /&gt;
	      SUITE := THE_LIST.all.NEXT;&lt;br /&gt;
	      FREE( THE_LIST );&lt;br /&gt;
	      THE_LIST := SUITE;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: LIST_OF_ITEMS	:= THE_ITEM.all.ITEMS_LIST;&lt;br /&gt;
	    SUITE		: LIST_OF_ITEMS;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      FREE( THE_LIST.all.LIST_ITEM );&lt;br /&gt;
	      SUITE := THE_LIST.all.NEXT;&lt;br /&gt;
	      FREE( THE_LIST );&lt;br /&gt;
	      THE_LIST := SUITE;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when others =&amp;gt; null;&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
      THE_ITEM.all := ( KIND=&amp;gt; NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  end	FREE;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			------------------&lt;br /&gt;
  procedure		FOR_EACH_JSON_ITEM		( OF_ARRAY :JSON.ITEM )&lt;br /&gt;
			------------------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    if  OF_ARRAY = null  or else  OF_ARRAY.all.KIND /= ARRAY_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      STOP_PROCESS		: BOOLEAN;&lt;br /&gt;
      ITEM_LIST		: LIST_OF_ITEMS	:= OF_ARRAY.all.ITEMS_LIST;&lt;br /&gt;
      LAST_ONE		: BOOLEAN;&lt;br /&gt;
    begin&lt;br /&gt;
      loop&lt;br /&gt;
        exit when  ITEM_LIST = null;&lt;br /&gt;
        LAST_ONE := (ITEM_LIST.all.NEXT = null);&lt;br /&gt;
        APPLY_PROCESS( ITEM_LIST.all.LIST_ITEM, LAST_ONE, STOP_PROCESS );&lt;br /&gt;
        exit when  STOP_PROCESS;&lt;br /&gt;
        ITEM_LIST := ITEM_LIST.all.NEXT;&lt;br /&gt;
      end loop;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
  end	FOR_EACH_JSON_ITEM;&lt;br /&gt;
	------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------------------&lt;br /&gt;
  procedure		FOR_EACH_JSON_FIELD		( OF_OBJECT :JSON.ITEM )&lt;br /&gt;
			-------------------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    if  OF_OBJECT = null  or else  OF_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      FIELDS		: OBJECT_FIELD_ACCESS	:= OF_OBJECT.all.FIELDS_LIST;&lt;br /&gt;
      STOP_PROCESS		: BOOLEAN;&lt;br /&gt;
      LAST_ONE		: BOOLEAN;&lt;br /&gt;
    begin&lt;br /&gt;
      while  FIELDS /= null  loop&lt;br /&gt;
        LAST_ONE := (FIELDS.all.NEXT = null);&lt;br /&gt;
        APPLY_PROCESS( FIELDS.all.FIELD_KEY.all, FIELDS.all.FIELD_ITEM, LAST_ONE, STOP_PROCESS );&lt;br /&gt;
        exit when  STOP_PROCESS;&lt;br /&gt;
        FIELDS := FIELDS.all.NEXT;&lt;br /&gt;
      end loop;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
  end	FOR_EACH_JSON_FIELD;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=74</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=74"/>
		<updated>2025-03-02T12:52:48Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10;&lt;br /&gt;
    font-family:&#039;Nimbus Mono L&#039;;&lt;br /&gt;
    line-height: 1.2&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .kw {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=73</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=MediaWiki:Common.css&amp;diff=73"/>
		<updated>2025-03-02T12:50:32Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
.mw-highlight pre {&lt;br /&gt;
    background-color: black !important;&lt;br /&gt;
    color: lime !important;&lt;br /&gt;
    tab-size:10&lt;br /&gt;
}&lt;br /&gt;
.mw-highlight .kw {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=72</id>
		<title>JSON package</title>
		<link rel="alternate" type="text/html" href="https://ada83.org/wiki/index.php?title=JSON_package&amp;diff=72"/>
		<updated>2025-03-02T12:48:17Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;ada&amp;quot;; style=&amp;quot;font-family:&#039;Nimbus Mono L&#039;;background:black;color:lime;tab-size:10;line-height: 1.2;&amp;quot;&amp;gt;--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre lang=&amp;quot;ada&amp;quot;; style=&amp;quot;font-family:&#039;Nimbus Mono L&#039;;background:black;color:lime;tab-size:10;line-height: 1.2;&amp;quot;&amp;gt;--	JSON.ADS	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with TEXT_IO;&lt;br /&gt;
						----&lt;br /&gt;
			package			JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
  type ITEM		is private;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_TYPE		is ( OBJECT_ITEM, ARRAY_ITEM,&lt;br /&gt;
			     STRING_ITEM, INTEGER_ITEM, FLOAT_ITEM, BOOLEAN_ITEM, NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  subtype TERMINAL_TYPE	is ITEM_TYPE range STRING_ITEM .. NULL_ITEM;&lt;br /&gt;
&lt;br /&gt;
  subtype FILE_TYPE		is TEXT_IO.FILE_TYPE;&lt;br /&gt;
&lt;br /&gt;
  MAX_STRING_LENGTH		:constant NATURAL	:= 2**15-1;&lt;br /&gt;
  subtype STRING_LENGTH	is NATURAL range 0 .. MAX_STRING_LENGTH;&lt;br /&gt;
&lt;br /&gt;
  type VALUE_DATA (KIND :TERMINAL_TYPE := NULL_ITEM; LENGTH :STRING_LENGTH := 0)&lt;br /&gt;
			is record&lt;br /&gt;
			  case  KIND&lt;br /&gt;
			  is&lt;br /&gt;
			    when STRING_ITEM	=&amp;gt; STRING_VAL	:STRING( 1 .. LENGTH );&lt;br /&gt;
			    when INTEGER_ITEM	=&amp;gt; INT_VAL	:INTEGER;&lt;br /&gt;
			    when FLOAT_ITEM		=&amp;gt; FLOAT_VAL	:LONG_FLOAT;&lt;br /&gt;
			    when BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	:BOOLEAN;&lt;br /&gt;
			    when NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I / O&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  procedure GET			( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM );&lt;br /&gt;
  procedure PUT			( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM );&lt;br /&gt;
  function  STRING_OF		( THE_ITEM :ITEM)				return STRING;&lt;br /&gt;
  function  ITEM_OF			( THE_STRING :STRING)			return ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				--  J S O N   I T E M   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  KIND			( OF_ITEM :ITEM )				return ITEM_TYPE;&lt;br /&gt;
  function  IS_PRESENT		( KEY :STRING; IN_OBJECT :ITEM )		return BOOLEAN;&lt;br /&gt;
  function  ITEM_BY_KEY		( KEY :STRING; IN_OBJECT :ITEM )		return ITEM;&lt;br /&gt;
  function  ITEM_VALUE		( OF_ITEM :ITEM )				return VALUE_DATA;&lt;br /&gt;
  function  NUMBER_OF_SUB_ITEMS	( IN_ITEM :ITEM )				return NATURAL;&lt;br /&gt;
  procedure FREE			( THE_ITEM :in out ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_ITEM	( OF_ARRAY :ITEM );&lt;br /&gt;
&lt;br /&gt;
  generic&lt;br /&gt;
    with procedure APPLY_PROCESS ( KEY :STRING; ON_ITEM :in out ITEM; LAST_ONE :in BOOLEAN; STOP_PROCESS :out BOOLEAN );&lt;br /&gt;
  procedure FOR_EACH_JSON_FIELD	( OF_OBJECT :ITEM );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  SYNTAX_ERROR, BAD_ITEM_TYPE, VALUE_NOT_FOUND	: exception;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
										pragma PAGE;&lt;br /&gt;
private&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :JSON.ITEM_TYPE);&lt;br /&gt;
  type ITEM			is access ITEM_DEFINITION;&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD;&lt;br /&gt;
  type OBJECT_FIELD_ACCESS		is access OBJECT_FIELD;&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT;&lt;br /&gt;
  type LIST_OF_ITEMS		is access ITEM_LIST_ELEMENT;&lt;br /&gt;
&lt;br /&gt;
  type STRING_ACCESS		is access STRING;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_DEFINITION (KIND :ITEM_TYPE)	is record&lt;br /&gt;
				  case KIND is&lt;br /&gt;
				  when  OBJECT_ITEM		=&amp;gt; FIELDS_LIST	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				  when  ARRAY_ITEM		=&amp;gt; ITEMS_LIST	: LIST_OF_ITEMS;&lt;br /&gt;
				  when  STRING_ITEM		=&amp;gt; STR_ACCESS	: STRING_ACCESS;&lt;br /&gt;
				  when  INTEGER_ITEM	=&amp;gt; INT_VAL	: INTEGER;&lt;br /&gt;
				  when  FLOAT_ITEM		=&amp;gt; FLOAT_VAL	: LONG_FLOAT;&lt;br /&gt;
				  when  BOOLEAN_ITEM	=&amp;gt; BOOL_VAL	: BOOLEAN;&lt;br /&gt;
				  when  NULL_ITEM		=&amp;gt; null;&lt;br /&gt;
				  end case;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type OBJECT_FIELD			is record&lt;br /&gt;
				  FIELD_KEY	: STRING_ACCESS;&lt;br /&gt;
				  FIELD_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  type ITEM_LIST_ELEMENT		is record&lt;br /&gt;
				  LIST_ITEM	: ITEM;&lt;br /&gt;
				  NEXT		: LIST_OF_ITEMS;&lt;br /&gt;
				end record;&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The package body :&lt;br /&gt;
&amp;lt;pre style=&amp;quot;font-family:&#039;Noto Mono&#039;;background:black;color:lime;tab-size:10;line-height: 1;&amp;quot;&amp;gt;&lt;br /&gt;
--	JSON.ADB	VINCENT MORIN	25/2/2025		UNIVERSITE DE BRETAGNE OCCIDENTALE	(UBO)&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with UNCHECKED_DEALLOCATION, DIRECT_IO;&lt;br /&gt;
&lt;br /&gt;
						----&lt;br /&gt;
			package body		JSON&lt;br /&gt;
						----&lt;br /&gt;
is&lt;br /&gt;
&lt;br /&gt;
  DEBUG		: BOOLEAN		:= FALSE;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		GET		( FILE :in JSON.FILE_TYPE; THE_ITEM :out ITEM )&lt;br /&gt;
  			---&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
&lt;br /&gt;
		------&lt;br /&gt;
  package		PARSER&lt;br /&gt;
		------&lt;br /&gt;
  is&lt;br /&gt;
&lt;br /&gt;
    function  READ_OBJECT		return JSON.ITEM;&lt;br /&gt;
&lt;br /&gt;
	------&lt;br /&gt;
  end	PARSER;&lt;br /&gt;
	------&lt;br /&gt;
&lt;br /&gt;
  package body				PARSER&lt;br /&gt;
					------&lt;br /&gt;
  is&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    type TOKEN_TYPE		is ( END_TOKEN, LEFT_ACCOLADE, RIGHT_ACCOLADE, LEFT_CROCHET, RIGHT_CROCHET,&lt;br /&gt;
			     COMMA, COLON, CHAINE, ENTIER, FLOTTANT );&lt;br /&gt;
&lt;br /&gt;
    type TOKEN (KIND :TOKEN_TYPE := END_TOKEN)	is record&lt;br /&gt;
			  case KIND is&lt;br /&gt;
			  when CHAINE	=&amp;gt; STR_LENGTH	: NATURAL;&lt;br /&gt;
			  when ENTIER	=&amp;gt; INT_VALUE	: INTEGER;&lt;br /&gt;
			  when FLOTTANT	=&amp;gt; FLOAT_VALUE	: LONG_FLOAT;&lt;br /&gt;
			  when others	=&amp;gt; null;&lt;br /&gt;
			  end case;&lt;br /&gt;
			end record;&lt;br /&gt;
&lt;br /&gt;
    TOKEN_BUFFER		: STRING( 1 .. 512 );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--------------------&lt;br /&gt;
  procedure		PROCESS_SYNTAX_ERROR		( ENCOUNTERED, EXPECTED : TOKEN_TYPE := END_TOKEN )&lt;br /&gt;
  			--------------------&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
  begin&lt;br /&gt;
    PUT( &amp;quot;syntax error ! (&amp;quot; &amp;amp; COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) )&lt;br /&gt;
		  &amp;amp; &#039;:&#039; &amp;amp; COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 ) &amp;amp; &amp;quot;) : &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    if  ENCOUNTERED = END_TOKEN  and  EXPECTED = END_TOKEN&lt;br /&gt;
    then&lt;br /&gt;
      PUT_LINE( &amp;quot;unexpected end of file &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      if  EXPECTED /= END_TOKEN&lt;br /&gt;
      then&lt;br /&gt;
        PUT( &amp;quot;expected &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( EXPECTED ) );&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
      if  ENCOUNTERED /= END_TOKEN&lt;br /&gt;
      then&lt;br /&gt;
        PUT_LINE( &amp;quot; encountered &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( ENCOUNTERED ) );&lt;br /&gt;
      else&lt;br /&gt;
        NEW_LINE;&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	PROCESS_SYNTAX_ERROR;&lt;br /&gt;
	--------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		GET			( THE_TOKEN :out TOKEN )&lt;br /&gt;
			---&lt;br /&gt;
  is&lt;br /&gt;
    use TEXT_IO;&lt;br /&gt;
    C	: CHARACTER;&lt;br /&gt;
  begin&lt;br /&gt;
    THE_TOKEN := ( KIND=&amp;gt; END_TOKEN );&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
			SKIP_BLANKS:&lt;br /&gt;
    loop&lt;br /&gt;
      if  END_OF_FILE( FILE )  then  return;  end if;&lt;br /&gt;
      GET( FILE, C );&lt;br /&gt;
      exit when  not (C = &#039; &#039;  or  C = ASCII.HT);&lt;br /&gt;
      if  END_OF_FILE( FILE )  then  return;  end if;&lt;br /&gt;
&lt;br /&gt;
    end loop	SKIP_BLANKS;&lt;br /&gt;
		-----------&lt;br /&gt;
&lt;br /&gt;
    if  DEBUG&lt;br /&gt;
    then&lt;br /&gt;
      PUT( C &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
	   &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL(FILE )-1 ) &amp;amp; &#039;.&#039; );&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
    case  C  is&lt;br /&gt;
&lt;br /&gt;
      when  &#039;{&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; LEFT_ACCOLADE  );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;}&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; RIGHT_ACCOLADE );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;[&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; LEFT_CROCHET   );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;]&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; RIGHT_CROCHET  );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;,&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; COMMA );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;:&#039;&lt;br /&gt;
	  =&amp;gt; THE_TOKEN := ( KIND=&amp;gt; COLON );&lt;br /&gt;
&lt;br /&gt;
      when  &#039;&amp;quot;&#039;&lt;br /&gt;
	  =&amp;gt;		------------&lt;br /&gt;
			GET_A_STRING:&lt;br /&gt;
        declare&lt;br /&gt;
	LEN		: NATURAL		:= 0;&lt;br /&gt;
	INDEX_BUFFER	: POSITIVE	:= 1;&lt;br /&gt;
        begin&lt;br /&gt;
	loop&lt;br /&gt;
	  GET( FILE, C );&lt;br /&gt;
&lt;br /&gt;
	  if  DEBUG&lt;br /&gt;
	  then&lt;br /&gt;
	    PUT( C &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
		 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 ) &amp;amp; &#039;.&#039; );&lt;br /&gt;
	  end if;&lt;br /&gt;
&lt;br /&gt;
            exit when  C = &#039;&amp;quot;&#039;;&lt;br /&gt;
	  TOKEN_BUFFER( INDEX_BUFFER ) := C;&lt;br /&gt;
	  LEN := LEN + 1;&lt;br /&gt;
	  INDEX_BUFFER := INDEX_BUFFER + 1;&lt;br /&gt;
	end loop;&lt;br /&gt;
	THE_TOKEN := ( KIND=&amp;gt; CHAINE, STR_LENGTH=&amp;gt; LEN );&lt;br /&gt;
&lt;br /&gt;
        end	GET_A_STRING;&lt;br /&gt;
		------------&lt;br /&gt;
&lt;br /&gt;
      when  others&lt;br /&gt;
	  =&amp;gt; raise SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end case;&lt;br /&gt;
&lt;br /&gt;
    if  DEBUG&lt;br /&gt;
    then&lt;br /&gt;
      PUT( &amp;quot;token &amp;quot; &amp;amp; TOKEN_TYPE&#039;IMAGE( THE_TOKEN.KIND ) &amp;amp; &amp;quot; at&amp;quot;&lt;br /&gt;
	 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.LINE( FILE ) ) &amp;amp; &#039;:&#039;&lt;br /&gt;
	 &amp;amp; TEXT_IO.COUNT&#039;IMAGE( TEXT_IO.COL( FILE )-1 )&lt;br /&gt;
         );&lt;br /&gt;
      if THE_TOKEN.KIND = CHAINE&lt;br /&gt;
      then  PUT_LINE( &amp;quot;  &amp;quot; &amp;amp; &#039;&amp;quot;&#039; &amp;amp; TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH ) &amp;amp; &#039;&amp;quot;&#039; );&lt;br /&gt;
      else  NEW_LINE;&lt;br /&gt;
      end if;&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
  exception&lt;br /&gt;
    when END_ERROR | SYNTAX_ERROR =&amp;gt; PROCESS_SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	GET;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  procedure		GET_VERIFY	( WHAT_IS_EXPECTED :TOKEN_TYPE; THE_TOKEN :out TOKEN )&lt;br /&gt;
			----------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    GET( THE_TOKEN );&lt;br /&gt;
    if  THE_TOKEN.KIND /= WHAT_IS_EXPECTED&lt;br /&gt;
    then&lt;br /&gt;
      PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; WHAT_IS_EXPECTED );&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
  end	GET_VERIFY;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  function  GET_OBJECT	return JSON.ITEM;&lt;br /&gt;
  function  GET_ARRAY	return JSON.ITEM;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--------&lt;br /&gt;
  function		GET_ITEM		( THE_TOKEN :TOKEN )	return JSON.ITEM&lt;br /&gt;
			--------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
&lt;br /&gt;
    case  THE_TOKEN.KIND  is&lt;br /&gt;
&lt;br /&gt;
      when  LEFT_ACCOLADE&lt;br /&gt;
	  =&amp;gt; return GET_OBJECT;&lt;br /&gt;
&lt;br /&gt;
      when  LEFT_CROCHET&lt;br /&gt;
	  =&amp;gt; return GET_ARRAY;&lt;br /&gt;
&lt;br /&gt;
      when  CHAINE&lt;br /&gt;
 	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; STRING_ITEM,&lt;br /&gt;
				    STR_ACCESS=&amp;gt; new STRING&#039;(TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH )) );&lt;br /&gt;
&lt;br /&gt;
      when  ENTIER&lt;br /&gt;
	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; INTEGER_ITEM, INT_VAL=&amp;gt; THE_TOKEN.INT_VALUE );&lt;br /&gt;
&lt;br /&gt;
      when  FLOTTANT&lt;br /&gt;
	  =&amp;gt; return new ITEM_DEFINITION&#039;( KIND=&amp;gt; FLOAT_ITEM, FLOAT_VAL=&amp;gt; THE_TOKEN.FLOAT_VALUE );&lt;br /&gt;
&lt;br /&gt;
      when  others&lt;br /&gt;
	  =&amp;gt; raise SYNTAX_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end case;&lt;br /&gt;
&lt;br /&gt;
  exception&lt;br /&gt;
    when SYNTAX_ERROR&lt;br /&gt;
         =&amp;gt; PROCESS_SYNTAX_ERROR( THE_TOKEN.KIND );&lt;br /&gt;
	  raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
  end	GET_ITEM;&lt;br /&gt;
	--------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
    function		GET_OBJECT		return JSON.ITEM&lt;br /&gt;
			----------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN		: TOKEN;&lt;br /&gt;
      FIELDS_LIST_HEAD,&lt;br /&gt;
      FIELDS_LIST_LAST	: OBJECT_FIELD_ACCESS	:= null;&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = RIGHT_ACCOLADE  then  return new ITEM_DEFINITION&#039;( OBJECT_ITEM, null );  end if;&lt;br /&gt;
      if  THE_TOKEN.KIND /= CHAINE  then  PROCESS_SYNTAX_ERROR;  end if;&lt;br /&gt;
&lt;br /&gt;
      loop&lt;br /&gt;
&lt;br /&gt;
        declare&lt;br /&gt;
	KEY	: STRING_ACCESS		:= new STRING&#039;(TOKEN_BUFFER( 1 .. THE_TOKEN.STR_LENGTH ));&lt;br /&gt;
	OFA	: OBJECT_FIELD_ACCESS;&lt;br /&gt;
        begin&lt;br /&gt;
	GET_VERIFY( COLON, THE_TOKEN );&lt;br /&gt;
	GET( THE_TOKEN );&lt;br /&gt;
	OFA := new OBJECT_FIELD&#039;( KEY, GET_ITEM( THE_TOKEN ), null );&lt;br /&gt;
&lt;br /&gt;
	if  FIELDS_LIST_HEAD = null  then&lt;br /&gt;
	  FIELDS_LIST_HEAD := OFA; FIELDS_LIST_LAST := OFA;&lt;br /&gt;
	else&lt;br /&gt;
	  FIELDS_LIST_LAST.all.NEXT := OFA; FIELDS_LIST_LAST := OFA;&lt;br /&gt;
	end if;&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        GET( THE_TOKEN );&lt;br /&gt;
        if  THE_TOKEN.KIND = COMMA&lt;br /&gt;
        then&lt;br /&gt;
	GET_VERIFY( CHAINE, THE_TOKEN );&lt;br /&gt;
        else&lt;br /&gt;
	if  THE_TOKEN.KIND /= RIGHT_ACCOLADE&lt;br /&gt;
	then&lt;br /&gt;
	  PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; RIGHT_ACCOLADE );&lt;br /&gt;
	end if;&lt;br /&gt;
	exit;&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
      end loop;&lt;br /&gt;
&lt;br /&gt;
      return new ITEM_DEFINITION&#039;( OBJECT_ITEM, FIELDS_LIST_HEAD );&lt;br /&gt;
&lt;br /&gt;
    end	GET_OBJECT;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---------&lt;br /&gt;
    function		GET_ARRAY			return JSON.ITEM&lt;br /&gt;
			---------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN		: TOKEN;&lt;br /&gt;
      STRUC_LIST_HEAD,&lt;br /&gt;
      STRUC_LIST_LAST	: LIST_OF_ITEMS	:= null;&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = RIGHT_CROCHET  then  return new ITEM_DEFINITION&#039;( ARRAY_ITEM, null );  end if;&lt;br /&gt;
&lt;br /&gt;
			-------------&lt;br /&gt;
			PROCESS_ITEMS:&lt;br /&gt;
      loop&lt;br /&gt;
&lt;br /&gt;
        declare&lt;br /&gt;
	LOI	: LIST_OF_ITEMS	:= new ITEM_LIST_ELEMENT&#039;( GET_ITEM( THE_TOKEN ), null );&lt;br /&gt;
        begin&lt;br /&gt;
	if  STRUC_LIST_HEAD = null  then&lt;br /&gt;
	  STRUC_LIST_HEAD := LOI; STRUC_LIST_LAST := LOI;&lt;br /&gt;
	else&lt;br /&gt;
	  STRUC_LIST_LAST.all.NEXT := LOI; STRUC_LIST_LAST := LOI;&lt;br /&gt;
	end if;&lt;br /&gt;
        end;&lt;br /&gt;
&lt;br /&gt;
        GET( THE_TOKEN );&lt;br /&gt;
        if  THE_TOKEN.KIND = COMMA&lt;br /&gt;
        then&lt;br /&gt;
	GET( THE_TOKEN );&lt;br /&gt;
        else&lt;br /&gt;
	if  THE_TOKEN.KIND = RIGHT_CROCHET&lt;br /&gt;
	then  exit PROCESS_ITEMS;&lt;br /&gt;
	else  PROCESS_SYNTAX_ERROR( ENCOUNTERED=&amp;gt; THE_TOKEN.KIND, EXPECTED=&amp;gt; RIGHT_CROCHET );&lt;br /&gt;
	end if;&lt;br /&gt;
        end if;&lt;br /&gt;
&lt;br /&gt;
      end loop	PROCESS_ITEMS;&lt;br /&gt;
		-------------&lt;br /&gt;
&lt;br /&gt;
      return new ITEM_DEFINITION&#039;( ARRAY_ITEM, STRUC_LIST_HEAD );&lt;br /&gt;
&lt;br /&gt;
    end	GET_ARRAY;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
    function		READ_OBJECT		return JSON.ITEM&lt;br /&gt;
  			-----------&lt;br /&gt;
    is&lt;br /&gt;
      THE_TOKEN	: TOKEN;&lt;br /&gt;
    begin&lt;br /&gt;
      GET( THE_TOKEN );&lt;br /&gt;
      if  THE_TOKEN.KIND = LEFT_ACCOLADE  then&lt;br /&gt;
        return GET_OBJECT;&lt;br /&gt;
      else  raise SYNTAX_ERROR;&lt;br /&gt;
      end if;&lt;br /&gt;
&lt;br /&gt;
    exception&lt;br /&gt;
      when SYNTAX_ERROR&lt;br /&gt;
	  =&amp;gt; PROCESS_SYNTAX_ERROR;&lt;br /&gt;
	     raise PROGRAM_ERROR;&lt;br /&gt;
&lt;br /&gt;
    end	READ_OBJECT;&lt;br /&gt;
	-----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		------&lt;br /&gt;
  end		PARSER;&lt;br /&gt;
		------&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    THE_ITEM := PARSER.READ_OBJECT;&lt;br /&gt;
&lt;br /&gt;
  end	GET;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
			---&lt;br /&gt;
  procedure		PUT		( FILE :in out JSON.FILE_TYPE; THE_ITEM :ITEM )&lt;br /&gt;
			---&lt;br /&gt;
  is&lt;br /&gt;
			  -------&lt;br /&gt;
    procedure		  LAY_ONE		( ITEM :JSON.ITEM; AT_COL :TEXT_IO.COUNT )&lt;br /&gt;
			  -------&lt;br /&gt;
    is&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
			    -----------------&lt;br /&gt;
      procedure		    PUT_OBJECT_FIELDS	( OF_OBJECT :JSON.ITEM )&lt;br /&gt;
			    -----------------&lt;br /&gt;
      is&lt;br /&gt;
			      -----------------&lt;br /&gt;
        procedure		      PROCESS_ONE_FIELD	( KEY	     :STRING;&lt;br /&gt;
						  ITEM	     :in out JSON.ITEM;&lt;br /&gt;
						  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
						  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
			      -----------------&lt;br /&gt;
        is&lt;br /&gt;
        begin&lt;br /&gt;
	SET_COL( AT_COL+2 );&lt;br /&gt;
	PUT( &#039;&amp;quot;&#039; &amp;amp; KEY &amp;amp; &#039;&amp;quot;&#039; &amp;amp; &amp;quot; : &amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	LAY_ONE( ITEM, TEXT_IO.COL );&lt;br /&gt;
&lt;br /&gt;
	if  not LAST_ONE  then  PUT( &#039;,&#039; );  end if; NEW_LINE;&lt;br /&gt;
	STOP_PROCESS := FALSE;&lt;br /&gt;
&lt;br /&gt;
        end	  PROCESS_ONE_FIELD;&lt;br /&gt;
		  -----------------&lt;br /&gt;
&lt;br /&gt;
        procedure PUT_FOR_EACH_FIELD is new FOR_EACH_JSON_FIELD( PROCESS_ONE_FIELD );&lt;br /&gt;
&lt;br /&gt;
      begin&lt;br /&gt;
	PUT_FOR_EACH_FIELD( OF_OBJECT );&lt;br /&gt;
&lt;br /&gt;
      end	PUT_OBJECT_FIELDS;&lt;br /&gt;
	-----------------&lt;br /&gt;
&lt;br /&gt;
			    ---------------&lt;br /&gt;
      procedure		    PUT_ARRAY_ITEMS	(THE_ITEM :JSON.ITEM )&lt;br /&gt;
			    ---------------&lt;br /&gt;
      is&lt;br /&gt;
        START_COL	: TEXT_IO.COUNT	:= TEXT_IO.COL;&lt;br /&gt;
&lt;br /&gt;
			      ----------------&lt;br /&gt;
	procedure		      PROCESS_ONE_ITEM	( ITEM	     :in out JSON.ITEM;&lt;br /&gt;
						  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
						  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
			      ----------------&lt;br /&gt;
	is&lt;br /&gt;
	begin&lt;br /&gt;
	  NEW_LINE;&lt;br /&gt;
&lt;br /&gt;
	  LAY_ONE( ITEM, START_COL+2 );&lt;br /&gt;
&lt;br /&gt;
	  if  not LAST_ONE  then  PUT( &#039;,&#039; );  end if;&lt;br /&gt;
	  STOP_PROCESS := FALSE;&lt;br /&gt;
&lt;br /&gt;
	end	    PROCESS_ONE_ITEM;&lt;br /&gt;
		    ----------------&lt;br /&gt;
&lt;br /&gt;
	procedure PUT_FOR_EACH_ITEM is new FOR_EACH_JSON_ITEM( PROCESS_ONE_ITEM );&lt;br /&gt;
&lt;br /&gt;
      begin&lt;br /&gt;
        PUT_FOR_EACH_ITEM( ITEM );&lt;br /&gt;
&lt;br /&gt;
      end	PUT_ARRAY_ITEMS;&lt;br /&gt;
	---------------&lt;br /&gt;
&lt;br /&gt;
    begin&lt;br /&gt;
      SET_COL( AT_COL );&lt;br /&gt;
&lt;br /&gt;
      case KIND( ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;{&#039; );&lt;br /&gt;
	 PUT_OBJECT_FIELDS( ITEM );&lt;br /&gt;
	 SET_COL( AT_COL+1 );&lt;br /&gt;
	 PUT( &#039;}&#039; );&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;[&#039; );&lt;br /&gt;
	 PUT_ARRAY_ITEMS( ITEM );&lt;br /&gt;
	 SET_COL( AT_COL+1 );&lt;br /&gt;
	 PUT( &#039;]&#039; );&lt;br /&gt;
&lt;br /&gt;
      when STRING_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &#039;&amp;quot;&#039; &amp;amp; ITEM.all.STR_ACCESS.all &amp;amp; &#039;&amp;quot;&#039; );&lt;br /&gt;
&lt;br /&gt;
      when INTEGER_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( INTEGER&#039;IMAGE( ITEM.all.INT_VAL ) );&lt;br /&gt;
&lt;br /&gt;
      when FLOAT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 declare&lt;br /&gt;
	  package LONG_FLOAT_IO	is new FLOAT_IO( LONG_FLOAT );&lt;br /&gt;
	  begin&lt;br /&gt;
	    LONG_FLOAT_IO.PUT( ITEM.all.FLOAT_VAL );&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when BOOLEAN_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( BOOLEAN&#039;IMAGE( ITEM.all.BOOL_VAL ) );&lt;br /&gt;
&lt;br /&gt;
      when NULL_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	 PUT( &amp;quot;null&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
    end	  LAY_ONE;&lt;br /&gt;
	  -------&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    TEXT_IO.SET_OUTPUT( FILE );&lt;br /&gt;
    LAY_ONE( THE_ITEM, AT_COL=&amp;gt; 1 );&lt;br /&gt;
    TEXT_IO.SET_OUTPUT( TEXT_IO.STANDARD_OUTPUT );&lt;br /&gt;
&lt;br /&gt;
  end	PUT;&lt;br /&gt;
	---&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			---------&lt;br /&gt;
  function		STRING_OF		( THE_ITEM : ITEM)			return STRING&lt;br /&gt;
			---------&lt;br /&gt;
  is&lt;br /&gt;
    TEMP_FILE_NAME	:constant STRING	:= &amp;quot;JSON$$$.tmp&amp;quot;;&lt;br /&gt;
  begin&lt;br /&gt;
		------------------&lt;br /&gt;
		WRITE_ITEM_TO_FILE:&lt;br /&gt;
    declare&lt;br /&gt;
      TEMP_FILE	: TEXT_IO.FILE_TYPE;&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
    begin&lt;br /&gt;
      CREATE( TEMP_FILE, OUT_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      JSON.PUT( TEMP_FILE, THE_ITEM );&lt;br /&gt;
      CLOSE( TEMP_FILE );&lt;br /&gt;
&lt;br /&gt;
    end	WRITE_ITEM_TO_FILE;&lt;br /&gt;
	------------------&lt;br /&gt;
&lt;br /&gt;
		-------------------&lt;br /&gt;
		READ_FILE_TO_STRING:&lt;br /&gt;
    declare&lt;br /&gt;
      package CHAR_IO is new DIRECT_IO( CHARACTER );&lt;br /&gt;
      use CHAR_IO;&lt;br /&gt;
      TEMP_FILE	: CHAR_IO.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      CHAR_IO.OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      declare&lt;br /&gt;
        ITEM_STRING_LENGTH	:constant INTEGER	:= INTEGER( CHAR_IO.SIZE( TEMP_FILE ) );&lt;br /&gt;
        ITEM_STRING		: STRING( 1 .. ITEM_STRING_LENGTH );&lt;br /&gt;
      begin&lt;br /&gt;
        for I in ITEM_STRING&#039;RANGE loop&lt;br /&gt;
	READ( TEMP_FILE, ITEM_STRING( I ) );&lt;br /&gt;
        end loop;&lt;br /&gt;
        DELETE( TEMP_FILE );&lt;br /&gt;
        return  ITEM_STRING;&lt;br /&gt;
      end;&lt;br /&gt;
&lt;br /&gt;
    end	READ_FILE_TO_STRING;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
  end	STRING_OF;&lt;br /&gt;
	---------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------&lt;br /&gt;
  function		ITEM_OF		( THE_STRING :STRING)		return ITEM&lt;br /&gt;
  			-------&lt;br /&gt;
  is&lt;br /&gt;
    TEMP_FILE_NAME	:constant STRING	:= &amp;quot;JSON$$$.tmp&amp;quot;;&lt;br /&gt;
    OUT_ITEM	: ITEM;&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    declare&lt;br /&gt;
      package CHAR_IO is new DIRECT_IO( CHARACTER );&lt;br /&gt;
      use CHAR_IO;&lt;br /&gt;
      TEMP_FILE	: CHAR_IO.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      CREATE( TEMP_FILE, OUT_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      for I in THE_STRING&#039;RANGE loop&lt;br /&gt;
        WRITE( TEMP_FILE, THE_STRING( I ) );&lt;br /&gt;
      end loop;&lt;br /&gt;
      CLOSE( TEMP_FILE );&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      use TEXT_IO;&lt;br /&gt;
      TEMP_FILE	: JSON.FILE_TYPE;&lt;br /&gt;
    begin&lt;br /&gt;
      TEXT_IO.OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      JSON.GET( TEMP_FILE, OUT_ITEM );&lt;br /&gt;
      OPEN( TEMP_FILE, IN_FILE, TEMP_FILE_NAME );&lt;br /&gt;
      DELETE( TEMP_FILE );&lt;br /&gt;
    end;&lt;br /&gt;
    return  OUT_ITEM;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_OF;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			--  J S O N   S T R U C T U R E   I N T E R A C T I O N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----&lt;br /&gt;
  function 		KIND		( OF_ITEM :ITEM )		return ITEM_TYPE&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    return  OF_ITEM.all.KIND;&lt;br /&gt;
&lt;br /&gt;
  end	KIND;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  function 		IS_PRESENT	( KEY :STRING; IN_OBJECT :ITEM )	return BOOLEAN&lt;br /&gt;
  			----------&lt;br /&gt;
  is&lt;br /&gt;
    SEARCH_KEY	: STRING		renames KEY;&lt;br /&gt;
    KEY_SEEN	: BOOLEAN		:= FALSE;&lt;br /&gt;
&lt;br /&gt;
		-------&lt;br /&gt;
    procedure	PROCESS	( THE_KEY	     :STRING;&lt;br /&gt;
			  THE_ITEM     :in out ITEM;&lt;br /&gt;
			  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
			  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
    is		-------&lt;br /&gt;
    begin&lt;br /&gt;
      if  THE_KEY = SEARCH_KEY  then  KEY_SEEN := TRUE;  end if;&lt;br /&gt;
      STOP_PROCESS := KEY_SEEN;&lt;br /&gt;
&lt;br /&gt;
    end	PROCESS;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
    procedure SCAN is new FOR_EACH_JSON_FIELD( PROCESS );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    if  IN_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    SCAN( IN_OBJECT );&lt;br /&gt;
    return  KEY_SEEN;&lt;br /&gt;
&lt;br /&gt;
  end	IS_PRESENT;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-----------&lt;br /&gt;
  function		ITEM_BY_KEY	( KEY :STRING; IN_OBJECT :ITEM )	return ITEM&lt;br /&gt;
			-----------&lt;br /&gt;
  is&lt;br /&gt;
    SEARCH_KEY		: STRING		renames KEY;&lt;br /&gt;
    FOUND_ITEM		: ITEM		:= null;&lt;br /&gt;
&lt;br /&gt;
		-------&lt;br /&gt;
    procedure	PROCESS	( THE_KEY	     :STRING;&lt;br /&gt;
			  THE_ITEM     :in out ITEM;&lt;br /&gt;
			  LAST_ONE     :in BOOLEAN;&lt;br /&gt;
			  STOP_PROCESS :out BOOLEAN )&lt;br /&gt;
    is		-------&lt;br /&gt;
    begin&lt;br /&gt;
      if  THE_KEY = SEARCH_KEY  then  FOUND_ITEM := THE_ITEM;  end if;&lt;br /&gt;
      STOP_PROCESS := (FOUND_ITEM /= null);&lt;br /&gt;
&lt;br /&gt;
    end	PROCESS;&lt;br /&gt;
	-------&lt;br /&gt;
&lt;br /&gt;
    procedure SCAN is new FOR_EACH_JSON_FIELD( PROCESS );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  begin&lt;br /&gt;
    if  IN_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    SCAN( IN_OBJECT );&lt;br /&gt;
    if  FOUND_ITEM = null  then  raise VALUE_NOT_FOUND;  end if;&lt;br /&gt;
    return  FOUND_ITEM;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_BY_KEY;&lt;br /&gt;
	------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----------&lt;br /&gt;
  function		ITEM_VALUE		( OF_ITEM :ITEM )		return VALUE_DATA&lt;br /&gt;
			----------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    case KIND( OF_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM | ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  raise BAD_ITEM_TYPE;&lt;br /&gt;
&lt;br /&gt;
      when STRING_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_STRING	: STRING	renames	OF_ITEM.all.STR_ACCESS.all;&lt;br /&gt;
	    STRING_LENGTH	:constant NATURAL	:= THE_STRING&#039;LENGTH;&lt;br /&gt;
	  begin&lt;br /&gt;
	    return ( STRING_ITEM, STRING_LENGTH, THE_STRING );&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when INTEGER_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( INTEGER_ITEM, 0, OF_ITEM.all.INT_VAL );&lt;br /&gt;
&lt;br /&gt;
      when FLOAT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( FLOAT_ITEM, 0, OF_ITEM.all.FLOAT_VAL );&lt;br /&gt;
&lt;br /&gt;
      when BOOLEAN_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( BOOLEAN_ITEM, 0, OF_ITEM.all.BOOL_VAL );&lt;br /&gt;
&lt;br /&gt;
      when NULL_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  return ( NULL_ITEM, 0 );&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
  end	ITEM_VALUE;&lt;br /&gt;
	----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------------------&lt;br /&gt;
  function		NUMBER_OF_SUB_ITEMS		( IN_ITEM :ITEM )		return NATURAL&lt;br /&gt;
			-------------------&lt;br /&gt;
  is&lt;br /&gt;
    COUNT		: NATURAL	:= 0;&lt;br /&gt;
  begin&lt;br /&gt;
     case KIND( IN_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: OBJECT_FIELD_ACCESS	:= IN_ITEM.all.FIELDS_LIST;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      COUNT := COUNT + 1;&lt;br /&gt;
	      THE_LIST := THE_LIST.all.NEXT;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: LIST_OF_ITEMS	:= IN_ITEM.all.ITEMS_LIST;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      COUNT := COUNT + 1;&lt;br /&gt;
	      THE_LIST := THE_LIST.all.NEXT;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when others =&amp;gt; null;&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
      return COUNT;&lt;br /&gt;
&lt;br /&gt;
  end	NUMBER_OF_SUB_ITEMS;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			----&lt;br /&gt;
  procedure		FREE			( THE_ITEM :in out ITEM )&lt;br /&gt;
			----&lt;br /&gt;
  is&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( ITEM_DEFINITION, ITEM );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( OBJECT_FIELD, OBJECT_FIELD_ACCESS );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( ITEM_LIST_ELEMENT, LIST_OF_ITEMS );&lt;br /&gt;
    procedure FREE is new UNCHECKED_DEALLOCATION( STRING, STRING_ACCESS );&lt;br /&gt;
  begin&lt;br /&gt;
     case KIND( THE_ITEM ) is&lt;br /&gt;
&lt;br /&gt;
      when OBJECT_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: OBJECT_FIELD_ACCESS	:= THE_ITEM.all.FIELDS_LIST;&lt;br /&gt;
	    SUITE		: OBJECT_FIELD_ACCESS;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      FREE( THE_LIST.all.FIELD_KEY );&lt;br /&gt;
	      FREE( THE_LIST.all.FIELD_ITEM );&lt;br /&gt;
	      SUITE := THE_LIST.all.NEXT;&lt;br /&gt;
	      FREE( THE_LIST );&lt;br /&gt;
	      THE_LIST := SUITE;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when ARRAY_ITEM&lt;br /&gt;
	 =&amp;gt;&lt;br /&gt;
	  declare&lt;br /&gt;
	    THE_LIST	: LIST_OF_ITEMS	:= THE_ITEM.all.ITEMS_LIST;&lt;br /&gt;
	    SUITE		: LIST_OF_ITEMS;&lt;br /&gt;
	  begin&lt;br /&gt;
	    while  THE_LIST /= null  loop&lt;br /&gt;
	      FREE( THE_LIST.all.LIST_ITEM );&lt;br /&gt;
	      SUITE := THE_LIST.all.NEXT;&lt;br /&gt;
	      FREE( THE_LIST );&lt;br /&gt;
	      THE_LIST := SUITE;&lt;br /&gt;
	    end loop;&lt;br /&gt;
	  end;&lt;br /&gt;
&lt;br /&gt;
      when others =&amp;gt; null;&lt;br /&gt;
&lt;br /&gt;
      end case;&lt;br /&gt;
&lt;br /&gt;
      THE_ITEM.all := ( KIND=&amp;gt; NULL_ITEM );&lt;br /&gt;
&lt;br /&gt;
  end	FREE;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			------------------&lt;br /&gt;
  procedure		FOR_EACH_JSON_ITEM		( OF_ARRAY :JSON.ITEM )&lt;br /&gt;
			------------------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    if  OF_ARRAY = null  or else  OF_ARRAY.all.KIND /= ARRAY_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      STOP_PROCESS		: BOOLEAN;&lt;br /&gt;
      ITEM_LIST		: LIST_OF_ITEMS	:= OF_ARRAY.all.ITEMS_LIST;&lt;br /&gt;
      LAST_ONE		: BOOLEAN;&lt;br /&gt;
    begin&lt;br /&gt;
      loop&lt;br /&gt;
        exit when  ITEM_LIST = null;&lt;br /&gt;
        LAST_ONE := (ITEM_LIST.all.NEXT = null);&lt;br /&gt;
        APPLY_PROCESS( ITEM_LIST.all.LIST_ITEM, LAST_ONE, STOP_PROCESS );&lt;br /&gt;
        exit when  STOP_PROCESS;&lt;br /&gt;
        ITEM_LIST := ITEM_LIST.all.NEXT;&lt;br /&gt;
      end loop;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
  end	FOR_EACH_JSON_ITEM;&lt;br /&gt;
	------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-------------------&lt;br /&gt;
  procedure		FOR_EACH_JSON_FIELD		( OF_OBJECT :JSON.ITEM )&lt;br /&gt;
			-------------------&lt;br /&gt;
  is&lt;br /&gt;
  begin&lt;br /&gt;
    if  OF_OBJECT = null  or else  OF_OBJECT.all.KIND /= OBJECT_ITEM  then  raise BAD_ITEM_TYPE;  end if;&lt;br /&gt;
&lt;br /&gt;
    declare&lt;br /&gt;
      FIELDS		: OBJECT_FIELD_ACCESS	:= OF_OBJECT.all.FIELDS_LIST;&lt;br /&gt;
      STOP_PROCESS		: BOOLEAN;&lt;br /&gt;
      LAST_ONE		: BOOLEAN;&lt;br /&gt;
    begin&lt;br /&gt;
      while  FIELDS /= null  loop&lt;br /&gt;
        LAST_ONE := (FIELDS.all.NEXT = null);&lt;br /&gt;
        APPLY_PROCESS( FIELDS.all.FIELD_KEY.all, FIELDS.all.FIELD_ITEM, LAST_ONE, STOP_PROCESS );&lt;br /&gt;
        exit when  STOP_PROCESS;&lt;br /&gt;
        FIELDS := FIELDS.all.NEXT;&lt;br /&gt;
      end loop;&lt;br /&gt;
    end;&lt;br /&gt;
&lt;br /&gt;
  end	FOR_EACH_JSON_FIELD;&lt;br /&gt;
	-------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	----&lt;br /&gt;
end	JSON;&lt;br /&gt;
	----&lt;br /&gt;
&lt;br /&gt;
--	1	2	3	4	5	6	7	8	9	0	1	2&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
</feed>