<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=IanMcGowan</id>
	<title>Pickwiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=IanMcGowan"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php/Special:Contributions/IanMcGowan"/>
	<updated>2026-04-28T20:22:53Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2711</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2711"/>
		<updated>2025-01-01T23:29:35Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add note about 1.43.0 upgrade&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-12: Upgraded to [https://www.pro.wiki/news/what-new-features-in-mediawiki-1-43-release mediawiki 1.43.0 LTS]&lt;br /&gt;
* 2024-11: In Memoriam - Thomas Kurtz, co-inventor of BASIC dies [https://computerhistory.org/blog/in-memoriam-thomas-e-kurtz-1928-2024/ ComputerHistory.org]&lt;br /&gt;
* 2024-11: PickWiki has been updated from MediaWiki 1.32.0 to 1.42.3&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-08: [[JonSiskObit]] Obituary&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world] - a trove of resources, particularly the [https://www.multivalue-world.com/documents Documentation] pages&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree], or direct link to the [http://www.tincat-group.com/mv/familytree.html Tincat Group Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=TerminalEmulators&amp;diff=2710</id>
		<title>TerminalEmulators</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=TerminalEmulators&amp;diff=2710"/>
		<updated>2025-01-01T23:23:34Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add note about MobaXterm&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Common Terminal Emulators used in the MV market ==&lt;br /&gt;
* [[AccuTerm]] - now owned by [https://www.zumasys.com/products/accuterm Zumasys]; originally developed by &amp;lt;nowiki&amp;gt;AccuSoft&amp;lt;/nowiki&amp;gt; Enterprises http://asent.com/ (Pete Schellenbach, owner)&lt;br /&gt;
* Anzio - Rasmussen Software http://anzio.com/products/anziowin.htm (Bob Rasmussen, owner)&lt;br /&gt;
* MVTerm - For mvBase only http://www.rainingdata.com/products/dbms/mvb/index.html – broken link, now belongs to Rocket Software&lt;br /&gt;
** Why the heck is this listed as a [http://appdb.winehq.org/appbrowse.php?catId=25 WINE app]? (Answer: All Windows apps can potentially be run under WINE in order to use them on Linux, and that includes MV terminal emulators, although some Windows apps work better than others, since WINE is an imperfect emulation of the Windows APIs, and WINE AppDB records how well various Windows apps work on Wine)&lt;br /&gt;
** Training? http://www.mvbase.com/&lt;br /&gt;
* SBTerm - Comes with SB+ ([[SystemBuilder]]) U2-only http://www-01.ibm.com/software/data/u2/sb/&lt;br /&gt;
* [[ViaDuct]] FX - Via Systems http://www.viasystemsinc.com/external/Viaduct.htm&lt;br /&gt;
* Winnix - http://winnix.com (Only one (?) that runs as GUI on PDA with Windows Mobile[[/CE]])&lt;br /&gt;
* Wintegrate - http://www-01.ibm.com/software/data/u2/wintegrate/&lt;br /&gt;
&lt;br /&gt;
Almost never referenced anymore:&lt;br /&gt;
* Carnation for Mac - http://www.carnationsoftware.com/&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;HostAccess&amp;lt;/nowiki&amp;gt; - http://en.wikipedia.org/wiki/Rogue_Wave_(company) (Originally known as TERMiTE, its original developer was Pixel Innovations, which in 2001 was bought by Quovadx, and Quovadx later became Rogue Wave.)&lt;br /&gt;
&lt;br /&gt;
Work just fine, but without MV specific features, and usually just vt100 support&lt;br /&gt;
* Putty - http://google.com/search?q=putty.  Free and works great!  Enhanced versions that offer tab support and other niceties such as KiTTY, SuperPuTTY or PuTTYtray.&lt;br /&gt;
* Powerterm - http://www.ericom.com/clientbased.asp.  Nice scripting language.&lt;br /&gt;
* MobaXterm - https://mobaxterm.mobatek.net/ Really nice emulator, using Putty under the covers, but also supporting tabs, X-clients, RDP sessions, scripting and saved passwords.&lt;br /&gt;
&lt;br /&gt;
If you are still using telnet as a protocol for these emulators, it&#039;s time to join the 21st Century and make the jump to [http://en.wikipedia.org/wiki/Secure_Shell Secure Shell]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2709</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2709"/>
		<updated>2024-11-15T19:18:19Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Thomas Kurtz memoriam&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-11: In Memoriam - Thomas Kurtz, co-inventor of BASIC dies [https://computerhistory.org/blog/in-memoriam-thomas-e-kurtz-1928-2024/ ComputerHistory.org]&lt;br /&gt;
* 2024-11: PickWiki has been updated from MediaWiki 1.32.0 to 1.42.3&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-08: [[JonSiskObit]] Obituary&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world] - a trove of resources, particularly the [https://www.multivalue-world.com/documents Documentation] pages&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree], or direct link to the [http://www.tincat-group.com/mv/familytree.html Tincat Group Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=MultiValuedDatabases&amp;diff=2708</id>
		<title>MultiValuedDatabases</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=MultiValuedDatabases&amp;diff=2708"/>
		<updated>2024-11-14T17:35:59Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add link to Rocket U2 wikipedia article&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Pick MultiValue database has been around since the late 60&#039;s. The [[HistoryOfMV|History of MultiValue]] is interesting, diverse and also full of [[ColorfulCharacters| Colorful Characters]]. Pick and other MultiValue databases have numerous monikers; MultiValue, MV and Multi-dimensional are just a couple of them. &lt;br /&gt;
&lt;br /&gt;
Wikipedia has a good overview article for those new to MV:&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Pick_operating_system Wikipedia - Pick Operating System]&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/Rocket_U2 Wikipedia - Unidata and Universe Overviews]&lt;br /&gt;
&lt;br /&gt;
The following characteristics are common to most MV systems:&lt;br /&gt;
*A [[HashingFileSystem]] (as a minimum - newer systems have many different types of files)&lt;br /&gt;
*Dictionaries that describe the record layout, but do not constrain the data&lt;br /&gt;
*Records with fixed primary keys, delimited by [[AttributeMarks]] &lt;br /&gt;
*Records can be extended on the fly&lt;br /&gt;
*[[MultiValued]] fields within the records, traditionally seperated by [[ValueMarks]]&lt;br /&gt;
*A Basic programming language that understands files, dictionaries and records&lt;br /&gt;
*A query language, that deals with multivalued data structures&lt;br /&gt;
&lt;br /&gt;
MV DBMS products traditionally run as a Virtual Machine over an operating system. In addition to other connectivity methods, many users can connect to these environments using [[TerminalEmulators|Terminal Emulators]] like Putty, AccuTerm, Winnix or wIntegrate. These terminal emulators can host graphical interfaces and provide other capabilities that integrate server and client.&lt;br /&gt;
&lt;br /&gt;
For those who are interested in some of the more technical details of Pick and the [[PickDataStructure|Pick Data Structure]] should review some of the links found at the bottom of this page. There is a general [[PhilosophyOfPick| Philosophy of Pick]] for those who just want some more general info. &lt;br /&gt;
&lt;br /&gt;
A concerted effort is now taking place to create a [[MVDefinition|formal definition of MV]], led primarily by members of [[U2UG]] and the Oliver mailing lists.&lt;br /&gt;
&lt;br /&gt;
== A partial list of commercially available MV systems: ==&lt;br /&gt;
&lt;br /&gt;
*[[Cache|Cach&amp;amp;eacute;]]&lt;br /&gt;
*[[D3]]&lt;br /&gt;
*[[jBase | jBASE]]&lt;br /&gt;
*[[mvBase]]&lt;br /&gt;
*[[MVON]] / [[ONware]]&lt;br /&gt;
*[[OpenInsight]]&lt;br /&gt;
*[[OpenQM | OpenQM]] / [[QM | QM]]&lt;br /&gt;
*[[Reality]]&lt;br /&gt;
*[[UniData]]&lt;br /&gt;
*[[UniVerse]]&lt;br /&gt;
*[[UniVision]]&lt;br /&gt;
&lt;br /&gt;
== A partial list of Open Source and/or freebie MV systems ==&lt;br /&gt;
&lt;br /&gt;
*Bart&lt;br /&gt;
*[[MaVerick]]&lt;br /&gt;
*[[OpenQM]]&lt;br /&gt;
*Winter&lt;br /&gt;
*ScarletDME&lt;br /&gt;
&lt;br /&gt;
== Licensees ==&lt;br /&gt;
&lt;br /&gt;
*[[AppliedDigitalDataSystems | ADDS Mentor]]&lt;br /&gt;
*Advanced Pick&lt;br /&gt;
*Advanced Revelation&lt;br /&gt;
*[[Altos]]&lt;br /&gt;
*[[Archford | Archford Computers International]]&lt;br /&gt;
*[[C-Itoh]]&lt;br /&gt;
*CDI ??&lt;br /&gt;
*[[Climax]]&lt;br /&gt;
*Datamedia&lt;br /&gt;
*[[Edgcore | Edgcore Technology]]&lt;br /&gt;
*[[ElectroniqueSergeDassault | Electronique Serge Dassault]]&lt;br /&gt;
*[[Fujitsu]]&lt;br /&gt;
*[[IBCTechnologies | IBC Technologies, Inc.]]&lt;br /&gt;
*ICL Clan&lt;br /&gt;
*[[IN2]]&lt;br /&gt;
*mvEnterprise (nearly so)&lt;br /&gt;
*Siemens-Nixdorf&lt;br /&gt;
*Pertec&lt;br /&gt;
*Power95&lt;br /&gt;
*[[PrimeInformation|Prime Information]]&lt;br /&gt;
*R83&lt;br /&gt;
*[[Rexon | Rexon Business Machines]]&lt;br /&gt;
*Sanyo[[/ICON]]&lt;br /&gt;
*TAU ??&lt;br /&gt;
*[[Ultimate]]&lt;br /&gt;
*[[UltPlus]]&lt;br /&gt;
*Wicat&lt;br /&gt;
&lt;br /&gt;
== Other Notes == &lt;br /&gt;
For a comparison of MV Databases, there is a fine paper by MIS Modular&lt;br /&gt;
Information Systems @ http://www.utwo.co.za/MultiValueReviewWhitePaper.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.cdbma.org/library/MultiValue_Review_White_Paper.pdf former link to CDBMA] no longer valid.&lt;br /&gt;
&lt;br /&gt;
A very good basic manual of PICK[[/BASIC]] can be found at:&lt;br /&gt;
Jonathan E. Sisk&#039;s &amp;quot;Pick[[/BASIC]]: A Programmer&#039;s Guide&amp;quot;: January, 2000 WWW Edition&lt;br /&gt;
http://www.jes.com/pb/index.html&lt;br /&gt;
&lt;br /&gt;
For an introduction to using the Pick Query Language, see &amp;quot;Getting Started in [[OpenQM]]&amp;quot; from &lt;br /&gt;
http://www.rushflat.co.nz/downloads.shtml&lt;br /&gt;
&lt;br /&gt;
IBM&#039;s white paper on comparing MV Architecture vs: &amp;quot;Normalized&amp;quot; DB structures can be &lt;br /&gt;
found @: ftp://ftp.software.ibm.com/software/data/u2/pubs/whitepapers/nested_rdbms.pdf &amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.cdbma.org/presentations/nested_rdbms.pdf former link to CDBMA] no longer valid.&lt;br /&gt;
&lt;br /&gt;
Search on Key words &amp;quot;[http://www.google.com/search?num=100&amp;amp;q=Nested+Relational+Databases Nested Relational Databases]&amp;quot; pulls up a significant number of sites with good information for those interested in the subject.&lt;br /&gt;
&lt;br /&gt;
A basic intro to the MV DBMS Model for someone more familiar with relational: http://www.nebula-rnd.com/products/mvdbms.htm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Notes / Discussion ==&lt;br /&gt;
* [TG] Would be nice if someone helped owner of [http://conceptoriented.org/faqs/com-related-faq.html this site] to correct his MV-related links.&lt;br /&gt;
* [TG] Can we host the linked PDF files here so that they don&#039;t disappear anymore?&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=JonSiskObit&amp;diff=2707</id>
		<title>JonSiskObit</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=JonSiskObit&amp;diff=2707"/>
		<updated>2024-11-13T02:24:51Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2024-08&lt;br /&gt;
&lt;br /&gt;
Very sad to report the passing of Jon Sisk - Jon was a pioneer in the PICK industry and introduced and mentored a generation of PICK professionals&lt;br /&gt;
&lt;br /&gt;
[https://pickwiki.org/images/f/f9/Jon_Sisk_Obit.pdf Full Obituary]&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/share/p/o3uXD39q2AQ5Yfre/?mibextid=xfxF2i Facebook Announcement]&lt;br /&gt;
&lt;br /&gt;
[https://www.multivalue-world.com/post/jonathan-e-sisk MVWorld Announcement]&lt;br /&gt;
&lt;br /&gt;
[https://groups.google.com/g/mvdbms/c/o1o4i1-64VU/m/HXEr_wR6AAAJ Some testimonials on MVDBMS forum]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=JonSiskObit&amp;diff=2706</id>
		<title>JonSiskObit</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=JonSiskObit&amp;diff=2706"/>
		<updated>2024-11-12T03:14:01Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2024-08&lt;br /&gt;
&lt;br /&gt;
Very sad to report the passing of Jon Sisk - Jon was a pioneer in the PICK industry and introduced and mentored a generation of PICK professionals&lt;br /&gt;
&lt;br /&gt;
[[File:Jon Sisk Obit.pdf|Full Obituary]]&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/share/p/o3uXD39q2AQ5Yfre/?mibextid=xfxF2i Facebook Announcement]&lt;br /&gt;
&lt;br /&gt;
[https://www.multivalue-world.com/post/jonathan-e-sisk MVWorld Announcement]&lt;br /&gt;
&lt;br /&gt;
[https://groups.google.com/g/mvdbms/c/o1o4i1-64VU/m/HXEr_wR6AAAJ Some testimonials on MVDBMS forum]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=JonSiskObit&amp;diff=2705</id>
		<title>JonSiskObit</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=JonSiskObit&amp;diff=2705"/>
		<updated>2024-11-12T03:06:54Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add links to Jon&amp;#039;s testimonials&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2024-08&lt;br /&gt;
&lt;br /&gt;
Very sad to report the passing of Jon Sisk&lt;br /&gt;
&lt;br /&gt;
[[File:Jon Sisk Obit.pdf|Full Obituary]]&lt;br /&gt;
&lt;br /&gt;
[https://www.facebook.com/share/p/o3uXD39q2AQ5Yfre/?mibextid=xfxF2i Facebook Announcement]&lt;br /&gt;
&lt;br /&gt;
[https://www.multivalue-world.com/post/jonathan-e-sisk MVWorld Announcement]&lt;br /&gt;
&lt;br /&gt;
[https://groups.google.com/g/mvdbms/c/o1o4i1-64VU/m/HXEr_wR6AAAJ Some testimonials on MVDBMS forum]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2704</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2704"/>
		<updated>2024-11-12T03:06:11Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-11: PickWiki has been updated from MediaWiki 1.32.0 to 1.42.3&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-08: [[JonSiskObit]] Obituary&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world] - a trove of resources, particularly the [https://www.multivalue-world.com/documents Documentation] pages&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree], or direct link to the [http://www.tincat-group.com/mv/familytree.html Tincat Group Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=InMemoriam&amp;diff=2703</id>
		<title>InMemoriam</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=InMemoriam&amp;diff=2703"/>
		<updated>2024-11-12T03:05:53Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For some time now I&#039;ve felt that there needed to be a place to record our memories of and the contributions of those Pick community members that are no longer with us.  &lt;br /&gt;
The [http://www.microdata-alumni.org/ Microdata Alumni] web site has a page for departed members of that community but I wanted to cast a wider net.&lt;br /&gt;
&lt;br /&gt;
So this seems to be the most appropriate place to start this collective memory.&lt;br /&gt;
&lt;br /&gt;
I will seed this list with the individuals that come to mind and fill in details as I have time.  Please join me in adding to this list and updating the individual pages if you have something to contribute. (TK)&lt;br /&gt;
&lt;br /&gt;
In Memoriam:&lt;br /&gt;
*&#039;&#039;&#039;[[DickPickMem|Dick Pick]]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[[DonNelsonMem|Don Nelson]]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[[KenSimmsMem|Ken Simms]]&#039;&#039;&#039;&lt;br /&gt;
*[[GregAmov|Gregory Michael Amov]]&lt;br /&gt;
*[[DennisAulerMem|Dennis Auler]]&lt;br /&gt;
*[[BrunoBenincaMem|Bruno Beninca]]&lt;br /&gt;
*[[LukeBucklin|Luke Bucklin]]&lt;br /&gt;
*[[JeffBurslemMem|Jeff Burslem]]&lt;br /&gt;
*[[JoeCupp|Joe Cupp]]&lt;br /&gt;
*[[MikeGanzMem|Mike Ganz]]&lt;br /&gt;
*[[CliffMyersMem|Cliff Myers]]&lt;br /&gt;
*[[BruceNicholMem|Bruce Nichol]]&lt;br /&gt;
*[[JayOtto|Jay Otto]]&lt;br /&gt;
*[[JonSiskObit|Jonathan Sisk]]&lt;br /&gt;
*[[BillThurmanMem|Bill Thurman]]&lt;br /&gt;
*[[JohnTimmonsMem|John Timmons]]&lt;br /&gt;
*[[HenryVuMem|Henry Vu]]&lt;br /&gt;
*[[DaveWeaverMem|Dave Weaver]]&lt;br /&gt;
&lt;br /&gt;
* Rather than being a collection of technotes, [[PickWiki]] was originally created by [[Ian McGowan]] as a repository for anecdotes about the history of the Pick DBMS. Please feel free to add notes, or links to forum postings or web pages to help build this unique resource. See also: [[ColorfulCharacters]]&lt;br /&gt;
* Except for Dick, Don, and Ken, I alphabetized the names on this page. Please let me know if there is any disagreement about this. (TG)&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2702</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2702"/>
		<updated>2024-11-12T02:30:50Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add link to JonSisk obit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-11: PickWiki has been updated from MediaWiki 1.32.0 to 1.42.3&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-08: [[JonSisk]] Obituary&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world] - a trove of resources, particularly the [https://www.multivalue-world.com/documents Documentation] pages&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree], or direct link to the [http://www.tincat-group.com/mv/familytree.html Tincat Group Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2701</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2701"/>
		<updated>2024-11-12T02:08:14Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add link to documents&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-11: PickWiki has been updated from MediaWiki 1.32.0 to 1.42.3&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world] - a trove of resources, particularly the [https://www.multivalue-world.com/documents Documentation] pages&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree], or direct link to the [http://www.tincat-group.com/mv/familytree.html Tincat Group Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=InMemoriam&amp;diff=2700</id>
		<title>InMemoriam</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=InMemoriam&amp;diff=2700"/>
		<updated>2024-11-12T01:55:07Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For some time now I&#039;ve felt that there needed to be a place to record our memories of and the contributions of those Pick community members that are no longer with us.  &lt;br /&gt;
The [http://www.microdata-alumni.org/ Microdata Alumni] web site has a page for departed members of that community but I wanted to cast a wider net.&lt;br /&gt;
&lt;br /&gt;
So this seems to be the most appropriate place to start this collective memory.&lt;br /&gt;
&lt;br /&gt;
I will seed this list with the individuals that come to mind and fill in details as I have time.  Please join me in adding to this list and updating the individual pages if you have something to contribute. (TK)&lt;br /&gt;
&lt;br /&gt;
In Memoriam:&lt;br /&gt;
*&#039;&#039;&#039;[[DickPickMem|Dick Pick]]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[[DonNelsonMem|Don Nelson]]&#039;&#039;&#039;&lt;br /&gt;
*&#039;&#039;&#039;[[KenSimmsMem|Ken Simms]]&#039;&#039;&#039;&lt;br /&gt;
*[[GregAmov|Gregory Michael Amov]]&lt;br /&gt;
*[[DennisAulerMem|Dennis Auler]]&lt;br /&gt;
*[[BrunoBenincaMem|Bruno Beninca]]&lt;br /&gt;
*[[LukeBucklin|Luke Bucklin]]&lt;br /&gt;
*[[JeffBurslemMem|Jeff Burslem]]&lt;br /&gt;
*[[JoeCupp|Joe Cupp]]&lt;br /&gt;
*[[MikeGanzMem|Mike Ganz]]&lt;br /&gt;
*[[CliffMyersMem|Cliff Myers]]&lt;br /&gt;
*[[BruceNicholMem|Bruce Nichol]]&lt;br /&gt;
*[[JayOtto|Jay Otto]]&lt;br /&gt;
*[[JonSisk|Jonathan Sisk]]&lt;br /&gt;
*[[BillThurmanMem|Bill Thurman]]&lt;br /&gt;
*[[JohnTimmonsMem|John Timmons]]&lt;br /&gt;
*[[HenryVuMem|Henry Vu]]&lt;br /&gt;
*[[DaveWeaverMem|Dave Weaver]]&lt;br /&gt;
&lt;br /&gt;
* Rather than being a collection of technotes, [[PickWiki]] was originally created by [[Ian McGowan]] as a repository for anecdotes about the history of the Pick DBMS. Please feel free to add notes, or links to forum postings or web pages to help build this unique resource. See also: [[ColorfulCharacters]]&lt;br /&gt;
* Except for Dick, Don, and Ken, I alphabetized the names on this page. Please let me know if there is any disagreement about this. (TG)&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=File:Jon_Sisk_Obit.pdf&amp;diff=2699</id>
		<title>File:Jon Sisk Obit.pdf</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=File:Jon_Sisk_Obit.pdf&amp;diff=2699"/>
		<updated>2024-11-12T01:53:53Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=User_talk:Iantest5&amp;diff=2696</id>
		<title>User talk:Iantest5</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=User_talk:Iantest5&amp;diff=2696"/>
		<updated>2024-11-09T06:24:16Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to &#039;&#039;Pickwiki&#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:IanMcGowan|IanMcGowan]] ([[User talk:IanMcGowan|talk]]) 06:24, 9 November 2024 (UTC)&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=User:Iantest5&amp;diff=2695</id>
		<title>User:Iantest5</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=User:Iantest5&amp;diff=2695"/>
		<updated>2024-11-09T06:24:16Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Creating user page for new user.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Just another pick hacker, check in every day!&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2694</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2694"/>
		<updated>2024-11-09T04:54:59Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-11: PickWiki has been updated from MediaWiki 1.32.0 to 1.42.3&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world]&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree], or direct link to the [http://www.tincat-group.com/mv/familytree.html Tincat Group Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2693</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2693"/>
		<updated>2024-11-09T04:37:52Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add update to pickwiki version to news&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-11: Pickwiki has been updated from MediaWiki 1.32.0 to 1.42.3&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world]&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree], or direct link to the [http://www.tincat-group.com/mv/familytree.html Tincat Group Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2692</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2692"/>
		<updated>2024-11-09T03:40:40Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Remove SEO tags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world]&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree], or direct link to the [http://www.tincat-group.com/mv/familytree.html Tincat Group Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=JBase&amp;diff=2691</id>
		<title>JBase</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=JBase&amp;diff=2691"/>
		<updated>2024-10-18T02:08:51Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;jBASE is a Database Management System comprising development tools, middleware and a multi-dimensional database. jBASE takes the best points of the relational database model and adds to it several significant benefits including ease of use, superb performance, small footprint and all the rich [[MultiValue]] features, making it ideally suited to all business uses from the Internet to OLAP to transactional applications. The architecture is uniquely designed to allow all and any application development tools and backend databases to form part of a jBASE solution. jBC compiler generates &amp;quot;C&amp;quot; code for platforms, excellent support for external databases like Oracle, SQL Server, DB2 etc.&lt;br /&gt;
&lt;br /&gt;
The Pick WikiPedia article has some brief details on the history of jBase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;jBASE – jBASE was released in 1991 by a small company of the same name in Hemel Hempstead, England. Written by former Microdata engineers, jBASE emulates all implementations of the system to some degree. jBASE compiles applications to native machine code form, rather than to an intermediate byte code. In 2015, cloud solutions provider Zumasys[20] in Irvine, California, acquired the jBASE distribution rights from Mpower1 as well as the intellectual property from Temenos Group.[21] On 14 Oct 2021, Zumasys announced they had sold their databases and tools, including jBASE to Rocket Software.[22]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Current Features ==&lt;br /&gt;
*64-bit database&lt;br /&gt;
*Native to the Operating System - No Virtual Machine&lt;br /&gt;
*Thread Safe&lt;br /&gt;
*Compiled jQL&lt;br /&gt;
*Choice of Development Language&lt;br /&gt;
*Java support&lt;br /&gt;
*Microsoft support&lt;br /&gt;
*Resilient and Automatically Resizable File System&lt;br /&gt;
*Data at Rest Encryption (DREM)&lt;br /&gt;
*SQL support&lt;br /&gt;
*JDBC and ODBC Connectors&lt;br /&gt;
*Database independence&lt;br /&gt;
*Platform independence&lt;br /&gt;
*Full support for Windows, Linux and Unix&lt;br /&gt;
*Superior Transaction Journaling&lt;br /&gt;
*Connectivity&lt;br /&gt;
*Internationalization&lt;br /&gt;
*Future proof&lt;br /&gt;
&lt;br /&gt;
== Information ==&lt;br /&gt;
In 2015, &amp;lt;a href=&amp;quot;http://www.zumasys.com/admin/zumasys-acquires-jbase-database/&amp;quot;&amp;gt;Zumasys announced it had acquired the jBASE database&amp;lt;/a&amp;gt; from Temenos. &lt;br /&gt;
For more information, visit the jBASE website at &amp;lt;a href=&amp;quot;http://www.jbase.com&amp;quot;&amp;gt;http://www.jbase.com&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In 2021, the Rocket Acquisition of Zumasys means that jBASE is now owned by [[https://www.rocketsoftware.com/products/rocket-multivalue-application-development-platform/rocket-jbase Rocket Software]]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2690</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2690"/>
		<updated>2024-10-16T00:28:52Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world]&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree], or direct link to the [http://www.tincat-group.com/mv/familytree.html Tincat Group Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Pick_Operating_System&amp;diff=2689</id>
		<title>Pick Operating System</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Pick_Operating_System&amp;diff=2689"/>
		<updated>2024-10-16T00:26:15Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The PICK operating environment is one of the longest running, ongoing developments in the history of the computer industry. It is also the catalyst for one of the most variable, volatile and colorful stories to tell—involving everything from technical triumphs to personalities and politics.&lt;br /&gt;
&lt;br /&gt;
For a less partisan view of the PICK OS, the [[https://en.wikipedia.org/wiki/Pick_operating_system WikiPedia Entry]] is also a good starting point.&lt;br /&gt;
&lt;br /&gt;
PICK is a virtual memory, multiuser operating environment providing the means to store, process and retrieve information while automatically taking care of the day-to-day programming burdens. It is widely accepted as being the first data base management system available on the commercial market, and one of the best still available today.&lt;br /&gt;
&lt;br /&gt;
==The Evolution of the Pick Operating System==&lt;br /&gt;
&lt;br /&gt;
The origins of the PICK Operating System stem from a real life application of computer technology undertaken in the mid-1960&#039;s: the design of a data management stores system, initially for the tracking of parts for rocket engines within the huge military contractor TRW Systems Inc., and later adopted and funded by the US Army to track the maintenance and repair of Cheyenne helicopters.&lt;br /&gt;
&lt;br /&gt;
The challenge of the project was that the system was to have an English-like retrieval language which could be used on a computer which had not yet been specified.&lt;br /&gt;
&lt;br /&gt;
The system was being developed by Don Nelson and was initially titled Parts Acquisition Data System (PADS). Richard (Dick) Pick, for whom the operating system was named, was hired in 1965 specifically to work with Nelson on the project. In the course of its somewhat complex evolution, the first spec was called Generalized Information Retrieval Language and System (GIRLS). Later yet, the project was re-named General Information Management (GIM). It was then dubbed by the Army, which took over the funding of the project to develop a system to support the Cheyenne helicopter, Integrated Technical Data System or ITDS. The software was delivered to the Army in 1969 and implemented on an IBM mainframe. In that year the Army said in a published report that GIM (or ITDS) was &amp;quot;by far the finest generalized information management system in the country.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
No real commercial use was made of GIM which enabled Dick Pick to continue to research his own work, deemed to be public domain because it had been developed under the auspices of the US Department of Defense, once the project was completed. Dick Pick&#039;s development continued while he was working for General Analytics corporation where he was ensconced for a short period beginning in May 1969. The previously named GIM or ITDS became known as Reactive Information System, RIS. It was while Dick Pick was with General Analytics Corporation that RIS was first ported to a minicomputer, the Microdata 800 CPU.&lt;br /&gt;
&lt;br /&gt;
General Analytics filed for bankruptcy in 1970 and Dick Pick continued to independently work on the molding of RIS to the Microdata 800. He now called the system ACCESS.&lt;br /&gt;
&lt;br /&gt;
In June 1972, Dick Pick founded Richard Pick and Associates and continued his efforts, switching from the Microdata 800 to the Microdata 1600 and naming the overall system—comprising ACCESS software, firmware and the Microdata—&amp;quot;DM 512&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
It is important to note here, that its origins as a database operating system designed specifically to run application software and designed for computer users, as opposed to computer technicians and programmers, is intrinsic to the nature and future success of PICK. Because it meets a need for simplicity of use, provides good online response and report writing features, users find PICK a truly useful system, particularly in multiuser database applications; because its rapid systems development facilities enable the easy tailoring of online, real-time software packages, manufacturers and software houses find PICK affords them a distinct advantage when pursuing vertical markets.&lt;br /&gt;
&lt;br /&gt;
==Commercial Growth==&lt;br /&gt;
&lt;br /&gt;
The first commercial step in the growth of PICK was the implementation on&lt;br /&gt;
Microdata (now McDonnell Douglas Computer Systems Company; the name change occurred in late 1984 when McDonnell Douglas acquired Microdata) minicomputers.   This occurred when Dick Pick entered into an agreement with Microdata to implement his software concepts on its computers and in 1974, when Microdata was given marketing rights,  DM 512 was once again re-named, this time by Microdata. The system was called REALITY and the retrieval language, English. From 1970 to 1978 PICK was virtually the exclusive property of Microdata. During this period Microdata marketed its new product by appointing dealers throughout the world, achieving a moderate amount of success.&lt;br /&gt;
&lt;br /&gt;
Contrary to popular opinion‹and according to an interview (Datastream magazine, October 1981) with Ken Simms who worked with Dick Pick on pioneering the PICK Operating System—in 1975 Pick became an unsalaried employed of Microdata. Simms said: &amp;quot;Nobody at Pick and Associates was ever a real employee of Microdata. At one time, some of us were employees for $1.00 a year, which was to get certain company benefits. Dick Pick became head of REALITY development and the Microdata programmers who worked on REALITY actually worked at Pick and Associates offices on Skypark Circle.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then, in the late 70&#039;s, following a dispute with management, Dick Pick split with Microdata and intended to market the system to a broader reaching base on his own. A lawsuit over the rights to the system followed and can be cited as one of the reasons the PICK Operating System remained, and has been frequently touted &amp;quot;the best kept secret in the computer world&amp;quot;. The lawsuit was finally settled out of court in 1981.&lt;br /&gt;
&lt;br /&gt;
Microdata retained the exclusive rights to REALITY and its development on Microdata hardware and Pick and Associates had the rights to develop PICK and to port it onto other computer systems. Thus, this small company, Pick and Associates, was the only willing source of supply to enable the operating system to be implemented on other manufacturers&#039; machines.&lt;br /&gt;
&lt;br /&gt;
Adding further to the relative inconspicuousness—at the time—of PICK as a powerful operating environment was the tendency of those few vendors who did license PICK to call it by a proprietary name‹for example: Zebra from General Automation, Mentor from Applied Digital Data Systems and Ultimate from The Ultimate Corp.&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=JBase&amp;diff=2688</id>
		<title>JBase</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=JBase&amp;diff=2688"/>
		<updated>2024-10-16T00:12:18Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;jBASE is a Database Management System comprising development tools, middleware and a multi-dimensional database. jBASE takes the best points of the relational database model and adds to it several significant benefits including ease of use, superb performance, small footprint and all the rich [[MultiValue]] features, making it ideally suited to all business uses from the Internet to OLAP to transactional applications. The architecture is uniquely designed to allow all and any application development tools and backend databases to form part of a jBASE solution. jBC compiler generates &amp;quot;C&amp;quot; code for platforms, excellent support for external databases like Oracle, SQL Server, DB2 etc.&lt;br /&gt;
&lt;br /&gt;
== Current Features ==&lt;br /&gt;
*64-bit database&lt;br /&gt;
*Native to the Operating System - No Virtual Machine&lt;br /&gt;
*Thread Safe&lt;br /&gt;
*Compiled jQL&lt;br /&gt;
*Choice of Development Language&lt;br /&gt;
*Java support&lt;br /&gt;
*Microsoft support&lt;br /&gt;
*Resilient and Automatically Resizable File System&lt;br /&gt;
*Data at Rest Encryption (DREM)&lt;br /&gt;
*SQL support&lt;br /&gt;
*JDBC and ODBC Connectors&lt;br /&gt;
*Database independence&lt;br /&gt;
*Platform independence&lt;br /&gt;
*Full support for Windows, Linux and Unix&lt;br /&gt;
*Superior Transaction Journaling&lt;br /&gt;
*Connectivity&lt;br /&gt;
*Internationalization&lt;br /&gt;
*Future proof&lt;br /&gt;
&lt;br /&gt;
== Information ==&lt;br /&gt;
In 2015, &amp;lt;a href=&amp;quot;http://www.zumasys.com/admin/zumasys-acquires-jbase-database/&amp;quot;&amp;gt;Zumasys announced it had acquired the jBASE database&amp;lt;/a&amp;gt; from Temenos. &lt;br /&gt;
For more information, visit the jBASE website at &amp;lt;a href=&amp;quot;http://www.jbase.com&amp;quot;&amp;gt;http://www.jbase.com&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In 2021, the Rocket Acquisition of Zumasys means that jBASE is now owned by [[https://www.rocketsoftware.com/products/rocket-multivalue-application-development-platform/rocket-jbase Rocket Software]]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2687</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2687"/>
		<updated>2024-10-12T07:33:02Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world]&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2686</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2686"/>
		<updated>2024-10-11T22:48:02Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world]&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by Zumasys and community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2685</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2685"/>
		<updated>2024-10-11T22:39:02Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* 2024-03: [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* 2021-10: [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* 2020-02: Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01: [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2016-09: [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* 2015-07: [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree]&lt;br /&gt;
* 2015-02: Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01: [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by Zumasys and community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2684</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2684"/>
		<updated>2024-10-11T22:28:30Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2024-10: Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* Resources for learning more about MV available at: [https://www.pickmultivalue.com/ www.pickmultivalue.com]&lt;br /&gt;
* Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree]&lt;br /&gt;
* Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by Zumasys and community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2683</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2683"/>
		<updated>2024-10-11T22:27:24Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* [https://www.multivalue-world.com/ Multivalue-world has some amazing resources]&lt;br /&gt;
* [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* Resources for learning more about MV available at: [https://www.pickmultivalue.com/ www.pickmultivalue.com]&lt;br /&gt;
* Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree]&lt;br /&gt;
* Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by Zumasys and community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=SyntaxFiles&amp;diff=2682</id>
		<title>SyntaxFiles</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=SyntaxFiles&amp;diff=2682"/>
		<updated>2024-10-11T06:02:45Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Syntax Files for Editing programs&lt;br /&gt;
&lt;br /&gt;
[[EditPlus]] , Edit Plus databasic (UV10) syntax file&lt;br /&gt;
&lt;br /&gt;
[[UniBasicEl]], Syntax highlighting in Emacs&lt;br /&gt;
&lt;br /&gt;
[[TextPad]], Syntax highlighting in [[TextPad]]&lt;br /&gt;
&lt;br /&gt;
[[Beyond Compare]], Beyond Compare SB+ Paragraph formatter. Allows you to compare SB+ Paragraph Processes&lt;br /&gt;
&lt;br /&gt;
[[NotepadPlusPlus|Notepad++]] syntax highlighting for Pick BASIC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;UniBASIC&amp;lt;/nowiki&amp;gt; syntax highlighting for [http://www.vim.org/scripts/script.php?script_id=2143 Vim]&lt;br /&gt;
&lt;br /&gt;
[[VsCode]] Microsoft Visual Studio Code - [https://code.visualstudio.com/ code.visualstudio.com]&lt;br /&gt;
&lt;br /&gt;
jBase syntax highlighting for [http://markmail.org/search/?q=jbase%20vim%20syntax Vim]&lt;br /&gt;
&lt;br /&gt;
See also [[AccuTermKeyboardMapping]].&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Ian_McGowan&amp;diff=2681</id>
		<title>Ian McGowan</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Ian_McGowan&amp;diff=2681"/>
		<updated>2024-10-11T06:00:23Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Your absent-minded host.  I registered pickwiki.com out of a misguided attempt to capture some of the fascinating (to me, at least) stories about Pick and the MV community on comp.databases.pick.  Turns out most people want a place to share code easily.  That doesn&#039;t hurt my feelings :-)&lt;br /&gt;
&lt;br /&gt;
If you have something to say about programming or technology (preferably related to [[MultiValue]] systems) share it with the world - create or edit a page!&lt;br /&gt;
&lt;br /&gt;
Also, feel free to refactor this site itself.  The current structure reflects the old intent.  If you have an idea or don&#039;t like the way the wiki works, don&#039;t wait for an invitation - [[CanBeEdited|just do it!]]&lt;br /&gt;
&lt;br /&gt;
ian.mcgowan@gmail.com&lt;br /&gt;
&lt;br /&gt;
http://www.linkedin.com/in/ianmcgowan if you want to hire me&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=LineEDitor&amp;diff=2680</id>
		<title>LineEDitor</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=LineEDitor&amp;diff=2680"/>
		<updated>2024-10-10T14:58:58Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add source code, grabbed from archive.org&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Back to [[BasicSource]]&lt;br /&gt;
&lt;br /&gt;
My version of Unidata&#039;s AE that was written to cope with a move to Universe when we were relying on AE&#039;s security capabilities.  This has a few extra things like an embedded full-page editor and search and change histories.  The original source code (version 1.03) was released to public domain by Public Trust of New Zealand as a way of thanking the Pick community for assistance given over the years.&lt;br /&gt;
&lt;br /&gt;
https://sites.google.com/site/nzpickie/home/programs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
     program led&lt;br /&gt;
&lt;br /&gt;
* This editor reproduces the UniData Alternate Editor for QM/U2&lt;br /&gt;
* The code is based on LED, a line editor released into&lt;br /&gt;
* the public domain by Public Trust of New Zealand.&lt;br /&gt;
* Written by Keith Robert Johnson.&lt;br /&gt;
&lt;br /&gt;
*====================================================================&lt;br /&gt;
* Version information&lt;br /&gt;
*  2.00 - Simplified code - No longer supporting R83&lt;br /&gt;
*         Downcased the source to comply with QM standards.&lt;br /&gt;
*====================================================================&lt;br /&gt;
&lt;br /&gt;
$define universe&lt;br /&gt;
$ifdef qm&lt;br /&gt;
$include err.h&lt;br /&gt;
     voc = @voc&lt;br /&gt;
$else&lt;br /&gt;
     open &#039;VOC&#039; to voc else stop 201,&#039;VOC&#039;&lt;br /&gt;
$endif&lt;br /&gt;
$ifdef universe&lt;br /&gt;
$options information&lt;br /&gt;
$endif&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
$basictype &#039;U&#039;&lt;br /&gt;
$endif&lt;br /&gt;
&lt;br /&gt;
* INITIALISE&lt;br /&gt;
     prompt &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
     am = char(254); vm = char(253); sm = char(252)&lt;br /&gt;
     true = 1 = 1; false = not(true); qt = &#039;&amp;quot;\&#039;:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
     common /led$data/ edkeep,secure,kept&lt;br /&gt;
&lt;br /&gt;
     equ cellsize to 100&lt;br /&gt;
     dim memr(1)&lt;br /&gt;
&lt;br /&gt;
* List of verbs for viewing data only&lt;br /&gt;
     viewverb = &#039;VIEW&#039;:am:&#039;BROWSE&#039;:am:&#039;LOOK&#039;&lt;br /&gt;
&lt;br /&gt;
* XCOM data - YES this editor will do $commands like AE does&lt;br /&gt;
     dim junk(100)&lt;br /&gt;
     equ this to junk(1)&lt;br /&gt;
     equ item to junk(2)&lt;br /&gt;
     equ here to junk(3)&lt;br /&gt;
     equ x$cc to junk(11)&lt;br /&gt;
     equ comi to junk(13)&lt;br /&gt;
     equ comd to junk(14)&lt;br /&gt;
     equ last to junk(15)&lt;br /&gt;
     equ comdmark to junk(19)&lt;br /&gt;
     equ wordmark to junk(20)&lt;br /&gt;
     equ fnam to junk(24)&lt;br /&gt;
     equ xsep to junk(25)&lt;br /&gt;
     mat junk = &#039;&#039;&lt;br /&gt;
     xsep = &#039; &#039;&lt;br /&gt;
     wordmark = &#039; &#039;&lt;br /&gt;
     comdmark = &#039;`&#039;&lt;br /&gt;
&lt;br /&gt;
* Local data&lt;br /&gt;
     begn = @(0) ; ceop = @(-3) ; ceol = @(-4) ; goup = @(-10)&lt;br /&gt;
     revb = @(-13) ; revf = @(-14) ; undb = @(-15) ; undf = @(-16)&lt;br /&gt;
&lt;br /&gt;
     heap = false ; salt = &#039;&#039; ; rlen = 0&lt;br /&gt;
     plen = system(3)-1 ; pwin = plen-1 ; line = &#039;&#039; ; here = 0&lt;br /&gt;
     dim fr(10) ; mat fr = &#039;&#039; ; fr(3) = &#039;MCU&#039;&lt;br /&gt;
     oops = &#039;&#039; ; oopc = &#039;&#039; ; oopl = &#039;&#039; ; oopf = &#039;&#039;&lt;br /&gt;
     oopb = &#039;&#039; ; oopk = &#039;&#039;&lt;br /&gt;
     join = &#039;&#039; ; nill = &#039;&#039; ; fold = &#039;&#039;&lt;br /&gt;
     macn = 0 ; macc = &#039;&#039;&lt;br /&gt;
     pick = &#039;&#039; ; lastfind = &#039;&#039; ; huge = 99999999&lt;br /&gt;
&lt;br /&gt;
* Turn off page prompt&lt;br /&gt;
     test = @(0,0)&lt;br /&gt;
&lt;br /&gt;
* Find Match words - a LOOP can have multiple WHILE and UNTIL conditions&lt;br /&gt;
     fm.words = &#039;&#039; ; fm.findf = &#039;&#039; ; fm.finda = &#039;&#039;&lt;br /&gt;
     fm.words&amp;lt;1&amp;gt; = &#039;END&#039; ; fm.findf&amp;lt;1&amp;gt; = &#039;END&#039;&lt;br /&gt;
     fm.finda&amp;lt;1&amp;gt; = &#039;IF&#039;:vm:&#039;END&#039;:vm:&#039;OPEN&#039;:vm:&#039;OPENSEQ&#039;:vm:&#039;BEGIN&#039;:vm:&#039;LOCATE&#039;&lt;br /&gt;
     fm.words&amp;lt;2&amp;gt; = &#039;LOOP&#039; ; fm.findf&amp;lt;2&amp;gt; = &#039;REPEAT&#039;:vm:&#039;UNTIL&#039;:vm:&#039;WHILE&#039;&lt;br /&gt;
     fm.words&amp;lt;3&amp;gt; = &#039;UNTIL&#039;; fm.findf&amp;lt;3&amp;gt; = fm.findf&amp;lt;2&amp;gt;&lt;br /&gt;
     fm.finda&amp;lt;3&amp;gt; = &#039;LOOP&#039;:vm:&#039;UNTIL&#039;:vm:&#039;WHILE&#039;&lt;br /&gt;
     fm.words&amp;lt;4&amp;gt; = &#039;WHILE&#039;&lt;br /&gt;
     fm.findf&amp;lt;4&amp;gt; = fm.findf&amp;lt;2&amp;gt;; fm.finda&amp;lt;4&amp;gt; = fm.finda&amp;lt;3&amp;gt;&lt;br /&gt;
     fm.words&amp;lt;5&amp;gt; = &#039;FOR&#039; ; fm.findf&amp;lt;5&amp;gt; = &#039;NEXT&#039;&lt;br /&gt;
     fm.words&amp;lt;6&amp;gt; = &#039;NEXT&#039; ; fm.finda&amp;lt;6&amp;gt; = &#039;FOR&#039;&lt;br /&gt;
     fm.words&amp;lt;7&amp;gt; = &#039;BEGIN&#039; ; fm.findf&amp;lt;7&amp;gt; = &#039;END CASE&#039;:vm:&#039;CASE&#039;&lt;br /&gt;
     fm.words&amp;lt;8&amp;gt; = &#039;CASE&#039; ; fm.findf&amp;lt;8&amp;gt; = &#039;CASE&#039;:vm:&#039;END CASE&#039;&lt;br /&gt;
     fm.finda&amp;lt;8&amp;gt; = &#039;BEGIN CASE&#039;:vm:&#039;CASE&#039;&lt;br /&gt;
     fm.words&amp;lt;9&amp;gt; = &#039;LOCKED&#039; ; fm.findf&amp;lt;9&amp;gt; = &#039;END&#039;&lt;br /&gt;
     fm.finda&amp;lt;9&amp;gt; = &#039;READU&#039;:vm:&#039;READVU&#039;:vm:&#039;MATREADU&#039;&lt;br /&gt;
     fm.words&amp;lt;10&amp;gt; = &#039;REPEAT&#039; ; fm.finda&amp;lt;10&amp;gt; = fm.finda&amp;lt;3&amp;gt;&lt;br /&gt;
* Special for C code&lt;br /&gt;
     fm.words&amp;lt;11&amp;gt; = &#039;{&#039; ; fm.findf&amp;lt;11&amp;gt; = &#039;}&#039;&lt;br /&gt;
     fm.words&amp;lt;12&amp;gt; = &#039;}&#039; ; fm.finda&amp;lt;12&amp;gt; = &#039;{&#039;&lt;br /&gt;
*&lt;br /&gt;
     endwords = &#039;IF\OPEN\OPENSEQ\READNEXT\READ\READU\READV\READVU\&#039;&lt;br /&gt;
     endwords := &#039;MATREAD\MATREADU\LOCATE&#039;&lt;br /&gt;
     convert &#039;\&#039; to am in endwords&lt;br /&gt;
&lt;br /&gt;
* page editor stuff&lt;br /&gt;
     botl = system(3) - 2; clpg = @(-1)&lt;br /&gt;
*     bell = char(7) ; span = system(2)&lt;br /&gt;
     bell = @sys.bell ; span = system(2)&lt;br /&gt;
     bott = @(0,system(3)-1):ceol&lt;br /&gt;
&lt;br /&gt;
* Define key activity numbers - 22 keys defined&lt;br /&gt;
     equ uarr to 1, darr to 2, larr to 3, rarr to 4&lt;br /&gt;
     equ upag to 5, dpag to 6, lpag to 7, rpag to 8&lt;br /&gt;
     equ tpag to 9, bpag to 10&lt;br /&gt;
     equ escp to 11, phlp to 12, zoom to 13&lt;br /&gt;
     equ delc to 14, dell to 15, delr to 16&lt;br /&gt;
     equ back to 17, carr to 18, togg to 19, writ to 20&lt;br /&gt;
     equ skey to 21, rkey to 22&lt;br /&gt;
&lt;br /&gt;
* Set up the keys - In QM we can use generic key mapping (YAY)&lt;br /&gt;
* but I also like to have default keys&lt;br /&gt;
     acts = &#039;&#039; ; keys = &#039;&#039;&lt;br /&gt;
* Arrow keys&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = uarr ; keys&amp;lt;-1&amp;gt; = char(205)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = uarr ; keys&amp;lt;-1&amp;gt; = char(26)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = darr ; keys&amp;lt;-1&amp;gt; = char(206)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = darr ; keys&amp;lt;-1&amp;gt; = char(10)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = larr ; keys&amp;lt;-1&amp;gt; = char(203)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = larr ; keys&amp;lt;-1&amp;gt; = char(21)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = rarr ; keys&amp;lt;-1&amp;gt; = char(204)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = rarr ; keys&amp;lt;-1&amp;gt; = char(6)&lt;br /&gt;
* Page movement keys&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = upag ; keys&amp;lt;-1&amp;gt; = char(207)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = upag ; keys&amp;lt;-1&amp;gt; = char(16)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = dpag ; keys&amp;lt;-1&amp;gt; = char(208)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = dpag ; keys&amp;lt;-1&amp;gt; = char(14)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = lpag ; keys&amp;lt;-1&amp;gt; = char(209)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = lpag ; keys&amp;lt;-1&amp;gt; = char(1)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = rpag ; keys&amp;lt;-1&amp;gt; = char(210)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = rpag ; keys&amp;lt;-1&amp;gt; = char(5)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = tpag ; keys&amp;lt;-1&amp;gt; = char(214)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = tpag ; keys&amp;lt;-1&amp;gt; = char(20)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = bpag ; keys&amp;lt;-1&amp;gt; = char(215)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = bpag ; keys&amp;lt;-1&amp;gt; = char(2)&lt;br /&gt;
* delete character, line, and delete to end of line keys&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = delc ; keys&amp;lt;-1&amp;gt; = char(212)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = delc ; keys&amp;lt;-1&amp;gt; = char(4)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = dell ; keys&amp;lt;-1&amp;gt; = char(216)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = dell ; keys&amp;lt;-1&amp;gt; = char(127)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = dell ; keys&amp;lt;-1&amp;gt; = char(24)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = delr ; keys&amp;lt;-1&amp;gt; = char(217)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = delr ; keys&amp;lt;-1&amp;gt; = char(11)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = delr ; keys&amp;lt;-1&amp;gt; = char(18) ;* for Wyse terminals&lt;br /&gt;
* backspace and carriage return keys&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = back ; keys&amp;lt;-1&amp;gt; = char(008)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = carr ; keys&amp;lt;-1&amp;gt; = char(013)&lt;br /&gt;
* escape, help, Go to line, toggle insert/overwrite mode, save keys&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = escp ; keys&amp;lt;-1&amp;gt; = char(027)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = escp ; keys&amp;lt;-1&amp;gt; = char(017)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = phlp ; keys&amp;lt;-1&amp;gt; = char(128)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = zoom ; keys&amp;lt;-1&amp;gt; = char(007)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = togg ; keys&amp;lt;-1&amp;gt; = char(211)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = togg ; keys&amp;lt;-1&amp;gt; = char(009)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = writ ; keys&amp;lt;-1&amp;gt; = char(129)&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = writ ; keys&amp;lt;-1&amp;gt; = char(023)&lt;br /&gt;
* search key, reverse search key&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = skey ; keys&amp;lt;-1&amp;gt; = char(130) ;* F3 for search&lt;br /&gt;
     acts&amp;lt;-1&amp;gt; = rkey ; keys&amp;lt;-1&amp;gt; = char(166) ;* shift-F3 for reverse search&lt;br /&gt;
&lt;br /&gt;
     mode = &#039;LINE&#039;&lt;br /&gt;
&lt;br /&gt;
* The saved stuff&lt;br /&gt;
     pres = &#039;&#039; ; look = &#039;&#039; ; stak = &#039;&#039;&lt;br /&gt;
     wild = false ; shew = false&lt;br /&gt;
     chan = &#039;&#039; ; olda = &#039;&#039; ; cmat = &#039;&#039; ; mmat = &#039;&#039;&lt;br /&gt;
     caseflag = false ; spaceflag = true ; blockflag = true&lt;br /&gt;
&lt;br /&gt;
* Save the standard defaults in the session variable if it&#039;s not set&lt;br /&gt;
$ifdef universe&lt;br /&gt;
     if unassigned(edkeep) then edkeep = &#039;0&#039;&lt;br /&gt;
$else&lt;br /&gt;
     if assigned(edkeep) else edkeep = &#039;0&#039;&lt;br /&gt;
$endif&lt;br /&gt;
     if edkeep eq &#039;0&#039; then&lt;br /&gt;
        edkeep = pres:am:look:am:stak:am:wild:am:chan:am:olda:am:shew&lt;br /&gt;
        edkeep := am:cmat:am:mmat:am:not(caseflag):am:not(spaceflag)&lt;br /&gt;
        edkeep := am:not(blockflag)&lt;br /&gt;
        kept = &#039;&#039;&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
* Get the &#039;as-is&#039; settings from the session variable&lt;br /&gt;
     pres = edkeep&amp;lt;1&amp;gt;&lt;br /&gt;
     look = edkeep&amp;lt;2&amp;gt;&lt;br /&gt;
     stak = edkeep&amp;lt;3&amp;gt;&lt;br /&gt;
     wild = edkeep&amp;lt;4&amp;gt; ; wild = not(not(wild))&lt;br /&gt;
     chan = edkeep&amp;lt;5&amp;gt;&lt;br /&gt;
     olda = edkeep&amp;lt;6&amp;gt;&lt;br /&gt;
     shew = edkeep&amp;lt;7&amp;gt; ; shew = not(not(shew))&lt;br /&gt;
     cmat = edkeep&amp;lt;8&amp;gt;&lt;br /&gt;
     mmat = edkeep&amp;lt;9&amp;gt;&lt;br /&gt;
     caseflag = not(edkeep&amp;lt;10&amp;gt;)&lt;br /&gt;
     spaceflag = not(edkeep&amp;lt;11&amp;gt;)&lt;br /&gt;
     blockflag = not(edkeep&amp;lt;12&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
* Get forced default flags&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
! nick = true&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
     read temp from voc, &#039;&amp;amp;ED.OPTIONS&#039; then&lt;br /&gt;
        line = upcase(trim(remove(temp, dlim)))&lt;br /&gt;
        if line[1,1] eq &#039;X&#039; then&lt;br /&gt;
           loop&lt;br /&gt;
              line = upcase(trim(remove(temp, dlim)))&lt;br /&gt;
              begin case&lt;br /&gt;
                 case line[1,8] eq &#039;BLOCK ON&#039;&lt;br /&gt;
                    blockflag = true&lt;br /&gt;
                 case line[1,9] eq &#039;BLOCK OFF&#039;&lt;br /&gt;
                    blockflag = false&lt;br /&gt;
                 case line[1,7] eq &#039;CASE ON&#039;&lt;br /&gt;
                    caseflag = true&lt;br /&gt;
                 case line[1,8] eq &#039;CASE OFF&#039;&lt;br /&gt;
                    caseflag = true&lt;br /&gt;
                 case line[1,8] eq &#039;SPACE ON&#039;&lt;br /&gt;
                    spaceflag = true&lt;br /&gt;
                 case line[1,9] eq &#039;SPACE OFF&#039;&lt;br /&gt;
                    spaceflag = true&lt;br /&gt;
                 case line[1,7] eq &#039;SHOW ON&#039;&lt;br /&gt;
                    shew = true&lt;br /&gt;
                 case line[1,8] eq &#039;SHOW OFF&#039;&lt;br /&gt;
                    shew = true&lt;br /&gt;
              end case&lt;br /&gt;
           while dlim repeat&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
$ifdef universe&lt;br /&gt;
     if unassigned(secure) then secure = &#039;0&#039;&lt;br /&gt;
$else&lt;br /&gt;
     if assigned(secure) else secure = &#039;0&#039;&lt;br /&gt;
$endif&lt;br /&gt;
&lt;br /&gt;
     prepprog = &#039;&#039; ; prepflag = false&lt;br /&gt;
     postprog = &#039;&#039; ; postflag = false&lt;br /&gt;
&lt;br /&gt;
*********** UniData AE-style security start&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
     prepprog = getenv(&#039;PREPROG_AE_UDT&#039;)&lt;br /&gt;
$endif&lt;br /&gt;
$ifdef universe&lt;br /&gt;
     execute &#039;ENV&#039; capturing temp&lt;br /&gt;
     xxno = dcount(temp,am)&lt;br /&gt;
     for xx = 1 to xxno&lt;br /&gt;
        line = temp&amp;lt;xx&amp;gt;&lt;br /&gt;
        if field(line,&#039;=&#039;,1) eq &#039;PREPROG_AE_UDT&#039; then&lt;br /&gt;
           prepprog = field(line,&#039;=&#039;,2)&lt;br /&gt;
           xxno = xx&lt;br /&gt;
        end&lt;br /&gt;
     next xx&lt;br /&gt;
$endif&lt;br /&gt;
$ifdef qm&lt;br /&gt;
* QM doesn&#039;t allow underscores in environmental variables, so&lt;br /&gt;
* this is the closest I can get to AE environmental variable name.&lt;br /&gt;
&lt;br /&gt;
     call !atvar(prepprog,&#039;@PREPROG.AE.UDT&#039;)&lt;br /&gt;
$endif&lt;br /&gt;
&lt;br /&gt;
* These next two tests are from the AE security documentation&lt;br /&gt;
* They may not be required, but you can set them up if you want&lt;br /&gt;
*    if prepprog[1,3] eq &#039;AE_&#039; then prepprog = &#039;&#039;&lt;br /&gt;
*    if prepprog[len(prepprog)-2,3] ne &#039;_AE&#039; then prepprog = &#039;&#039;&lt;br /&gt;
     if prepprog ne &#039;&#039; then prepflag = true&lt;br /&gt;
&lt;br /&gt;
* The following security definitions mirror those of I_AE_SECURITY&lt;br /&gt;
* in UniData.  I have only copied the functionality for SEC.SET&lt;br /&gt;
* being &amp;quot;NONE&amp;quot; (that is, this user cannot edit) and the general&lt;br /&gt;
* disabling of LOAD via the SEC.LOAD.FLG at first call to @PREPPROG;&lt;br /&gt;
* and inhibiting of file updates via subsequent @PREPPROG calls.&lt;br /&gt;
     dim security(40)&lt;br /&gt;
     equ sec.set to security(1) ;* set by preprog on very first call&lt;br /&gt;
* These fields are set in preprog&lt;br /&gt;
     equ sec.read.flg   to security(2) ;* read ok or not&lt;br /&gt;
     equ sec.write.flg  to security(3) ;* write ok or not&lt;br /&gt;
     equ sec.delete.flg to security(4) ;* delete ok or not&lt;br /&gt;
     equ sec.unload.flg to security(5) ;* unload ok or not&lt;br /&gt;
     equ sec.load.flg   to security(6) ;* load ok or not&lt;br /&gt;
     equ sec.xeq.flg    to security(7) ;* xeq ok or not&lt;br /&gt;
     equ sec.xcom.flg   to security(8) ;* xcoms ok or not&lt;br /&gt;
* the following 5 fields pass information to preprog &amp;amp; postprog,&lt;br /&gt;
     equ sec.fn         to security(9) ;* file name&lt;br /&gt;
     equ sec.id         to security(10);* record id&lt;br /&gt;
     equ sec.dir.flg        to security(11);* 1 if file is a directory&lt;br /&gt;
     equ sec.newfile.flg    to security(12);* 1 if new file name&lt;br /&gt;
     equ sec.active.sel.flg to security(13);* 1 if select list is active&lt;br /&gt;
* this is how to make AE stop and return to calling program or ecl&lt;br /&gt;
     equ sec.stop.flg   to security(14);* set to 1 to force ae to stop&lt;br /&gt;
* for secondary calls to preprog; the first 3 cannot be changed&lt;br /&gt;
     equ sec.call2.type to security(15);* 1 load, 2 unload&lt;br /&gt;
     equ sec.fn2        to security(16);* second file - for load/unload&lt;br /&gt;
     equ sec.id2        to security(17);* second id - for load or unload&lt;br /&gt;
     equ sec.ok2.flg    to security(18);* if 1, ok to load/unload&lt;br /&gt;
* 19-22 are used by postprog, which I have not implemented&lt;br /&gt;
     equ sec.dict.flg  to security(23) ;* 1 if fn is dict ...&lt;br /&gt;
     equ sec.dict2.flg to security(24) ;* 1 if fn2 is dict ...&lt;br /&gt;
* field 25 is specific to UNIDATA AE, this and all other fields unused&lt;br /&gt;
* WARNING: preprog programs should not use the STOP or ABORT statements&lt;br /&gt;
*          they should use the SEC.STOP.FLG to end nicely.&lt;br /&gt;
*********** UniData AE-style security end&lt;br /&gt;
&lt;br /&gt;
* QM has it&#039;s own source control system depending on a callable program&lt;br /&gt;
* named SOURCE.CONTROL existing.  It has the following fields&lt;br /&gt;
*&lt;br /&gt;
* DICT.FLAG     - &#039;DICT&#039; if a dictionary, otherwise &#039;&#039;&lt;br /&gt;
* FILE.NAME     - name of file to be written&lt;br /&gt;
* RECORD.NAME   - name of record to be written&lt;br /&gt;
* RECORD.DATA   - the record to write&lt;br /&gt;
* CALLER        - calling program identifier, I have used &#039;3&#039;&lt;br /&gt;
* WRITE.ALLOWED - 1 on call, returns 1 if write allowed and 0 otherwise&lt;br /&gt;
* UPDATED       - 0 on call, returns 1 if RECORD.DATA is changed&lt;br /&gt;
&lt;br /&gt;
     source.control = false&lt;br /&gt;
$ifdef qm&lt;br /&gt;
     if catalogued(&#039;SOURCE.CONTROL&#039;) then source.control = true&lt;br /&gt;
$else&lt;br /&gt;
* We can implement QM-style security if we want&lt;br /&gt;
     if prepprog eq &#039;SOURCE.CONTROL&#039; then source.control = true&lt;br /&gt;
$endif&lt;br /&gt;
     if source.control then prepflag = false ; prepprog = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
     name = @logname&lt;br /&gt;
     levl = @level&lt;br /&gt;
     path = @path&lt;br /&gt;
     term = @tty&lt;br /&gt;
     whom = @userno&lt;br /&gt;
     acct = @who&lt;br /&gt;
&lt;br /&gt;
* This is to display unprintable characters safely&lt;br /&gt;
     badc = char(255)&lt;br /&gt;
     for xx = 0 to 31    ; badc := char(xx) ; next xx&lt;br /&gt;
     for xx = 127 to 250 ; badc := char(xx) ; next xx&lt;br /&gt;
     gudc = str(&#039;~&#039;,len(badc))&lt;br /&gt;
* eeePC does not distinguish between these&lt;br /&gt;
     if index(upcase(system(7)),&#039;EEEPC&#039;,1) then&lt;br /&gt;
        badc := char(251):char(252):char(253); gudc := &#039;[\]&#039;&lt;br /&gt;
     end else&lt;br /&gt;
        badc := char(251):char(252):char(253)&lt;br /&gt;
        gudc := char(179):char(178):char(185)&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
* The yes/no can be language independant!&lt;br /&gt;
     yes = &#039;Yes&#039; ; yes = upcase(trim(yes))&lt;br /&gt;
     no = &#039;No&#039; ; no = upcase(trim(no))&lt;br /&gt;
     ny = &#039;(&#039;:no[1,1]:&#039;/&#039;:yes[1,1]:&#039;) &amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
* Want to see these thing in a single page&lt;br /&gt;
     presnumb = system(3)-2&lt;br /&gt;
     if presnumb gt 20 then presnumb = 20&lt;br /&gt;
     looknumb = presnumb; channumb = presnumb&lt;br /&gt;
&lt;br /&gt;
* Want this to be no more than five pages&lt;br /&gt;
     staknumb = (presnumb+1)*5+1&lt;br /&gt;
&lt;br /&gt;
* Parse the command line - long way in before work starts, eh?&lt;br /&gt;
* Anything in brackets is an option - but we do not use them at all.&lt;br /&gt;
* &amp;quot;verb&amp;quot; is how this was called so it should work to call again&lt;br /&gt;
     verb = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
$ifdef qm&lt;br /&gt;
$include parser.h&lt;br /&gt;
     call !parser(parser$reset, 0, @sentence, 0)&lt;br /&gt;
     opts = false&lt;br /&gt;
     options = &#039;&#039;&lt;br /&gt;
     sentence = &#039;&#039;&lt;br /&gt;
     loop&lt;br /&gt;
        call !parser(parser$get.token, type, param, keyword)&lt;br /&gt;
     until type eq parser$end do&lt;br /&gt;
        begin case&lt;br /&gt;
           case type eq 4 ; opts = true&lt;br /&gt;
           case type eq 5 ; opts = false&lt;br /&gt;
           case opts      ; options&amp;lt;-1&amp;gt; = param&lt;br /&gt;
           case 1         ; sentence&amp;lt;-1&amp;gt; = param&lt;br /&gt;
        end case&lt;br /&gt;
     repeat&lt;br /&gt;
$else&lt;br /&gt;
     rest = @sentence&lt;br /&gt;
     keepquot = false&lt;br /&gt;
     gosub parse.rest&lt;br /&gt;
     sentence = bite&lt;br /&gt;
     temp = dcount(sentence,am)&lt;br /&gt;
     options = sentence&amp;lt;temp&amp;gt;&lt;br /&gt;
     if options[1,1] eq &#039;(&#039; then&lt;br /&gt;
        options = field(field(options,&#039;(&#039;,2),&#039;)&#039;,1)&lt;br /&gt;
        sentence = delete(bite,temp,0,0)&lt;br /&gt;
     end else options = &#039;&#039;&lt;br /&gt;
$endif&lt;br /&gt;
&lt;br /&gt;
if options ne &#039;&#039; then options = &#039; (&#039;:options:&#039;)&#039;&lt;br /&gt;
&lt;br /&gt;
* The C option allows the user to build paragraphs&lt;br /&gt;
* using DATA statements to control the editor.&lt;br /&gt;
* Otherwise they are restricted to an interactive mode.&lt;br /&gt;
     if index(upcase(options),&#039;C&#039;,1)&lt;br /&gt;
        then editpage = false&lt;br /&gt;
        else editpage = true&lt;br /&gt;
&lt;br /&gt;
     if upcase(sentence&amp;lt;1&amp;gt;) eq &#039;RUN&#039; then&lt;br /&gt;
        verb = sentence&amp;lt;1&amp;gt;:&#039; &#039;:sentence&amp;lt;2&amp;gt;:&#039; &#039;&lt;br /&gt;
        sentence = delete(sentence,1,0,0)&lt;br /&gt;
        sentence = delete(sentence,1,0,0)&lt;br /&gt;
     end&lt;br /&gt;
     verb = verb:sentence&amp;lt;1&amp;gt;&lt;br /&gt;
     sentence = delete(sentence,1,0,0)&lt;br /&gt;
&lt;br /&gt;
* Check if a viewing verb has been used&lt;br /&gt;
* If so, we can turn off both security systems (I mope I&#039;m right!)&lt;br /&gt;
* The security flags are set safe, and each command is tested&lt;br /&gt;
* individually, so I think it&#039;s pretty safe.&lt;br /&gt;
* FORMAT is still allowed, but no other change command.&lt;br /&gt;
&lt;br /&gt;
     viewflag = false ; view = &#039;edit&#039;&lt;br /&gt;
     locate(upcase(verb),viewverb;posn) then&lt;br /&gt;
        viewflag = true&lt;br /&gt;
        view = &#039;view&#039;&lt;br /&gt;
        source.control = false&lt;br /&gt;
        prepflag = false&lt;br /&gt;
     end&lt;br /&gt;
* OR, they used the V option&lt;br /&gt;
     if index(upcase(options),&#039;V&#039;,1) then&lt;br /&gt;
        viewflag = true&lt;br /&gt;
        view = &#039;view&#039;&lt;br /&gt;
        source.control = false&lt;br /&gt;
        prepflag = false&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
* HELP location&lt;br /&gt;
     help.def = &#039;2.00&#039;&lt;br /&gt;
     help = &#039;&#039;&lt;br /&gt;
     pagehelp = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
     fnam = sentence&amp;lt;1&amp;gt;&lt;br /&gt;
     sentence = delete(sentence,1,0,0)&lt;br /&gt;
     if upcase(fnam) eq &#039;DICT&#039; then&lt;br /&gt;
        fnam = &#039;DICT &#039;:sentence&amp;lt;1&amp;gt;&lt;br /&gt;
        sentence = delete(sentence,1,0,0)&lt;br /&gt;
     end&lt;br /&gt;
     idlist = sentence&lt;br /&gt;
&lt;br /&gt;
     if system(11) and idlist ne &#039;&#039; then&lt;br /&gt;
        crt &#039;A select list was active, but specific ids were entered.&#039;&lt;br /&gt;
        crt &#039;Select list will be ignored.&#039;&lt;br /&gt;
        crt str(&#039;-&#039;,len(&#039;Select list will be ignored.&#039;))&lt;br /&gt;
        clearselect&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
     open &#039;AE_COMS&#039; to acom else&lt;br /&gt;
$ifdef qm&lt;br /&gt;
        execute &#039;CREATE.FILE AE_COMS&#039;&lt;br /&gt;
$else&lt;br /&gt;
        execute &#039;CREATE.FILE AE_COMS 1 7&#039;&lt;br /&gt;
$endif&lt;br /&gt;
        open &#039;AE_COMS&#039; to acom else stop &#039;Cannot open &#039;:&#039;AE_COMS&#039;&lt;br /&gt;
        test = @(0,0)&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
* Get file&lt;br /&gt;
     loop&lt;br /&gt;
        got.file = false&lt;br /&gt;
        if fnam eq &#039;&#039; then&lt;br /&gt;
           stub = &#039;File name? &#039;&lt;br /&gt;
           gosub get.rope; fnam = rope; crt&lt;br /&gt;
        end&lt;br /&gt;
        if fnam eq &#039;&#039; then stop&lt;br /&gt;
        dprt = field(fnam,&#039; &#039;,1)&lt;br /&gt;
        fprt = field(fnam,&#039; &#039;,2)&lt;br /&gt;
        if fprt eq &#039;&#039; then fprt = dprt ; dprt = &#039;&#039;&lt;br /&gt;
        open dprt, fprt to file then&lt;br /&gt;
           got.file = true&lt;br /&gt;
        end else&lt;br /&gt;
           open upcase(dprt),upcase(fprt) to file then&lt;br /&gt;
              got.file = true&lt;br /&gt;
           end else&lt;br /&gt;
              crt &#039;Cannot open &#039;:&#039;&amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
              fnam = &#039;&#039;&lt;br /&gt;
           end&lt;br /&gt;
        end&lt;br /&gt;
     until got.file do&lt;br /&gt;
     repeat&lt;br /&gt;
     if fileinfo(file,3) eq &#039;4&#039; then bleach = false else bleach = true&lt;br /&gt;
     bleach = upcase(fileinfo(file,2))&lt;br /&gt;
     if bleach[2] = &#039;BP&#039; or bleach[7] = &#039;SFPROGS&#039;&lt;br /&gt;
        then bleach = false&lt;br /&gt;
        else bleach = true&lt;br /&gt;
&lt;br /&gt;
* Get the record&lt;br /&gt;
     if idlist eq &#039;*&#039; then&lt;br /&gt;
        idlist = &#039;&#039;&lt;br /&gt;
        execute &#039;SELECT &#039;:dprt:&#039; &#039;:fprt&lt;br /&gt;
        test = @(0,0)&lt;br /&gt;
     end&lt;br /&gt;
     if system(11) then&lt;br /&gt;
        eof = false&lt;br /&gt;
        loop&lt;br /&gt;
           readnext id else eof = true&lt;br /&gt;
        until eof do&lt;br /&gt;
           idlist&amp;lt;-1&amp;gt; = id&lt;br /&gt;
        repeat&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
     loop&lt;br /&gt;
        killsign = false&lt;br /&gt;
        if idlist eq &#039;&#039; then&lt;br /&gt;
           stub = &#039;Record name? &#039;&lt;br /&gt;
           gosub get.rope; rest = rope ; crt&lt;br /&gt;
           keepquot = false&lt;br /&gt;
           gosub parse.rest&lt;br /&gt;
           idlist = bite&lt;br /&gt;
           bite = &#039;&#039; ; rest = &#039;&#039;&lt;br /&gt;
        end&lt;br /&gt;
        idcnt = dcount(idlist,am)&lt;br /&gt;
        for id = 1 to idcnt until killsign&lt;br /&gt;
           item = idlist&amp;lt;id&amp;gt;&lt;br /&gt;
           gosub edit.item&lt;br /&gt;
        next id&lt;br /&gt;
     while killsign do&lt;br /&gt;
        idlist = &#039;&#039;&lt;br /&gt;
     repeat&lt;br /&gt;
&lt;br /&gt;
     edkeep = pres:am:look:am:stak:am:wild:am:chan:am:olda:am:shew&lt;br /&gt;
     edkeep := am:cmat:am:mmat:am:not(caseflag):am:not(spaceflag)&lt;br /&gt;
     edkeep := am:not(blockflag):am:lower(kept)&lt;br /&gt;
     stop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* SUBROUTINES&lt;br /&gt;
* ***********&lt;br /&gt;
edit.item:&lt;br /&gt;
     stopsign = false&lt;br /&gt;
     here = 0 ; dnum = 0&lt;br /&gt;
     beg = 0 ; fin = 0 ; krj = &#039;&#039;&lt;br /&gt;
     crt&lt;br /&gt;
     if idcnt gt 1 then crt &#039;&amp;lt;&#039;:id:&#039;/&#039;:idcnt:&#039;&amp;gt; &#039;:&lt;br /&gt;
&lt;br /&gt;
     if prepflag then&lt;br /&gt;
        if secure eq &#039;0&#039; then&lt;br /&gt;
           mat security = &#039;&#039;&lt;br /&gt;
           sec.set = &#039;&#039;&lt;br /&gt;
           call @prepprog(mat security)&lt;br /&gt;
           if sec.set eq &#039;NONE&#039; then stop&lt;br /&gt;
           if sec.stop.flg then stop&lt;br /&gt;
           secure = sec.set&lt;br /&gt;
        end&lt;br /&gt;
        mat security = &#039;&#039;&lt;br /&gt;
        sec.set = secure&lt;br /&gt;
        if sec.set then&lt;br /&gt;
           sec.fn = fprt&lt;br /&gt;
           sec.id = item&lt;br /&gt;
           sec.dir.flg = fileinfo(file,3) = &#039;4&#039;&lt;br /&gt;
           sec.newfile.flg = false&lt;br /&gt;
           sec.active.sel.flg = false&lt;br /&gt;
           sec.dict.flg = (dprt = &#039;DICT&#039;)&lt;br /&gt;
           call @prepprog(mat security)&lt;br /&gt;
           if sec.stop.flg then stop&lt;br /&gt;
           if not(sec.read.flg) then return&lt;br /&gt;
        end&lt;br /&gt;
     end else&lt;br /&gt;
        sec.stop.flg = false&lt;br /&gt;
        sec.read.flg = true&lt;br /&gt;
        sec.write.flg = true&lt;br /&gt;
        sec.delete.flg = true&lt;br /&gt;
        sec.xcom.flg = true&lt;br /&gt;
        sec.unload.flg = true&lt;br /&gt;
        sec.load.flg = true&lt;br /&gt;
        sec.xeq.flg = true&lt;br /&gt;
        sec.ok2.flg = true&lt;br /&gt;
* Apply the viewing flag&lt;br /&gt;
        if viewflag then&lt;br /&gt;
           crt &#039;VIEW ONLY - NO UPDATES ALLOWED&#039;&lt;br /&gt;
           sec.write.flg = false&lt;br /&gt;
           sec.delete.flg = false&lt;br /&gt;
           sec.xcom.flg = false&lt;br /&gt;
           sec.unload.flg = false&lt;br /&gt;
           sec.load.flg = false&lt;br /&gt;
           sec.xeq.flg = false&lt;br /&gt;
           sec.ok2.flg = false&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
     readu this from file, item locked goto locked.record then&lt;br /&gt;
        lock = true&lt;br /&gt;
carry.on:&lt;br /&gt;
        gosub parse.record&lt;br /&gt;
        crt &#039;Top of &amp;quot;&#039;:item:&#039;&amp;quot; in &amp;quot;&#039;:fnam:&#039;&amp;quot;, &#039;:last:&#039; lines, &#039;:len(this):&#039; characters.&#039;&lt;br /&gt;
     end else&lt;br /&gt;
        lock = true&lt;br /&gt;
        this = &#039;&#039;&lt;br /&gt;
        gosub parse.record&lt;br /&gt;
        crt &#039;Top of new &amp;quot;&#039;:item:&#039;&amp;quot; in &amp;quot;&#039;:fnam:&#039;&amp;quot;.&#039;&lt;br /&gt;
     end&lt;br /&gt;
     orig = this&lt;br /&gt;
     gosub get.lfmt&lt;br /&gt;
&lt;br /&gt;
* Edit the record&lt;br /&gt;
     loop&lt;br /&gt;
        if mode&amp;lt;1&amp;gt; eq &#039;PAGE&#039; then&lt;br /&gt;
           pcol = rem(pchr-1,span)&lt;br /&gt;
           prow = here+1-ptop&lt;br /&gt;
           crt @(60,0):ceol:revb:mode&amp;lt;2&amp;gt;:revf:&#039; &#039;:fmt(here,&#039;R#4&#039;):&lt;br /&gt;
           crt &#039;,&#039;:fmt(pchr,&#039;L#4&#039;):&lt;br /&gt;
           bite = temp[pchr,1]&lt;br /&gt;
           if bite ne &#039;&#039; then crt &#039; (&#039;:seq(bite):&#039;)&#039;:&lt;br /&gt;
           crt @(pcol,prow):&lt;br /&gt;
           gosub get.page.comd&lt;br /&gt;
           if mode eq &#039;LINE&#039; then&lt;br /&gt;
              crt bott:&#039;Line Editor Mode&#039;:&lt;br /&gt;
              if that ne this then&lt;br /&gt;
                 crt &#039; - CHANGES HAVE BEEN MADE&#039;:&lt;br /&gt;
                 oops = that ; oopc = &#039;PE&#039;&lt;br /&gt;
                 oopl = savl&amp;lt;1&amp;gt; ; oopf = savl&amp;lt;2&amp;gt;&lt;br /&gt;
                 oopb = beg:am:fin ; oopk = krj&lt;br /&gt;
              end&lt;br /&gt;
              crt&lt;br /&gt;
              that = &#039;&#039;&lt;br /&gt;
              gosub display.line&lt;br /&gt;
           end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if mode&amp;lt;1&amp;gt; eq &#039;LINE&#039; then&lt;br /&gt;
* Get the command&lt;br /&gt;
           if x$cc ne &#039;&#039; then&lt;br /&gt;
              comi = x$cc&amp;lt;1&amp;gt;&lt;br /&gt;
              x$cc = delete(x$cc,1,0,0)&lt;br /&gt;
           end else&lt;br /&gt;
              if mode&amp;lt;1&amp;gt; eq &#039;PAGE&#039; then continue&lt;br /&gt;
              if salt ne &#039;&#039; then&lt;br /&gt;
                 comi = salt&amp;lt;1,1,1&amp;gt;; del salt&amp;lt;1,1,1&amp;gt;&lt;br /&gt;
              end else&lt;br /&gt;
                 stub = prmt:&#039;: &#039;; heap = true&lt;br /&gt;
                 gosub get.rope; comi = rope; heap = false&lt;br /&gt;
              end&lt;br /&gt;
              if macn then macc&amp;lt;1,1,-1&amp;gt; = comi&lt;br /&gt;
           end&lt;br /&gt;
           gosub parse.command&lt;br /&gt;
           if not(numb eq &#039;&#039; or numb matches &#039;1N0N&#039;) then&lt;br /&gt;
              crt ; gosub bad.command&lt;br /&gt;
              continue&lt;br /&gt;
           end&lt;br /&gt;
           if comd eq &#039;&#039; then&lt;br /&gt;
              gosub null.command&lt;br /&gt;
              if comd eq &#039;&#039; then continue&lt;br /&gt;
           end&lt;br /&gt;
* Save command to list&lt;br /&gt;
           if comi ne &#039;&#039; and comi ne stak&amp;lt;1,1&amp;gt; and comd ne &#039;D&#039; then&lt;br /&gt;
              stak = insert(stak,1,1,0,comi)&lt;br /&gt;
              stak = delete(stak,1,staknumb,0)&lt;br /&gt;
           end&lt;br /&gt;
* Apply the command&lt;br /&gt;
           if comd ne &#039;R&#039; then crt&lt;br /&gt;
           if comd matches &#039;1N0N&#039; then&lt;br /&gt;
              here = comd&lt;br /&gt;
              if here gt last then here = last&lt;br /&gt;
              gosub display.line&lt;br /&gt;
              continue&lt;br /&gt;
           end&lt;br /&gt;
           loop&lt;br /&gt;
              redo = false&lt;br /&gt;
              first = comd[1,1]&lt;br /&gt;
              posn = index(&#039;ABCDEFGHIJKLMNOPQRSTUVWXYZ&#039;,first,1)&lt;br /&gt;
              on posn gosub a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z&lt;br /&gt;
           while redo do repeat&lt;br /&gt;
           if stopsign then release file, item ; lock = false ; return&lt;br /&gt;
        end&lt;br /&gt;
     repeat&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
parse.command:&lt;br /&gt;
     comi = trimf(comi)&lt;br /&gt;
     dlim = oconv(oconv(comi,&#039;MC/A&#039;),&#039;MC/N&#039;)[1,1]&lt;br /&gt;
     if dlim eq &#039;&#039; then&lt;br /&gt;
        rest = &#039;&#039;&lt;br /&gt;
        comd = upcase(comi)&lt;br /&gt;
     end else&lt;br /&gt;
        posn = index(comi,dlim,1)&lt;br /&gt;
        rest = comi[posn+1,huge]&lt;br /&gt;
        comd = upcase(comi[1,posn-1])&lt;br /&gt;
     end&lt;br /&gt;
     temp = oconv(comd,&#039;MCN&#039;)[1,1]&lt;br /&gt;
     if temp ne &#039;&#039; then&lt;br /&gt;
        temp = index(comd,temp,1)&lt;br /&gt;
        numb = comd[temp,huge]&lt;br /&gt;
        comd = comd[1,temp-1]&lt;br /&gt;
     end else numb = &#039;&#039;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
parse.line:&lt;br /&gt;
     if line eq comdmark then line = &#039;&#039;&lt;br /&gt;
     xx = 1&lt;br /&gt;
     loop&lt;br /&gt;
        temp = index(line,&#039;^&#039;,xx)&lt;br /&gt;
     while temp do&lt;br /&gt;
        bite = line[temp,5]&lt;br /&gt;
        if bite matches &#039;&amp;quot;^^&amp;quot;3N&#039; then&lt;br /&gt;
           line = line[1,temp-1]:line[temp+1,len(line)]&lt;br /&gt;
           xx += 1&lt;br /&gt;
        end else&lt;br /&gt;
           bite = bite[1,4]&lt;br /&gt;
           if bite matches &#039;&amp;quot;^&amp;quot;3N&#039; then&lt;br /&gt;
              line= line[1,temp-1]:char(bite[2,3]):line[temp+4,len(line)]&lt;br /&gt;
           end else xx += 1&lt;br /&gt;
        end&lt;br /&gt;
     repeat&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
a:   begin case&lt;br /&gt;
        case comd eq &#039;A&#039;                 ; * append&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then rest = olda&amp;lt;1,1&amp;gt;&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              crt &#039;No previous append command to repeat&#039;&lt;br /&gt;
              gosub bad.comd&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           olda = rest:vm:dlim&lt;br /&gt;
           line = rest ; gosub parse.line ; rest = line&lt;br /&gt;
           chng = 0 ; save = here ; savl = last&lt;br /&gt;
           dnum = 1&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              line = line:rest&lt;br /&gt;
              if not(chng) then gosub savethis&lt;br /&gt;
              memr(cell)&amp;lt;lnum&amp;gt; = line&lt;br /&gt;
              chng += 1&lt;br /&gt;
              if shew or dnum lt plen then gosub display.line&lt;br /&gt;
           next here&lt;br /&gt;
           here = dusk&lt;br /&gt;
           if chng then&lt;br /&gt;
              gosub reset.record&lt;br /&gt;
              crt chng:&#039; lines changed - now at &#039;:here&lt;br /&gt;
           end&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
b:   begin case&lt;br /&gt;
        case comd eq &#039;B&#039; and dlim eq &#039;&#039;   ; * bottom&lt;br /&gt;
           here = last ; gosub display.line&lt;br /&gt;
        case index(&#039;\B\BD\BK\BR\BS\&#039;,&#039;\&#039;:comd:&#039;\&#039;,1)   ; * break line&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              crt &#039;The second field is empty.&#039;&lt;br /&gt;
              gosub bad.comd&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           chng = 0 ; save = here ; savl = last ; show = &#039;&#039;&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           for here = dusk to dawn step -1&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              posn = index(line,rest,1)&lt;br /&gt;
              if posn then&lt;br /&gt;
                 left = line[1,posn-1]&lt;br /&gt;
                 temp = line[posn+len(rest),len(line)]&lt;br /&gt;
                 if temp ne &#039;&#039; or comd eq &#039;BS&#039; then&lt;br /&gt;
                    begin case&lt;br /&gt;
                       case comd eq &#039;BD&#039; ; line = left:rest&lt;br /&gt;
                       case comd eq &#039;BK&#039; ; line = temp&lt;br /&gt;
                       case comd eq &#039;BR&#039; ; line = temp:left:rest&lt;br /&gt;
                       case comd eq &#039;BS&#039; ; line = temp:rest:left&lt;br /&gt;
                       case 1 ; line = left:rest&lt;br /&gt;
                    end case&lt;br /&gt;
                    memr(cell)&amp;lt;lnum&amp;gt; = line&lt;br /&gt;
                    show = insert(show,1,0,0,here)&lt;br /&gt;
                    numb += 1&lt;br /&gt;
                    chng += 1&lt;br /&gt;
                    if comd eq &#039;B&#039; then&lt;br /&gt;
                       dusk += 1&lt;br /&gt;
                       last += 1&lt;br /&gt;
                       lnum += 1&lt;br /&gt;
                       line = temp&lt;br /&gt;
                       gosub insert.line&lt;br /&gt;
                    end&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
           next here&lt;br /&gt;
           if chng then&lt;br /&gt;
              gosub savethis&lt;br /&gt;
              gosub reset.record&lt;br /&gt;
              zzno = dcount(show,am)&lt;br /&gt;
              savl = 0 ; dnum = 1&lt;br /&gt;
              for zz = 1 to zzno&lt;br /&gt;
                 here = show&amp;lt;zz&amp;gt; + savl&lt;br /&gt;
                 if shew or dnum lt plen then gosub display.line&lt;br /&gt;
                 if comd eq &#039;B&#039; and zzno gt 1 then&lt;br /&gt;
                    here += 1&lt;br /&gt;
                    savl += 1&lt;br /&gt;
                    if shew or dnum lt plen then gosub display.line&lt;br /&gt;
                 end&lt;br /&gt;
              next zz&lt;br /&gt;
              show = &#039;&#039;&lt;br /&gt;
           end&lt;br /&gt;
           if comd eq &#039;B&#039;&lt;br /&gt;
              then here = dusk + numb - 2&lt;br /&gt;
              else here = dusk&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           if chng then&lt;br /&gt;
              crt &#039;Split &#039;:numb:&#039; records.  Now at line &#039;:here&lt;br /&gt;
           end&lt;br /&gt;
           gosub get.line&lt;br /&gt;
       case index(&#039;\BC\BCD\BCK\BCR\BCS\&#039;,&#039;\&#039;:comd:&#039;\&#039;,1)   ; * Break @ Column&lt;br /&gt;
          if viewflag then gosub viewonly ; return&lt;br /&gt;
          posn = trim(field(rest,dlim,1))&lt;br /&gt;
          if not(posn matches &#039;1n0n&#039;) then&lt;br /&gt;
             crt &#039;No column position given&#039;&lt;br /&gt;
             gosub bad.comd&lt;br /&gt;
             return&lt;br /&gt;
          end&lt;br /&gt;
          chng = 0 ; save = here ; show = &#039;&#039;&lt;br /&gt;
          gosub set.bounds&lt;br /&gt;
          for here = dusk to dawn step -1&lt;br /&gt;
             gosub get.line&lt;br /&gt;
             if len(line) gt posn then&lt;br /&gt;
                left = line[1,posn-1]&lt;br /&gt;
                temp = line[posn+1,len(line)]&lt;br /&gt;
                if temp ne &#039;&#039; or comd eq &#039;BCS&#039; then&lt;br /&gt;
                   begin case&lt;br /&gt;
                      case comd eq &#039;BCD&#039; ; line = left:rest&lt;br /&gt;
                      case comd eq &#039;BCK&#039; ; line = temp&lt;br /&gt;
                      case comd eq &#039;BCR&#039; ; line = temp:left:rest&lt;br /&gt;
                      case comd eq &#039;BCS&#039; ; line = temp:rest:left&lt;br /&gt;
                      case 1 ; line = left:rest&lt;br /&gt;
                   end case&lt;br /&gt;
                   memr(cell)&amp;lt;lnum&amp;gt; = line&lt;br /&gt;
                   show = insert(show,1,0,0,here)&lt;br /&gt;
                   numb += 1&lt;br /&gt;
                   chng += 1&lt;br /&gt;
                   if comd eq &#039;BC&#039; then&lt;br /&gt;
                      dusk += 1&lt;br /&gt;
                      last += 1&lt;br /&gt;
                      lnum += 1&lt;br /&gt;
                      line = temp&lt;br /&gt;
                      gosub insert.line&lt;br /&gt;
                   end&lt;br /&gt;
                end&lt;br /&gt;
             end&lt;br /&gt;
          next here&lt;br /&gt;
           if chng then&lt;br /&gt;
              gosub savethis&lt;br /&gt;
              gosub reset.record&lt;br /&gt;
              zzno = dcount(show,am)&lt;br /&gt;
              savl = 0 ; dnum = 1&lt;br /&gt;
              for zz = 1 to zzno&lt;br /&gt;
                 here = show&amp;lt;zz&amp;gt; + savl&lt;br /&gt;
                 if shew or dnum lt plen then gosub display.line&lt;br /&gt;
                 if comd eq &#039;BC&#039; and zzno gt 1 then&lt;br /&gt;
                    here += 1&lt;br /&gt;
                    savl += 1&lt;br /&gt;
                    if shew or dnum lt plen then gosub display.line&lt;br /&gt;
                 end&lt;br /&gt;
              next zz&lt;br /&gt;
              show = &#039;&#039;&lt;br /&gt;
           end&lt;br /&gt;
           if comd eq &#039;BC&#039;&lt;br /&gt;
              then here = dusk + numb - 2&lt;br /&gt;
              else here = dusk&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           if chng then&lt;br /&gt;
              crt &#039;Split &#039;:numb:&#039; records.  Now at line &#039;:here&lt;br /&gt;
           end&lt;br /&gt;
           gosub get.line&lt;br /&gt;
        case comd eq &#039;BLEACH&#039;               ; * change BLEACH flag&lt;br /&gt;
           rest = upcase(rest)&lt;br /&gt;
           begin case&lt;br /&gt;
              case rest eq &#039;ON&#039; ; bleach = true&lt;br /&gt;
              case rest eq &#039;OFF&#039; ; bleach = false&lt;br /&gt;
              case 1 ; bleach = not(bleach)&lt;br /&gt;
           end case&lt;br /&gt;
           if bleach&lt;br /&gt;
              then crt &#039;Colours disabled&#039;&lt;br /&gt;
              else crt &#039;Colours enabled&#039;&lt;br /&gt;
        case comd eq &#039;BLOCK&#039;               ; * change BLOCK flag&lt;br /&gt;
           rest = upcase(rest)&lt;br /&gt;
           begin case&lt;br /&gt;
              case rest eq &#039;ON&#039; ; blockflag = true&lt;br /&gt;
              case rest eq &#039;OFF&#039; ; blockflag = false&lt;br /&gt;
              case 1 ; blockflag = not(blockflag)&lt;br /&gt;
           end case&lt;br /&gt;
           if blockflag then&lt;br /&gt;
              crt &#039;Verification of block actions enabled&#039;&lt;br /&gt;
           end else crt &#039;Verification of block actions disabled&#039;&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
c:   begin case&lt;br /&gt;
        case comd eq &#039;C&#039;                 ; * change&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if numb eq &#039;&#039; and dlim eq &#039;&#039; then&lt;br /&gt;
              comd = &#039;RA&#039;&lt;br /&gt;
              comi = &#039;RA1&#039;&lt;br /&gt;
              numb = 1&lt;br /&gt;
           end&lt;br /&gt;
           gosub change.command&lt;br /&gt;
        case comd eq &#039;CAT&#039; ; comd = &#039;J&#039; ; redo = true&lt;br /&gt;
        case comd eq &#039;CASE&#039;               ; * change casing flag for &#039;L&#039;&lt;br /&gt;
           rest = upcase(rest)&lt;br /&gt;
           begin case&lt;br /&gt;
              case rest eq &#039;ON&#039; ; caseflag = true&lt;br /&gt;
              case rest eq &#039;OFF&#039; ; caseflag = false&lt;br /&gt;
              case 1 ; caseflag = not(caseflag)&lt;br /&gt;
           end case&lt;br /&gt;
           if caseflag then&lt;br /&gt;
              crt &#039;Searches are case-sensitive&#039;&lt;br /&gt;
           end else crt &#039;Searches are not case-sensitive&#039;&lt;br /&gt;
        case comd eq &#039;CD&#039;        ; * command delimiter display (change)&lt;br /&gt;
           if dlim eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Command delimiter is &#039;:&lt;br /&gt;
           end else&lt;br /&gt;
              temp = &#039;`,;#$%&amp;amp;~|[]{}/&amp;quot;&#039;:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
              if index(temp,dlim,1) then&lt;br /&gt;
                 comdmark = dlim&lt;br /&gt;
                 crt &#039;Command delimiter is &#039;:&lt;br /&gt;
              end else&lt;br /&gt;
                 crt dlim:&#039; is not a valid command delimiter.&#039;&lt;br /&gt;
                 crt &#039;Characters available for delimiters: &#039;:temp&lt;br /&gt;
                 crt &#039;Characters reserved for other uses: \.*!?-+=^@&amp;lt;&amp;gt;_:&#039;&lt;br /&gt;
                 crt &#039;Command delimiter is &#039;:&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           if comdmark eq &#039;&amp;quot;&#039;&lt;br /&gt;
              then crt &amp;quot;&#039;&amp;quot;:comdmark:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
              else crt &#039;&amp;quot;&#039;:comdmark:&#039;&amp;quot;&#039;&lt;br /&gt;
        case comd eq &#039;CLEAR&#039;             ; * Clear the kept buffer&lt;br /&gt;
           if kept eq &#039;&#039;&lt;br /&gt;
              then crt &#039;Nothing in KEPT buffer&#039;&lt;br /&gt;
              else crt &#039;KEPT buffer cleared&#039;&lt;br /&gt;
           kept = &#039;&#039;&lt;br /&gt;
        case comd = &#039;COPY&#039;                   ; * copy to kept buffer&lt;br /&gt;
           if comd eq upcase(comi) then&lt;br /&gt;
              if not(beg) and not(fin) then&lt;br /&gt;
                 crt &#039;Command requests a block operation, but no block is defined.&#039;&lt;br /&gt;
                 gosub bad.comd; return&lt;br /&gt;
              end&lt;br /&gt;
              rest = beg&lt;br /&gt;
              numb = fin-beg+1&lt;br /&gt;
           end&lt;br /&gt;
           rest = trim(rest)&lt;br /&gt;
           if numb eq &#039;&#039; then gosub parse.atts&lt;br /&gt;
           if rest eq &#039;&#039; then rest = here&lt;br /&gt;
           if not(rest matches &#039;1N0N&#039;) or numb eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Formats are: &amp;quot;COPY&amp;quot; (from &amp;lt;&amp;gt; block) or &amp;quot;COPYn&amp;quot; or &amp;quot;COPYn/s&amp;quot; or &amp;quot;COPY/s/f&amp;quot;.&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           if numb lt 1 then&lt;br /&gt;
              crt &#039;Nothing done - no lines selected.&#039;&lt;br /&gt;
              comi = &#039;&#039;; return&lt;br /&gt;
           end&lt;br /&gt;
           if numb gt last then&lt;br /&gt;
              crt &#039;Nothing done - record does not have that many lines.&#039;&lt;br /&gt;
              comi = &#039;&#039; ; return&lt;br /&gt;
           end&lt;br /&gt;
           kept = field(this,am,rest,numb)&lt;br /&gt;
           numb = dcount(kept,am)&lt;br /&gt;
           if numb then crt numb:&#039; lines copied to KEPT buffer starting at line &#039;:rest&lt;br /&gt;
        case comd eq &#039;CM&#039;                ; * changematch command&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              if cmat eq &#039;&#039; then&lt;br /&gt;
                 crt &#039;No previous ChangeMatch command to repeat.&#039;&lt;br /&gt;
                 comi = &#039;&#039;&lt;br /&gt;
                 return&lt;br /&gt;
              end else&lt;br /&gt;
                 dlim = cmat&amp;lt;1,1&amp;gt;&lt;br /&gt;
                 rest = cmat&amp;lt;1,2&amp;gt;&lt;br /&gt;
                 numb = cmat&amp;lt;1,3&amp;gt;&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           gosub changematch.command&lt;br /&gt;
        case comd eq &#039;COL&#039;               ; * column display&lt;br /&gt;
           temp = &#039;&#039;&lt;br /&gt;
           for xx = 1 to 9&lt;br /&gt;
              temp = temp:space(9):xx&lt;br /&gt;
           next xx&lt;br /&gt;
           if lfmt&lt;br /&gt;
              then crt begn:space(llen+2):temp[1,span-llen-2]&lt;br /&gt;
              else crt begn:temp[1,span]&lt;br /&gt;
           temp = str(&#039;1234567890&#039;,10)&lt;br /&gt;
           if lfmt&lt;br /&gt;
              then crt begn:space(llen+2):temp[1,span-llen-2]&lt;br /&gt;
              else crt begn:temp[1,span]&lt;br /&gt;
           temp = &#039;&#039;&lt;br /&gt;
        case comd eq &#039;COUNT&#039;             ; * show the count of a string&lt;br /&gt;
           line = rest ; gosub parse.line ; rest = line&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              crt &#039;No string given to count&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           if not(caseflag) then rest = upcase(rest)&lt;br /&gt;
           temp = 0&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              if caseflag&lt;br /&gt;
                 then temp = temp + count(line,rest)&lt;br /&gt;
                 else temp = temp + count(upcase(line),rest)&lt;br /&gt;
           next here&lt;br /&gt;
           here = dusk&lt;br /&gt;
           crt temp:&#039; occurances of string.&#039;&lt;br /&gt;
        case comd eq &#039;CRT&#039;           ; * insert crt line for programmer&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              crt &#039;You have not said what to put on CRT line!&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           gosub savethat&lt;br /&gt;
           here += 1 ; last += 1 ; lnum += 1&lt;br /&gt;
           if dlim ne &#039;&amp;quot;&#039; and dlim ne &#039;\&#039; then dlim = &amp;quot;&#039;&amp;quot;&lt;br /&gt;
           line = &#039;CRT &#039;:dlim:rest:&#039; = &#039;:dlim:&#039;:&#039;:rest&lt;br /&gt;
           gosub insert.line&lt;br /&gt;
           gosub reset.record&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;CUT&#039;               ;* Move lines to kept buffer&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if comd eq upcase(comi) then&lt;br /&gt;
              if not(beg) and not(fin) then&lt;br /&gt;
                 crt &#039;Command requests a block operation, but no block is defined.&#039;&lt;br /&gt;
                 gosub bad.comd; return&lt;br /&gt;
              end&lt;br /&gt;
              rest = beg&lt;br /&gt;
              numb = fin-beg+1&lt;br /&gt;
           end&lt;br /&gt;
           rest = trim(rest)&lt;br /&gt;
           if numb eq &#039;&#039; then gosub parse.atts&lt;br /&gt;
           if rest eq &#039;&#039; then rest = here&lt;br /&gt;
           if not(rest matches &#039;1N0N&#039;) or numb eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Formats are: &amp;quot;CUT&amp;quot; (from &amp;lt;&amp;gt; block) or &amp;quot;CUTn&amp;quot; or &amp;quot;CUTn/s&amp;quot; or &amp;quot;CUT/s/f&amp;quot;.&#039;&lt;br /&gt;
              gosub bad.comd; return&lt;br /&gt;
           end&lt;br /&gt;
           if numb gt last then&lt;br /&gt;
              crt &#039;Nothing done - record does not have that many lines.&#039;&lt;br /&gt;
              comi = &#039;&#039; ; return&lt;br /&gt;
           end&lt;br /&gt;
           kept = field(this,am,rest,numb)&lt;br /&gt;
           numb = dcount(kept,am)&lt;br /&gt;
           dawn = rest&lt;br /&gt;
           dusk = rest+numb-1&lt;br /&gt;
           gosub delete.lines&lt;br /&gt;
           if numb then crt numb:&#039; lines moved to KEPT buffer starting at line &#039;:rest&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
d:   begin case&lt;br /&gt;
        case comd eq &#039;D&#039;                 ; * display current line&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;DE&#039;                ; * delete lines&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           chng = 0 ; save = here ; savl = last&lt;br /&gt;
           if rest ne &#039;&#039; then&lt;br /&gt;
              patt = rest&lt;br /&gt;
              cto = &#039;&#039;&lt;br /&gt;
              cfrom = &#039;DE&#039;&lt;br /&gt;
              gosub cm.del.entry&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           gosub delete.lines&lt;br /&gt;
           here = dawn&lt;br /&gt;
           if here gt last then&lt;br /&gt;
              here = last&lt;br /&gt;
              crt &#039;Bottom. Line &#039;:here:&#039; was above the last delete.&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              crt &#039;At line &#039;:here:&#039;. Deleted &#039;:chng:&#039; lines.&#039;&lt;br /&gt;
              gosub display.line&lt;br /&gt;
           end&lt;br /&gt;
$ifdef qm&lt;br /&gt;
        case comd eq &#039;DISPLAY&#039;     ; * insert display line for programmer&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              crt &#039;You have not said what to put on DISPLAY line!&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           gosub savethat&lt;br /&gt;
           here += 1 ; last += 1 ; lnum += 1&lt;br /&gt;
           if dlim ne &#039;&amp;quot;&#039; and dlim ne &#039;\&#039; then dlim = &amp;quot;&#039;&amp;quot;&lt;br /&gt;
           line = &#039;DISPLAY &#039;:dlim:rest:&#039; = &#039;:dlim:&#039;:&#039;:rest&lt;br /&gt;
           gosub insert.line&lt;br /&gt;
           gosub reset.record&lt;br /&gt;
           gosub display.line&lt;br /&gt;
$endif&lt;br /&gt;
        case comd eq &#039;DROP&#039;              ; * remove the block&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if not(beg) and not(fin) then&lt;br /&gt;
              crt &#039;Command requests a block operation, but no block is defined.&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           if beg le 1 then&lt;br /&gt;
              temp = 0&lt;br /&gt;
           end else&lt;br /&gt;
              temp = index(this,am,beg-1)&lt;br /&gt;
              if not(temp) then&lt;br /&gt;
                 crt &#039;Error - Block start line not defined&#039; ; *Cannot find beginning of block&lt;br /&gt;
                 gosub bad.comd ; return&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           if fin eq last then&lt;br /&gt;
              temp -= 1&lt;br /&gt;
              temp&amp;lt;2&amp;gt; = len(this)&lt;br /&gt;
           end else&lt;br /&gt;
              temp&amp;lt;2&amp;gt; = index(this,am,fin)&lt;br /&gt;
           end&lt;br /&gt;
           if not(temp&amp;lt;2&amp;gt;) then&lt;br /&gt;
              crt &#039;Error - Block end line not defined&#039; ; *Cannot find end of block&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           numb = fin - beg + 1&lt;br /&gt;
           if blockflag then&lt;br /&gt;
              if beg eq fin&lt;br /&gt;
                 then stub = &#039;Delete line &#039;: beg:&#039; &#039;&lt;br /&gt;
                 else stub = &#039;Delete block from line &#039;: beg:&#039; to line &#039;: fin:&#039;? &#039;&lt;br /&gt;
              gosub get.answ&lt;br /&gt;
              if answ ne yes[1,1] then&lt;br /&gt;
                 crt &#039;Block command cancelled.&#039;&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           dawn = beg; dusk = fin&lt;br /&gt;
           gosub delete.lines&lt;br /&gt;
           crt &#039;Dropped (deleted) &#039;:numb:&#039; lines.&#039;&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;DTX&#039;               ; * decimal to hex&lt;br /&gt;
           if not(rest matches &#039;1N0N&#039;) then&lt;br /&gt;
              crt &#039;Numeric value required&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           if len(rest) gt 9 then&lt;br /&gt;
              crt &#039;Must be less than one billion (1,000,000,000)&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
$ifdef universe&lt;br /&gt;
           crt dtx(rest)&lt;br /&gt;
$else&lt;br /&gt;
           crt oconv(rest,&#039;MX&#039;)&lt;br /&gt;
$endif&lt;br /&gt;
        case comd eq &#039;DUP&#039;               ; * duplicate previous line&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if here lt 1 then&lt;br /&gt;
              crt &#039;No current line&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           if numb eq &#039;&#039; and rest matches &#039;1N0N&#039; then numb = rest&lt;br /&gt;
           if numb lt 1 then numb = 1&lt;br /&gt;
           gosub savethat&lt;br /&gt;
           gosub get.line&lt;br /&gt;
           for xx = 1 to numb&lt;br /&gt;
              gosub insert.line&lt;br /&gt;
              last += 1&lt;br /&gt;
           next xx&lt;br /&gt;
           gosub reset.record&lt;br /&gt;
           crt &#039;Inserted &#039;:numb:&#039; copies of line &#039;:here:&#039; after line &#039;:here:&#039;. Still at &#039;:here:&#039;.&#039;&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
e:   begin case&lt;br /&gt;
        case comd eq &#039;EC&#039;        ; * edit called program (in this file)&lt;br /&gt;
           if here lt 1 then here = 1&lt;br /&gt;
           gosub get.line&lt;br /&gt;
           line = trim(line)&lt;br /&gt;
           temp = upcase(line)&lt;br /&gt;
           good = index(temp,&#039;CALL &#039;,1)&lt;br /&gt;
           if good then line = trim(line[good+5,huge])&lt;br /&gt;
           line = trim(field(line,&#039;(&#039;,1))&lt;br /&gt;
           if index(line,&#039; &#039;,1) then good = false&lt;br /&gt;
           if line[1,1] eq &#039;@&#039; then&lt;br /&gt;
              crt &#039;Leading &amp;quot;@&amp;quot; is logical pointer&#039;&lt;br /&gt;
              good = false&lt;br /&gt;
           end&lt;br /&gt;
           if not(good) then&lt;br /&gt;
              crt &#039;The EC command requires lines in format &amp;quot;CALL ID&amp;quot; or &amp;quot;CALL ID(...&amp;quot;&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
&lt;br /&gt;
*           readv temp from file, line, 1 else&lt;br /&gt;
*              crt &#039;&amp;quot;&#039;:line:&#039;&amp;quot; is not in this file&#039;&lt;br /&gt;
*              gosub bad.comd ; return&lt;br /&gt;
*           end&lt;br /&gt;
*           execute verb:&#039; &#039;:fnam:&#039; &#039;:line&lt;br /&gt;
&lt;br /&gt;
           readv temp from file, line, 1 then&lt;br /&gt;
              execute verb:&#039; &#039;:fnam:&#039; &#039;:line:options&lt;br /&gt;
           end else&lt;br /&gt;
              test = false&lt;br /&gt;
              readv vlin from voc, line, 2 then&lt;br /&gt;
                 vcnt = dcount(vlin,&#039;/&#039;)&lt;br /&gt;
                 vlin = field(vlin,&#039;/&#039;,vcnt-1)&lt;br /&gt;
                 vlin = vlin[1,len(vlin)-2]&lt;br /&gt;
                 test = trans(vlin,line,-1,&#039;X&#039;)&lt;br /&gt;
              end&lt;br /&gt;
              if test then&lt;br /&gt;
                 execute verb:&#039; &#039;:vlin:&#039; &#039;:line:options&lt;br /&gt;
              end else&lt;br /&gt;
                 crt &#039;&amp;quot;&#039;:line:&#039;&amp;quot; is not in this file&#039;&lt;br /&gt;
                 gosub bad.comd ; return&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
***&lt;br /&gt;
           test = @(0,0)&lt;br /&gt;
           crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
        case comd = &#039;ECS&#039;        ; * edit command stack&lt;br /&gt;
           ttid = whom:&#039;_&#039;:levl:&#039;_commands&#039;&lt;br /&gt;
           temp = raise(stak)&lt;br /&gt;
           write temp on acom, ttid on error crt &#039;WRITE failure - file not updated&#039; ; return&lt;br /&gt;
           crt view:&#039;ing command stack&#039;&lt;br /&gt;
           execute verb:&#039; AE_COMS &#039;:ttid:options&lt;br /&gt;
           test = @(0,0)&lt;br /&gt;
           crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
           read temp from acom, ttid else temp = &#039;&#039;&lt;br /&gt;
           temp = field(temp,am,1,staknumb-1)&lt;br /&gt;
           stak = lower(temp)&lt;br /&gt;
           delete acom, ttid&lt;br /&gt;
        case comd eq &#039;EDITPAGE&#039;&lt;br /&gt;
           editpage = not(editpage)&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
           if editpage then&lt;br /&gt;
              begn = @(0) ; goup = @(-10)&lt;br /&gt;
              prmt = &#039;*&#039;:str(&#039;-&#039;,llen-1)&lt;br /&gt;
           end else&lt;br /&gt;
              begn = char(13) ; goup = &#039;&#039;&lt;br /&gt;
              prmt = str(&#039;-&#039;,llen)&lt;br /&gt;
           end&lt;br /&gt;
           crt &#039;editpage = &#039;:editpage&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
        case comd eq &#039;EF&#039;        ; * edit fields&lt;br /&gt;
           numb = numb + 0&lt;br /&gt;
           if numb lt 0 or numb gt 255 then&lt;br /&gt;
              crt numb:&#039; is outside range 0-255&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           vmrk = char(numb)&lt;br /&gt;
           vals = &#039;char&#039;:numb&lt;br /&gt;
           gosub edit.fields&lt;br /&gt;
           vmrk = char(numb); gosub reset.fields&lt;br /&gt;
        case comd eq &#039;EI&#039;        ; * edit included code&lt;br /&gt;
           if here lt 1 then here = 1&lt;br /&gt;
           gosub get.line&lt;br /&gt;
           line = field(line,&#039;;&#039;,1)&lt;br /&gt;
           line = trim(line)&lt;br /&gt;
           good = true&lt;br /&gt;
           temp = field(line,&#039; &#039;,1)&lt;br /&gt;
           temp = upcase(temp)&lt;br /&gt;
           if temp ne &#039;INCLUDE&#039; and temp ne &#039;$INCLUDE&#039; then good = false&lt;br /&gt;
           line = trim(line[len(temp)+1,len(line)])&lt;br /&gt;
           begin case&lt;br /&gt;
              case dcount(line,&#039; &#039;) gt 3 ; good = false&lt;br /&gt;
              case dcount(line,&#039; &#039;) eq 3&lt;br /&gt;
                 if field(line,&#039; &#039;,1) ne &#039;DICT&#039; then good = false&lt;br /&gt;
              case dcount(line,&#039; &#039;) eq 1&lt;br /&gt;
                 readv test from file, line, 1 then&lt;br /&gt;
                    line = fnam:&#039; &#039;:line&lt;br /&gt;
                 end else&lt;br /&gt;
                    test = trans(&#039;SYSCOM&#039;,line,1,&#039;X&#039;)&lt;br /&gt;
                    if test ne &#039;&#039;&lt;br /&gt;
                       then line = &#039;SYSCOM &#039;:line&lt;br /&gt;
                       else line = fnam:&#039; &#039;:line&lt;br /&gt;
                 end&lt;br /&gt;
           end case&lt;br /&gt;
           if not(good) then&lt;br /&gt;
              crt &#039;The EI command requires lines in format &amp;quot;$IN... {DICT} {FN} ID&amp;quot;&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           execute verb:&#039; &#039;:line:options&lt;br /&gt;
           test = @(0,0)&lt;br /&gt;
           crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
        case comd eq &#039;EIT&#039;       ; * edit i-types (@)&lt;br /&gt;
           if dprt and here eq 2 and upcase(this[1,1]) else&lt;br /&gt;
              crt &#039;EIT is only for line 2 of a dictionary I-type&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           gosub get.line ; temp = line&lt;br /&gt;
           gosub split.itype&lt;br /&gt;
           ttid = whom:&#039;_&#039;:levl:&#039;_IType.in.line#&#039;:here&lt;br /&gt;
           write bite on acom, ttid on error gosub writerr ; return&lt;br /&gt;
           crt view:&#039;ing IType as fields...&#039;:&lt;br /&gt;
           execute verb:&#039; AE_COMS &#039;:ttid:options&lt;br /&gt;
           test = @(0,0)&lt;br /&gt;
           crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
           read line from acom, ttid else line = &#039;&#039;&lt;br /&gt;
           delete acom, ttid&lt;br /&gt;
           vmrk = &#039;;&#039;; gosub reset.fields&lt;br /&gt;
*       case comd eq &#039;EM&#039;         ; * edit MESSAGES&lt;br /&gt;
*          if numb eq &#039;&#039; and rest matches &#039;1N0N&#039; then numb = rest&lt;br /&gt;
*         if numb then&lt;br /&gt;
*            execute verb:&#039; MESSAGES &#039;:numb:options&lt;br /&gt;
*          end else&lt;br /&gt;
*             if here lt 1 then here = 1&lt;br /&gt;
*             gosub get.line&lt;br /&gt;
*             line = trim(line)&lt;br /&gt;
*             temp = upcase(line)&lt;br /&gt;
*             good = index(temp,&#039;SYSMSG&#039;,1)&lt;br /&gt;
*             if good then line = trim(line[good+6,huge])&lt;br /&gt;
*             line = trim(field(line,&#039;(&#039;,2))&lt;br /&gt;
*             line = trim(field(field(line,&#039;)&#039;,1),&#039;,&#039;,1))&lt;br /&gt;
*             if not(line matches &#039;1N0N&#039;) then good = false&lt;br /&gt;
*             if not(good) then&lt;br /&gt;
*                crt &#039;The EM command requires lines in format &amp;quot;...sysmsg(1N0N...&amp;quot;&#039;&lt;br /&gt;
*                crt &#039;Or a command like EMnnnn (nnnn is a message number)&#039;&lt;br /&gt;
*                gosub bad.comd ; return&lt;br /&gt;
*             end&lt;br /&gt;
*             execute verb:&#039; MESSAGES &#039;:line:options&lt;br /&gt;
*          end&lt;br /&gt;
*          test = @(0,0)&lt;br /&gt;
*          crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
        case comd = &#039;EK&#039;         ; * edit kept buffer&lt;br /&gt;
           ttid = whom:&#039;_&#039;:levl:&#039;_keptbuffer&#039;&lt;br /&gt;
           write kept on acom, ttid on error crt &#039;WRITE failure - file not updated&#039; ; return&lt;br /&gt;
           crt view:&#039;ing kept buffer&#039;:&lt;br /&gt;
           execute verb:&#039; AE_COMS &#039;:ttid:options&lt;br /&gt;
           test = @(0,0)&lt;br /&gt;
           crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
           read kept from acom, ttid else kept = &#039;&#039;&lt;br /&gt;
           delete acom, ttid&lt;br /&gt;
        case comd = &#039;EPR&#039;        ; * edit prestores&lt;br /&gt;
           numb = numb + 0&lt;br /&gt;
           if numb lt 0 or numb gt presnumb then&lt;br /&gt;
              crt &#039;PRestore must be in range 1-&#039;:presnumb:&#039;.&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           ttid = whom:&#039;_&#039;:levl:&#039;_prestores&#039;&lt;br /&gt;
           temp = raise(pres)&lt;br /&gt;
           if numb then&lt;br /&gt;
              bite = raise(temp&amp;lt;numb&amp;gt;)&lt;br /&gt;
              write bite on acom, ttid on error crt &#039;WRITE failure - file not updated&#039; ; return&lt;br /&gt;
              crt view:&#039;ing prestore &#039;:view:&lt;br /&gt;
           end else&lt;br /&gt;
              write temp on acom, ttid on error crt &#039;WRITE failure - file not updated&#039; ; return&lt;br /&gt;
              crt view:&#039;ing prestores&#039;:&lt;br /&gt;
           end&lt;br /&gt;
           execute verb:&#039; AE_COMS &#039;:ttid:options&lt;br /&gt;
           test = @(0,0)&lt;br /&gt;
           crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
           if numb then&lt;br /&gt;
              read bite from acom, ttid else bite = &#039;&#039;&lt;br /&gt;
              temp&amp;lt;numb&amp;gt; = lower(bite)&lt;br /&gt;
           end else&lt;br /&gt;
              read temp from acom, ttid else temp = &#039;&#039;&lt;br /&gt;
           end&lt;br /&gt;
           pres = lower(temp)&lt;br /&gt;
           delete acom, ttid&lt;br /&gt;
        case comd = &#039;ESS&#039;        ; * edit search stack&lt;br /&gt;
           ttid = whom:&#039;_&#039;:levl:&#039;_searches&#039;&lt;br /&gt;
           temp = raise(look)&lt;br /&gt;
           write temp on acom, ttid on error crt &#039;WRITE failure - file not updated&#039; ; return&lt;br /&gt;
           crt view:&#039;ing search stack&#039;:&lt;br /&gt;
           execute verb:&#039; AE_COMS &#039;:ttid:options&lt;br /&gt;
           test = @(0,0)&lt;br /&gt;
           crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
           read temp from acom, ttid else look = &#039;&#039;&lt;br /&gt;
           look = lower(temp)&lt;br /&gt;
           delete acom, ttid&lt;br /&gt;
        case comd eq &#039;ESV&#039;       ; * edit subvalues&lt;br /&gt;
           vmrk = sm ; vals = &#039;subvalues&#039;&lt;br /&gt;
           gosub edit.fields&lt;br /&gt;
           vmrk = sm; gosub reset.fields&lt;br /&gt;
        case comd eq &#039;ET&#039;        ; * edit tabs&lt;br /&gt;
           ttid = whom:&#039;_&#039;:levl:&#039;_tabs&#039;&lt;br /&gt;
           xxno = dcount(krj&amp;lt;1&amp;gt;,@vm)&lt;br /&gt;
           temp = &#039;&#039;&lt;br /&gt;
           for xx = 1 to xxno&lt;br /&gt;
              temp&amp;lt;xx&amp;gt; = krj&amp;lt;2,xx&amp;gt;:&#039; &#039;:krj&amp;lt;1,xx&amp;gt;&lt;br /&gt;
           next xx&lt;br /&gt;
           write temp on acom, ttid on error crt &#039;WRITE failure - file not updated&#039; ; return&lt;br /&gt;
           crt view:&#039;ing line tabs&#039;:&lt;br /&gt;
           execute verb:&#039; AE_COMS &#039;:ttid:options&lt;br /&gt;
           test = @(0,0)&lt;br /&gt;
           crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
           read temp from acom, ttid else temp = &#039;&#039;&lt;br /&gt;
           xxno = dcount(temp,@am)&lt;br /&gt;
           krj = @am:@am:krj&amp;lt;3&amp;gt;&lt;br /&gt;
           yy = &#039;&#039;&lt;br /&gt;
           for xx = 1 to xxno&lt;br /&gt;
              bite = trim(temp&amp;lt;xx,1,1&amp;gt;)&lt;br /&gt;
              left = field(bite,&#039; &#039;,1)&lt;br /&gt;
              rest = field(bite,&#039; &#039;,2,99)&lt;br /&gt;
              if left matches &#039;1N0N&#039; then left += 0 else left = 0&lt;br /&gt;
              if left gt last then left = 0&lt;br /&gt;
              if left then&lt;br /&gt;
                 yy += 1&lt;br /&gt;
                 if rest eq &#039;&#039; then rest = &#039;T&#039;:left&lt;br /&gt;
                 krj&amp;lt;1,yy&amp;gt; = rest&lt;br /&gt;
                 krj&amp;lt;2,yy&amp;gt; = left&lt;br /&gt;
              end&lt;br /&gt;
           next xxno&lt;br /&gt;
           if krj&amp;lt;3&amp;gt; gt yy then krj&amp;lt;3&amp;gt; = yy&lt;br /&gt;
           if krj&amp;lt;1&amp;gt; ne &#039;&#039; and krj&amp;lt;3&amp;gt; lt 1 then krj&amp;lt;3&amp;gt; = 1&lt;br /&gt;
           delete acom, ttid&lt;br /&gt;
        case comd eq &#039;EV&#039;        ; * edit values&lt;br /&gt;
           vmrk = vm ; vals = &#039;values&#039;&lt;br /&gt;
           gosub edit.fields&lt;br /&gt;
           vmrk = vm; gosub reset.fields&lt;br /&gt;
        case comd eq &#039;EW&#039;        ; * edit words (as defined by wordmark)&lt;br /&gt;
           vmrk = wordmark ; vals = &#039;words&#039;&lt;br /&gt;
           gosub edit.fields&lt;br /&gt;
           vmrk = wordmark; gosub reset.fields&lt;br /&gt;
* Various forms for quitting&lt;br /&gt;
        case comd eq &#039;EX&#039; or comd = &#039;EXIT&#039; ; comd = &#039;Q&#039; ; redo = true&lt;br /&gt;
        case comd eq &#039;EXK&#039; or comd = &#039;EXITK&#039; ; comd = &#039;QK&#039; ; redo = true&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
f:   begin case&lt;br /&gt;
        case comd eq &#039;FD&#039;                ; * delete item&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if not(sec.delete.flg) then&lt;br /&gt;
              crt &#039;Delete disabled&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           gosub write.record&lt;br /&gt;
        case comd eq &#039;FILE&#039; ; comd = &#039;SV&#039; ; redo = true&lt;br /&gt;
        case comd[1,2] eq &#039;FI&#039;           ; * file item&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if not(sec.write.flg) then&lt;br /&gt;
              crt &#039;File disabled&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           temp = comd[3,len(comd)]&lt;br /&gt;
           convert &#039;BCRDL&#039; to &#039;&#039; in temp&lt;br /&gt;
           if temp eq &#039;&#039; then gosub write.record else gosub bad.command&lt;br /&gt;
        case comd eq &#039;FL&#039; or comd eq &#039;FLA&#039;  ; * find labels&lt;br /&gt;
           if not(caseflag) then rest = upcase(rest)&lt;br /&gt;
           if index(comd,&#039;A&#039;,1) then&lt;br /&gt;
              bump = -1&lt;br /&gt;
              dawn = here - 1&lt;br /&gt;
              if dawn lt 1 then return&lt;br /&gt;
              if numb then dusk = here - numb else dusk = 1&lt;br /&gt;
              if dusk lt 1 then dusk = 1&lt;br /&gt;
           end else&lt;br /&gt;
              bump = 1&lt;br /&gt;
              dawn = here + 1&lt;br /&gt;
              if dawn gt last then dawn = 1&lt;br /&gt;
              if numb then dusk = dawn + numb else dusk = last&lt;br /&gt;
              if dusk gt last then dusk = last&lt;br /&gt;
           end&lt;br /&gt;
           for here = dawn to dusk step bump&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              gosub find.label&lt;br /&gt;
              if not(caseflag) then temp = upcase(temp)&lt;br /&gt;
              if temp ne &#039;&#039; then&lt;br /&gt;
                 if rest eq &#039;&#039; or temp matches rest then&lt;br /&gt;
                    gosub display.line&lt;br /&gt;
                    if not(numb) then return&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
           next here&lt;br /&gt;
           crt&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;FM&#039; or comd eq &#039;FMA&#039;       ; * find match command&lt;br /&gt;
           gosub get.line&lt;br /&gt;
* Get rid of any label&lt;br /&gt;
           gosub find.label&lt;br /&gt;
           thisline = trimf(line)&lt;br /&gt;
           if temp ne &#039;&#039; then&lt;br /&gt;
               thisline = thisline[len(temp)+1,huge]&lt;br /&gt;
               if thisline[1,1] eq &#039;:&#039; then thisline = thisline[2,huge]&lt;br /&gt;
              thisline = trimf(thisline)&lt;br /&gt;
           end&lt;br /&gt;
* Get the first word on the line&lt;br /&gt;
           word = field(trim(upcase(thisline)),&#039; &#039;,1)&lt;br /&gt;
           begin case&lt;br /&gt;
              case rest ne &#039;&#039;&lt;br /&gt;
                 seek = upcase(rest)&lt;br /&gt;
              case word[1,1] eq &#039;*&#039; or word[1,1] eq &#039;!&#039;&lt;br /&gt;
                 seek = word[1,1]&lt;br /&gt;
              case 1&lt;br /&gt;
                 locate(word,fm.words;posn) then&lt;br /&gt;
                    if index(comd,&#039;A&#039; ,1) then&lt;br /&gt;
                       seek = fm.finda&amp;lt;posn&amp;gt;&lt;br /&gt;
                    end else&lt;br /&gt;
                       seek = fm.findf&amp;lt;posn&amp;gt;&lt;br /&gt;
                    end&lt;br /&gt;
                 end else&lt;br /&gt;
                    locate(word,endwords;posn) then&lt;br /&gt;
                       seek = &#039;END&#039;&lt;br /&gt;
                    end else&lt;br /&gt;
                       crt &#039;Starting word &amp;quot;&#039;:word:&#039;&amp;quot; unknown&#039;&lt;br /&gt;
                       gosub bad.comd ; return&lt;br /&gt;
                    end&lt;br /&gt;
                 end&lt;br /&gt;
           end case&lt;br /&gt;
           if seek eq &#039;&#039; then&lt;br /&gt;
              crt word:&#039; has no matching word for &#039;:comd&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           posn = index(upcase(line),word,1)&lt;br /&gt;
           xxno = dcount(seek,vm)&lt;br /&gt;
           for xx = 1 to xxno&lt;br /&gt;
              seek&amp;lt;1,xx&amp;gt; = space(posn-1):seek&amp;lt;1,xx&amp;gt;&lt;br /&gt;
           next xx&lt;br /&gt;
           if index(comd,&#039;A&#039;,1) then&lt;br /&gt;
              bump = -1&lt;br /&gt;
              dawn = here - 1&lt;br /&gt;
              if dawn lt 1 then return&lt;br /&gt;
              dusk = 1&lt;br /&gt;
           end else&lt;br /&gt;
              bump = 1&lt;br /&gt;
              dawn = here + 1&lt;br /&gt;
              if dawn gt last then return&lt;br /&gt;
              dusk = last&lt;br /&gt;
           end&lt;br /&gt;
           save = here&lt;br /&gt;
           for here = dawn to dusk step bump&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              line = upcase(line)&lt;br /&gt;
              if line[1,1] ne &#039;&#039; then&lt;br /&gt;
                 temp = field(line,&#039; &#039;,1)&lt;br /&gt;
                 if num(temp) or temp[len(temp),1] eq &#039;:&#039; then&lt;br /&gt;
                    temp = len(temp)&lt;br /&gt;
                    line = space(temp):line[temp+1,len(line)]&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
              for xx = 1 to xxno&lt;br /&gt;
                 slen = len(seek&amp;lt;1,xx&amp;gt;)&lt;br /&gt;
                 if line[1,slen] eq seek&amp;lt;1,xx&amp;gt; then&lt;br /&gt;
                    if trim(line[slen+1,1]) eq &#039;&#039; then&lt;br /&gt;
                       gosub display.line&lt;br /&gt;
                       return&lt;br /&gt;
                    end&lt;br /&gt;
                 end&lt;br /&gt;
              next xx&lt;br /&gt;
           next here&lt;br /&gt;
           here = save&lt;br /&gt;
           gosub get.line&lt;br /&gt;
        case comd eq &#039;FOLD&#039;              ; * fold the line&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           chng = 0 ; save = here ; savl = last&lt;br /&gt;
           if dlim ne &#039;&#039; then fold = &#039;&#039;&lt;br /&gt;
           if rest eq &#039;&#039; then rest = fold&lt;br /&gt;
           if rest eq &#039;&#039; then rest = span-llen-2&lt;br /&gt;
           if not(rest matches &#039;1N0N&#039;) then&lt;br /&gt;
              crt &#039;Non-numeric length - try HELP FOLD.&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           fold = rest&lt;br /&gt;
           gosub get.line&lt;br /&gt;
           crt &#039;FOLD line to length &#039;:fold&lt;br /&gt;
           bite = line&lt;br /&gt;
           gosub parse.bite&lt;br /&gt;
           gosub check.line&lt;br /&gt;
           if chng then gosub reset.record&lt;br /&gt;
        case comd eq &#039;FOR&#039; or comd eq &#039;FORMAT&#039;      ; * format this item&lt;br /&gt;
           rest = upcase(rest)&lt;br /&gt;
           temp = index(rest,&#039;-M&#039;,1)&lt;br /&gt;
           if temp then fr(1) = field(rest[temp+2,huge],&#039; &#039;,1) ; fr(2) = &#039;&#039;&lt;br /&gt;
           if not(fr(1) matches &#039;1N0N&#039;) then fr(1) = &#039;&#039;&lt;br /&gt;
           if fr(1) eq &#039;&#039; then&lt;br /&gt;
              temp = this&amp;lt;1&amp;gt;&lt;br /&gt;
              fr(1) = len(temp) - len(trimf(temp))&lt;br /&gt;
           end&lt;br /&gt;
           temp = index(rest,&#039;-I&#039;,1)&lt;br /&gt;
           if temp then fr(2) = field(rest[temp+2,huge],&#039; &#039;,1)&lt;br /&gt;
           if not(fr(2) matches &#039;1N0N&#039;) then fr(2) = &#039;&#039;&lt;br /&gt;
           if fr(2) eq &#039;&#039; then&lt;br /&gt;
              fr(2) = int((fr(1)+1)/2)&lt;br /&gt;
              if fr(2) lt 2 then fr(2) = 2&lt;br /&gt;
           end&lt;br /&gt;
           if index(rest,&#039;-A&#039;,1) then fr(9) = true else fr(9) = &#039;&#039;&lt;br /&gt;
           if index(rest,&#039;-N&#039;,1) then fr(10) = true else fr(10) = &#039;&#039;&lt;br /&gt;
           if index(rest,&#039;-C&#039;,1) then&lt;br /&gt;
              fr(1) = 0&lt;br /&gt;
              fr(2) = 1&lt;br /&gt;
              fr(9) = true&lt;br /&gt;
              fr(10) = true&lt;br /&gt;
           end&lt;br /&gt;
           if last lt 1 then return&lt;br /&gt;
           gosub savethat&lt;br /&gt;
           crt &#039;Margin=&#039;:fr(1):&#039;, Indentation=&#039;:fr(2)&lt;br /&gt;
           gosub indenter&lt;br /&gt;
           gosub set.record&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
g:   begin case&lt;br /&gt;
        case comd eq &#039;G&#039;                 ; * Go to line&lt;br /&gt;
           if numb eq &#039;&#039; then&lt;br /&gt;
              if dlim eq &#039;&amp;lt;&#039; and beg ne &#039;&#039; then here = beg&lt;br /&gt;
              if dlim eq &#039;&amp;gt;&#039; and fin ne &#039;&#039; then here = fin&lt;br /&gt;
           end else here = numb&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
h:   begin case&lt;br /&gt;
        case comd eq &#039;H&#039; or comd eq &#039;HELP&#039;&lt;br /&gt;
           gosub show.help&lt;br /&gt;
        case comd eq &#039;HEX&#039;            ; * show this line in hexadecimal&lt;br /&gt;
           if not(here) then return&lt;br /&gt;
           gosub get.line&lt;br /&gt;
           temp = &#039;&#039;&lt;br /&gt;
           xxno = len(line)&lt;br /&gt;
           for xx = 1 to xxno&lt;br /&gt;
              bit = line[xx,1]&lt;br /&gt;
$ifdef universe&lt;br /&gt;
              bit = dtx(seq(bit))&lt;br /&gt;
$else&lt;br /&gt;
              bit = oconv(seq(bit),&#039;MX&#039;)&lt;br /&gt;
$endif&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
              bit = fmt(bit,&#039;2/0R&#039;)&lt;br /&gt;
$else&lt;br /&gt;
              bit = fmt(bit,&#039;R%2&#039;)&lt;br /&gt;
$endif&lt;br /&gt;
              temp&amp;lt;1&amp;gt; = temp&amp;lt;1&amp;gt;:bit[1,1]&lt;br /&gt;
              temp&amp;lt;2&amp;gt; = temp&amp;lt;2&amp;gt;:bit[2,1]&lt;br /&gt;
           next xx&lt;br /&gt;
           if lfmt then crt fmt(here,lfmt):&#039;: &#039;:&lt;br /&gt;
           crt temp&amp;lt;1&amp;gt;&lt;br /&gt;
           if lfmt then crt space(llen+2):&lt;br /&gt;
           crt temp&amp;lt;2&amp;gt;&lt;br /&gt;
           temp = &#039;&#039;&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
i:   begin case&lt;br /&gt;
        case comd eq &#039;I&#039;                 ; * insert lines&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           chng = 0 ; save = here ; savl = last&lt;br /&gt;
           if rest ne &#039;&#039; then&lt;br /&gt;
              if numb lt 1 then numb = 1&lt;br /&gt;
              inum = numb&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              if not(chng) then gosub savethis&lt;br /&gt;
              if here gt 0 then&lt;br /&gt;
                 memr(cell)&amp;lt;lnum&amp;gt; := str(am:rest,inum)&lt;br /&gt;
              end else memr(1)&amp;lt;1&amp;gt; = str(rest:am,inum):memr(1)&amp;lt;1&amp;gt;&lt;br /&gt;
              if here le beg then beg += inum&lt;br /&gt;
              if here le fin then fin += inum&lt;br /&gt;
              yyno = dcount(krj&amp;lt;1&amp;gt;,vm)&lt;br /&gt;
              for yy = 1 to yyno&lt;br /&gt;
                 if krj&amp;lt;2,yy&amp;gt; gt here then krj&amp;lt;2,yy&amp;gt; += inum&lt;br /&gt;
              next yy&lt;br /&gt;
              here = here + inum&lt;br /&gt;
              gosub reset.record&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              gosub display.line&lt;br /&gt;
              crt &#039;At line &#039;:here:&#039;. &#039;:inum:&#039; lines inserted, bottom now at line &#039;:last:&#039;.&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              if nill ne &#039;&#039; then&lt;br /&gt;
                 crt &#039;Terminate input with &amp;quot;&#039;:nill:&#039;&amp;quot;&#039;&lt;br /&gt;
              end&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
!   if nick then gosub get.line&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
              loop&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
!   if nick&lt;br /&gt;
!      then pill = space(len(line)-len(trimf(line)))&lt;br /&gt;
!      else pill = &#039;&#039;&lt;br /&gt;
!   pick = pill&lt;br /&gt;
!   pill := nill&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
                 new1 = here + 1&lt;br /&gt;
                 stub = new1:&#039;=&#039;&lt;br /&gt;
                 if lfmt then stub = fmt(new1,lfmt):&#039;=&#039;&lt;br /&gt;
                 gosub get.rope; line = rope&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
              until line eq nill do&lt;br /&gt;
!              until line eq nill or line eq pill do&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
                 gosub parse.line&lt;br /&gt;
                 last += 1&lt;br /&gt;
                 here += 1&lt;br /&gt;
                 lnum += 1&lt;br /&gt;
                 if not(chng) then gosub savethis&lt;br /&gt;
                 chng += 1&lt;br /&gt;
                 gosub insert.line&lt;br /&gt;
                 temp = len(last)&lt;br /&gt;
                 if lfmt then&lt;br /&gt;
                    if temp gt 3 and temp ne llen then gosub get.lfmt&lt;br /&gt;
                 end&lt;br /&gt;
                 if line eq nill then&lt;br /&gt;
                    crt begn:&lt;br /&gt;
                    if lfmt then crt fmt(new1,lfmt):&#039;= &#039;:&lt;br /&gt;
                 end&lt;br /&gt;
                 crt&lt;br /&gt;
                 numb -= 1&lt;br /&gt;
                 if numb eq 0 then exit&lt;br /&gt;
              repeat&lt;br /&gt;
              crt begn:ceol:&lt;br /&gt;
           end&lt;br /&gt;
           if chng then gosub reset.record&lt;br /&gt;
        case comd eq &#039;IC&#039;                ; * iconv&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              crt &#039;No conversion given&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           ccom = &#039;*&#039;:rest ; gosub conv.command&lt;br /&gt;
        case comd eq &#039;IN&#039;                ; * insert from execute&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if trim(rest) eq &#039;&#039; then&lt;br /&gt;
              crt &#039;No external command given&#039;&lt;br /&gt;
              comi = &#039;&#039; ; return&lt;br /&gt;
           end&lt;br /&gt;
           execute rest capturing bite&lt;br /&gt;
           test = @(0,0)&lt;br /&gt;
           numb = dcount(bite,am)&lt;br /&gt;
           if numb then&lt;br /&gt;
              gosub savethat&lt;br /&gt;
              this = insert(this,here+1,0,0,bite)&lt;br /&gt;
              gosub set.record&lt;br /&gt;
              crt &#039;Inserted &#039;:numb:&#039; lines; still at line &#039;:here:&#039;.&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              crt &#039;Nothing done - no output from command.&#039;&lt;br /&gt;
              comi = &#039;&#039; ; return&lt;br /&gt;
           end&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
j:   begin case&lt;br /&gt;
        case comd eq &#039;J&#039;                 ; * join lines&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if dlim ne &#039;&#039; then&lt;br /&gt;
              line = rest ; gosub parse.line ; join = line&lt;br /&gt;
           end&lt;br /&gt;
           if here and here lt last then&lt;br /&gt;
              chng = 0 ; save = here ; savl = last&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              test = line&lt;br /&gt;
              here += 1&lt;br /&gt;
              gosub set.bounds&lt;br /&gt;
              for here = dawn to dusk&lt;br /&gt;
                 gosub get.line&lt;br /&gt;
                 test = test:join:line&lt;br /&gt;
              next here&lt;br /&gt;
              gosub delete.lines&lt;br /&gt;
              if chng eq 0 then return&lt;br /&gt;
              here = save&lt;br /&gt;
              oopl = here&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              memr(cell)&amp;lt;lnum&amp;gt; = test&lt;br /&gt;
              gosub reset.record&lt;br /&gt;
           end&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
k:   begin case&lt;br /&gt;
        case comd eq &#039;KEEP&#039; or comd eq &#039;KEEPA&#039;&lt;br /&gt;
           gosub get.load&lt;br /&gt;
           if temp eq &#039;&#039; then return&lt;br /&gt;
           if comd[len(comd),1] ne &#039;A&#039; then&lt;br /&gt;
              gosub get.lines&lt;br /&gt;
              if not(temp) then return&lt;br /&gt;
           end&lt;br /&gt;
           kept = temp&lt;br /&gt;
           temp = dcount(temp,am)&lt;br /&gt;
           crt &#039;At line &#039;:here:&#039;, &#039;:temp:&#039; lines loaded into kept buffer.&#039;&lt;br /&gt;
           temp = &#039;&#039;&lt;br /&gt;
        case comd eq &#039;KEPT&#039; or comd eq &#039;K&#039; ; * display kept&lt;br /&gt;
           xxno = dcount(kept,am)&lt;br /&gt;
           if xxno lt 1 then&lt;br /&gt;
              crt &#039;Nothing in KEPT buffer&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           bit = len(xxno)&lt;br /&gt;
           disp = &#039;***** Contents of KEPT buffer (&#039;:xxno:&#039; lines) *****&#039;&lt;br /&gt;
           stub = &#039;Press return to continue showing KEPT buffer, Q to quit&#039;&lt;br /&gt;
           for xx = 1 to xxno&lt;br /&gt;
              temp = oconv(kept&amp;lt;xx&amp;gt;,&#039;MCP&#039;)[1,wide-bit-1]&lt;br /&gt;
              disp&amp;lt;-1&amp;gt; = fmt(xx,&#039;R#&#039;:bit):&#039;:&#039;:temp&lt;br /&gt;
           next xx&lt;br /&gt;
           gosub show.disp&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
l:   begin case&lt;br /&gt;
        case index(&#039;\L\LN\LA\LNA\LAN\&#039;,&#039;\&#039;:comd:&#039;\&#039;,1)   ; * list or locate&lt;br /&gt;
           if upcase(comi) eq &#039;L&#039; then&lt;br /&gt;
              if look&amp;lt;1,1&amp;gt; eq &#039;&#039; then&lt;br /&gt;
                 crt &#039;No previous locate command to repeat.&#039;&lt;br /&gt;
                 comi = &#039;&#039;&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
              comi = look&amp;lt;1,1&amp;gt;&lt;br /&gt;
              gosub parse.command&lt;br /&gt;
              if comd eq &#039;&#039; then comd = &#039;L&#039; ; numb = huge&lt;br /&gt;
              redo = true&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           finder = &#039;&#039;&lt;br /&gt;
           seeker = dlim&lt;br /&gt;
           if seeker eq &#039;!&#039; or seeker eq &#039;&amp;amp;&#039; then&lt;br /&gt;
              finder = rest&lt;br /&gt;
              convert dlim to am in finder&lt;br /&gt;
              if finder&amp;lt;2&amp;gt; eq &#039;&#039; then finder = &#039;&#039; else rest = finder&amp;lt;1&amp;gt;&lt;br /&gt;
           end&lt;br /&gt;
           looper = dcount(finder,am)&lt;br /&gt;
           if rest ne &#039;&#039; then&lt;br /&gt;
              gosub parse.cols&lt;br /&gt;
              if not(good) then return&lt;br /&gt;
           end else&lt;br /&gt;
              if dlim ne &#039;&#039; then&lt;br /&gt;
                 crt &#039;The second field is empty.&#039;&lt;br /&gt;
                 gosub bad.comd ; return&lt;br /&gt;
              end&lt;br /&gt;
              cols = &#039;&#039;&lt;br /&gt;
           end&lt;br /&gt;
           if index(comd,&#039;A&#039;,1) then&lt;br /&gt;
              bump = -1&lt;br /&gt;
              dawn = here - 1&lt;br /&gt;
              if dawn lt 1 then dawn = 1&lt;br /&gt;
              if numb then dusk = here - numb + 1 else dusk = 1&lt;br /&gt;
              if dusk lt 1 then dusk = 1&lt;br /&gt;
           end else&lt;br /&gt;
              bump = 1&lt;br /&gt;
              dawn = here + 1&lt;br /&gt;
              if dawn gt last then dawn = 1&lt;br /&gt;
              if numb then dusk = dawn + numb - 1 else dusk = last&lt;br /&gt;
              if dusk gt last then dusk = last&lt;br /&gt;
           end&lt;br /&gt;
           if looper then rest = finder else looper = 1&lt;br /&gt;
           line = rest ; gosub parse.line ; rest = line&lt;br /&gt;
           lastfind = rest&amp;lt;1&amp;gt;&lt;br /&gt;
           if not(caseflag) then rest = upcase(rest)&lt;br /&gt;
           if spaceflag else convert &#039; &#039;:char(9) to &#039;&#039; in rest&lt;br /&gt;
           for here = dawn to dusk step bump&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              if cols then line = line[cols,colf]&lt;br /&gt;
              if caseflag then temp = line else temp = upcase(line)&lt;br /&gt;
              if spaceflag else convert &#039; &#039;:char(9) to &#039;&#039; in temp&lt;br /&gt;
              badder = false ; gooder = false&lt;br /&gt;
              for xx = 1 to looper&lt;br /&gt;
                 if index(temp,rest&amp;lt;xx&amp;gt;,1)&lt;br /&gt;
                    then gooder = true&lt;br /&gt;
                    else badder = true&lt;br /&gt;
              next xx&lt;br /&gt;
              if seeker eq &#039;&amp;amp;&#039; then gooder = not(badder)&lt;br /&gt;
              if gooder then&lt;br /&gt;
                 if not(index(comd,&#039;N&#039;,1)) then&lt;br /&gt;
                    gosub display.line&lt;br /&gt;
                    if not(numb) then exit&lt;br /&gt;
                 end&lt;br /&gt;
              end else&lt;br /&gt;
                 if index(comd,&#039;N&#039;,1) then&lt;br /&gt;
                    gosub display.line&lt;br /&gt;
                    if not(numb) then exit&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
           next here&lt;br /&gt;
           if numb then here = dusk&lt;br /&gt;
           crt &#039;Now at line &#039;:here:&lt;br /&gt;
           if here eq last then crt &#039; (bottom)&#039;:&lt;br /&gt;
           crt &#039;.&#039;&lt;br /&gt;
           if rest ne &#039;&#039; and comi ne &#039;&#039; and comi ne look&amp;lt;1,1&amp;gt; then&lt;br /&gt;
              look = insert(look,1,1,0,comi)&lt;br /&gt;
              look = field(look,vm,1,looknumb)&lt;br /&gt;
           end&lt;br /&gt;
        case comd eq &#039;LC&#039;                ; * lower case (make line in)&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then ccom = &#039;MCL&#039; else ccom = &#039;QMCL&#039;&lt;br /&gt;
           gosub conv.command&lt;br /&gt;
* Various forms for loading stuff&lt;br /&gt;
        case comd eq &#039;LD&#039; or comd eq &#039;LOAD&#039; or comd eq &#039;LDA&#039; or comd eq &#039;LOADA&#039;&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if not(sec.load.flg) then&lt;br /&gt;
              crt &#039;LOAD disabled&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           gosub get.load&lt;br /&gt;
           if temp eq &#039;&#039; then return&lt;br /&gt;
           if prepflag then&lt;br /&gt;
              sec.call2.type = 1&lt;br /&gt;
              sec.fn2 = ofpt&lt;br /&gt;
              sec.id2 = oipt&lt;br /&gt;
              sec.dict2.flg = (odpt = &#039;DICT&#039;)&lt;br /&gt;
              call @prepprog(mat security)&lt;br /&gt;
              if sec.stop.flg then stop&lt;br /&gt;
              if not(sec.ok2.flg) then&lt;br /&gt;
                 gosub bad.comd ; return&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           if comd[len(comd),1] ne &#039;A&#039; then&lt;br /&gt;
              gosub get.lines&lt;br /&gt;
              if not(temp) then return&lt;br /&gt;
           end&lt;br /&gt;
           gosub savethat&lt;br /&gt;
           this = insert(this,here+1,0,0,temp)&lt;br /&gt;
           temp = dcount(temp,am)&lt;br /&gt;
           here = here + temp&lt;br /&gt;
           crt &#039;At line &#039;:here:&#039;, &#039;:temp:&#039; lines loaded.&#039;&lt;br /&gt;
           temp = &#039;&#039;&lt;br /&gt;
           gosub set.record&lt;br /&gt;
        case comd eq &#039;LL&#039;                ; * long lines&lt;br /&gt;
           if not(rest matches &#039;1N0N&#039;) then&lt;br /&gt;
              rest = span-llen-2&lt;br /&gt;
              crt &#039;LL&#039;:numb:&#039;/&#039;:rest&lt;br /&gt;
           end&lt;br /&gt;
           dawn = here + 1&lt;br /&gt;
           if dawn gt last then dawn = 1&lt;br /&gt;
           if numb then dusk = here + numb else dusk = last&lt;br /&gt;
           if dusk gt last then dusk = last&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              temp = trim(line[rest,huge])&lt;br /&gt;
              if temp ne &#039;&#039; then&lt;br /&gt;
                 gosub display.line&lt;br /&gt;
                 if not(numb) then return&lt;br /&gt;
              end&lt;br /&gt;
           next here&lt;br /&gt;
           crt&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
m:   begin case&lt;br /&gt;
        case comd eq &#039;M&#039;         ; * pattern matching&lt;br /&gt;
           rest = field(rest,dlim,1)&lt;br /&gt;
           if rest eq &#039;&#039; and mmat ne &#039;&#039; then&lt;br /&gt;
              dlim = mmat&amp;lt;1,1&amp;gt;&lt;br /&gt;
              rest = mmat&amp;lt;1,2&amp;gt;&lt;br /&gt;
           end&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              crt &#039;No pattern given to match&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           gosub changematch.command&lt;br /&gt;
        case comd eq &#039;MACRO&#039;&lt;br /&gt;
           if macn then&lt;br /&gt;
              temp = dcount(macc&amp;lt;1,1&amp;gt;,sm)&lt;br /&gt;
              macc = delete(macc,1,1,temp)&lt;br /&gt;
              macc = delete(macc,1,1,temp)&lt;br /&gt;
              if macc ne &#039;&#039; then&lt;br /&gt;
                 pres&amp;lt;1,macn&amp;gt; = macc&amp;lt;1,1&amp;gt;&lt;br /&gt;
                 crt &#039;Macro saved to PRestore &#039;:macn&lt;br /&gt;
              end else&lt;br /&gt;
                 crt &#039;Macro empty - not saved&#039;&lt;br /&gt;
              end&lt;br /&gt;
              macc = &#039;&#039;&lt;br /&gt;
              macn = 0&lt;br /&gt;
           end else&lt;br /&gt;
              if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
              if numb gt presnumb or numb lt 1 then&lt;br /&gt;
                 crt &#039;PRestore must be in range 1-&#039;:presnumb:&#039;.&#039;&lt;br /&gt;
                 comi = &#039;&#039;&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
              crt &#039;Macro being recorded for PRestore &#039;:numb&lt;br /&gt;
              macn = numb&lt;br /&gt;
           end&lt;br /&gt;
        case comd eq &#039;MERGE&#039; or comd eq &#039;ME&#039;      ; * merge stuff&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; and numb eq &#039;&#039; then&lt;br /&gt;
              if not(beg) and not(fin) then&lt;br /&gt;
                 crt &#039;Command requests a block operation, but no block is defined.&#039;&lt;br /&gt;
                 gosub bad.comd&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
              numb = fin - beg + 1&lt;br /&gt;
              if blockflag then&lt;br /&gt;
                 if beg eq fin&lt;br /&gt;
                    then stub = &#039;Copy line &#039;:beg:&#039; to under line &#039;:here:&#039;? &#039;&lt;br /&gt;
                    else stub = &#039;Copy lines &#039;:beg:&#039;-&#039;:fin:&#039; to under line &#039;:here:&#039;? &#039;&lt;br /&gt;
                 gosub get.answ&lt;br /&gt;
                 if answ ne yes[1,1] then&lt;br /&gt;
                    crt &#039;Block command cancelled.&#039;&lt;br /&gt;
                    return&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
              dlim = &#039; &#039;&lt;br /&gt;
              rest = beg:&#039; &#039;:fin&lt;br /&gt;
              numb = &#039;&#039;&lt;br /&gt;
           end&lt;br /&gt;
           rest = trim(rest)&lt;br /&gt;
           if numb eq &#039;&#039; then gosub parse.atts&lt;br /&gt;
           if numb ne &#039;&#039; and rest eq &#039;&#039; then rest = here&lt;br /&gt;
           if not(rest matches &#039;1N0N&#039;) or numb eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Format of MErge command is: &amp;quot;MEn/s&amp;quot;; eg: &amp;quot;ME10/15&amp;quot; or &amp;quot;ME/s/f&amp;quot;; eg: &amp;quot;ME/15/24&amp;quot;&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
*           if numb gt last then&lt;br /&gt;
*              crt &#039;Nothing done - record does not have that many lines.&#039;&lt;br /&gt;
*              comi = &#039;&#039; ; return&lt;br /&gt;
*           end&lt;br /&gt;
           bite = field(this,am,rest,numb)&lt;br /&gt;
           if numb ne 1 or bite ne &#039;&#039; then numb = dcount(bite,am)&lt;br /&gt;
           if numb then&lt;br /&gt;
              gosub savethat&lt;br /&gt;
              this = insert(this,here+1,0,0,bite)&lt;br /&gt;
              gosub set.record&lt;br /&gt;
              if beg gt here then beg = beg + numb&lt;br /&gt;
              if fin gt here then fin = fin + numb&lt;br /&gt;
              xxno = dcount(krj&amp;lt;1&amp;gt;,vm)&lt;br /&gt;
              for xx = 1 to xxno&lt;br /&gt;
                 if krj&amp;lt;2,xx&amp;gt; gt here then krj&amp;lt;2,xx&amp;gt; += numb&lt;br /&gt;
              next xx&lt;br /&gt;
              crt &#039;Merged &#039;:numb:&#039; lines starting at line &#039;:rest:&#039;; still at line &#039;:here:&#039;.&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              crt &#039;Nothing done - this line is within the range.&#039;&lt;br /&gt;
              comi = &#039;&#039; ; return&lt;br /&gt;
           end&lt;br /&gt;
        case comd eq &#039;MOVE&#039; or comd eq &#039;MV&#039;       ; * move stuff&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              if not(beg) and not(fin) then&lt;br /&gt;
                 crt &#039;Command requests a block operation, but no block is defined.&#039;&lt;br /&gt;
                 gosub bad.comd&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
              if here le fin and here ge beg then&lt;br /&gt;
                 crt &#039;A block may not be moved into itself. MERGE will work.&#039;&lt;br /&gt;
                 comi = &#039;&#039;&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
              numb = fin - beg + 1&lt;br /&gt;
              if blockflag then&lt;br /&gt;
                 if beg eq fin then&lt;br /&gt;
                    stub = &#039;Move line &#039;:beg:&#039; to after line &#039;:here:&#039; OK? &#039;:ny&lt;br /&gt;
                 end else&lt;br /&gt;
                    stub = &#039;Move lines &#039;:beg:&#039;-&#039;:fin:&#039; to after line &#039;:here:&#039; OK? &#039;:ny&lt;br /&gt;
                 end&lt;br /&gt;
                 gosub get.answ&lt;br /&gt;
                 if answ ne yes[1,1] then&lt;br /&gt;
                    crt &#039;Block command cancelled.&#039;&lt;br /&gt;
                    return&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
              dlim = &#039; &#039;&lt;br /&gt;
              rest = beg:&#039; &#039;:fin&lt;br /&gt;
              numb = &#039;&#039;&lt;br /&gt;
           end&lt;br /&gt;
           rest = trim(rest)&lt;br /&gt;
           if numb eq &#039;&#039; then gosub parse.atts&lt;br /&gt;
           if not(rest matches &#039;1N0N&#039;) or numb eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Format of MoVe command is: &amp;quot;MVn/s&amp;quot;; eg: &amp;quot;MV10/15&amp;quot; or &amp;quot;MV/s/f&amp;quot;; eg: &amp;quot;MV/15/24&amp;quot;&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           dusk = rest + numb - 1&lt;br /&gt;
           if dusk gt last then dusk = last&lt;br /&gt;
           if here ge rest and here le dusk then&lt;br /&gt;
              crt &#039;Nothing done - this line is within the range.&#039;&lt;br /&gt;
              comi = &#039;&#039; ; return&lt;br /&gt;
           end&lt;br /&gt;
           bite = field(this,am,rest,numb)&lt;br /&gt;
           numb = dcount(bite,am)&lt;br /&gt;
           if numb then&lt;br /&gt;
              gosub savethat&lt;br /&gt;
              if here gt dusk then&lt;br /&gt;
                 this = insert(this,here+1,0,0,bite)&lt;br /&gt;
                 if rest gt 1&lt;br /&gt;
                    then this = this[1,col1()-1]:this[col2(),len(this)]&lt;br /&gt;
                    else this = this[col2()+1,len(this)]&lt;br /&gt;
              end else&lt;br /&gt;
                 this = this[1,col1()-1]:this[col2(),len(this)]&lt;br /&gt;
                 this = insert(this,here+1,0,0,bite)&lt;br /&gt;
              end&lt;br /&gt;
              gosub set.record&lt;br /&gt;
              if here gt dusk then&lt;br /&gt;
                 here = here - numb&lt;br /&gt;
                 crt &#039;Moved &#039;:numb:&#039; lines starting at line &#039;:rest:&#039;; now at line &#039;:here:&#039;.&#039;&lt;br /&gt;
              end else&lt;br /&gt;
                 crt &#039;Moved &#039;:numb:&#039; lines starting at line &#039;:rest:&#039;; still at line &#039;:here:&#039;.&#039;&lt;br /&gt;
              end&lt;br /&gt;
!##############&lt;br /&gt;
              posn = beg; gosub recalc.posn; beg = posn&lt;br /&gt;
              posn = fin; gosub recalc.posn; fin = posn&lt;br /&gt;
              xxno = dcount(krj&amp;lt;1&amp;gt;,vm)&lt;br /&gt;
              for xx = 1 to xxno&lt;br /&gt;
                 posn = krj&amp;lt;2,xx&amp;gt;; gosub recalc.posn; krj&amp;lt;2,xx&amp;gt; = posn&lt;br /&gt;
              next xx&lt;br /&gt;
           end else&lt;br /&gt;
              crt &#039;Nothing done - no lines selected.&#039;&lt;br /&gt;
              comi = &#039;&#039; ; return&lt;br /&gt;
           end&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
n:   begin case&lt;br /&gt;
        case comd eq &#039;N&#039;                 ; * same as &amp;quot;+&amp;quot;&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           here = here + numb&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;NULL&#039;              ; * null line input definition&lt;br /&gt;
           dlim = trim(dlim):trim(rest)&lt;br /&gt;
           dlim = dlim[1,1]&lt;br /&gt;
           nill = dlim&lt;br /&gt;
           if nill eq &#039;&amp;quot;&#039; then&lt;br /&gt;
              bit = &amp;quot;&#039;&amp;quot;:nill:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
           end else bit = &#039;&amp;quot;&#039;:nill:&#039;&amp;quot;&#039;&lt;br /&gt;
           crt &#039;NULL character to terminate INSERT is &#039;:bit:&#039;.&#039;&lt;br /&gt;
           comi = &#039;&#039;&lt;br /&gt;
        case comd eq &#039;NUM&#039;               ; * toggle the line numbering&lt;br /&gt;
           if lfmt eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Line Numbering is ON&#039;&lt;br /&gt;
              gosub get.lfmt&lt;br /&gt;
           end else&lt;br /&gt;
              crt &#039;Line Numbering is OFF&#039;&lt;br /&gt;
              lfmt = &#039;&#039;&lt;br /&gt;
           end&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
o:   begin case&lt;br /&gt;
        case comd eq &#039;OC&#039;                ; * oconv&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              crt &#039;No conversion given&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           ccom = rest ; gosub conv.command&lt;br /&gt;
        case comd[1,2] eq &#039;OO&#039;           ; * undo last change&lt;br /&gt;
           if oopc ne &#039;&#039; then&lt;br /&gt;
              this = oops&lt;br /&gt;
              here = oopl&lt;br /&gt;
              last = oopf&lt;br /&gt;
              beg = oopb&amp;lt;1&amp;gt;&lt;br /&gt;
              fin = oopb&amp;lt;2&amp;gt;&lt;br /&gt;
              krj = oopk&lt;br /&gt;
              gosub set.record&lt;br /&gt;
              crt &#039;&amp;quot;&#039;:oopc:&#039;&amp;quot; undone - now at line &#039;:here:&#039;.&#039;&lt;br /&gt;
              oops = &#039;&#039; ; oopc = &#039;&#039; ; oopl = &#039;&#039; ; oopf = &#039;&#039;&lt;br /&gt;
              oopb = &#039;&#039; ; oopk = &#039;&#039;&lt;br /&gt;
              gosub display.line&lt;br /&gt;
           end else&lt;br /&gt;
              crt &#039;last change already &amp;quot;undone&amp;quot; or nothing to undo&#039;&lt;br /&gt;
           end&lt;br /&gt;
           comi = &#039;&#039;&lt;br /&gt;
        case comd eq &#039;OUT&#039;&lt;br /&gt;
           gosub outline&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
p:   begin case&lt;br /&gt;
        case comd eq &#039;P&#039;                 ; * page on&lt;br /&gt;
           if numb else numb = plen&lt;br /&gt;
           if here ge last then here = 0&lt;br /&gt;
           here += 1&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub display.line&lt;br /&gt;
           next here&lt;br /&gt;
           here = dusk&lt;br /&gt;
        case comd eq &#039;PA&#039;                ; * print window up to here&lt;br /&gt;
           if numb else numb = pwin&lt;br /&gt;
           save = here&lt;br /&gt;
           here = here - numb&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub display.line&lt;br /&gt;
           next here&lt;br /&gt;
           here = save&lt;br /&gt;
           crt &#039;Still at line &#039;:here:&#039;.&#039;&lt;br /&gt;
        case comd = &#039;PASTE&#039; and rest eq &#039;&#039;  ; * paste from kept&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if kept eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Nothing in KEPT buffer&#039;&lt;br /&gt;
              comi = &#039;&#039; ; return&lt;br /&gt;
           end&lt;br /&gt;
           gosub savethat&lt;br /&gt;
           numb = dcount(kept,am)&lt;br /&gt;
           this = insert(this,here+1,0,0,kept)&lt;br /&gt;
           gosub set.record&lt;br /&gt;
           crt &#039;Pasted &#039;:numb:&#039; lines from KEPT buffer; still at line &#039;:here:&#039;.&#039;&lt;br /&gt;
           if beg gt here then beg += numb&lt;br /&gt;
           if fin gt here then fin += numb&lt;br /&gt;
           xxno = dcount(krj&amp;lt;1&amp;gt;,vm)&lt;br /&gt;
           for xx = 1 to xxno&lt;br /&gt;
              if krj&amp;lt;2,xx&amp;gt; gt here then krj&amp;lt;2,xx&amp;gt; += numb&lt;br /&gt;
           next xx&lt;br /&gt;
        case comd eq &#039;PASTE&#039;                          ; * save the kept buffer&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if kept eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Nothing in KEPT buffer&#039;&lt;br /&gt;
              comi = &#039;&#039; ; return&lt;br /&gt;
           end&lt;br /&gt;
           gosub save.stuff&lt;br /&gt;
        case comd eq &#039;PE&#039;                ; * page editor mode&lt;br /&gt;
           if not(editpage) then&lt;br /&gt;
              crt &#039;Page editing not possible at this terminal&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           that = this ; savl = here:am:last&lt;br /&gt;
           if this eq &#039;&#039; then this = am&lt;br /&gt;
           if here lt 1 then here = 1&lt;br /&gt;
           ptop = here&lt;br /&gt;
           mode = &#039;PAGE&#039;:am:&#039;View&#039;&lt;br /&gt;
           if sec.write.flg then mode&amp;lt;2&amp;gt; = &#039;Ins&#039;&lt;br /&gt;
           pchr = 1&lt;br /&gt;
           chng = &#039;&#039; ; show = &#039;&#039;&lt;br /&gt;
           gosub display.page&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
           gosub get.line&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
           temp = line&lt;br /&gt;
        case comd eq &#039;PL&#039;                ; * print window from here&lt;br /&gt;
           if numb else numb = pwin&lt;br /&gt;
           save = here&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub display.line&lt;br /&gt;
           next here&lt;br /&gt;
           here = save&lt;br /&gt;
           crt &#039;Still at line &#039;:here:&#039;.&#039;&lt;br /&gt;
        case comd eq &#039;PP&#039;                ; * print window bracketing here&lt;br /&gt;
           if numb else numb = pwin&lt;br /&gt;
           save = here&lt;br /&gt;
           here = here - int(numb/2)&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub display.line&lt;br /&gt;
           next here&lt;br /&gt;
           here = save&lt;br /&gt;
           crt &#039;Still at line &#039;:here:&#039;.&#039;&lt;br /&gt;
        case comd eq &#039;PR&#039;                ; * prestore processing&lt;br /&gt;
           if numb eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Defined prestores (&#039;:presnumb:&#039; Maximum)&#039;&lt;br /&gt;
              for xx = 1 to presnumb&lt;br /&gt;
                 temp = pres&amp;lt;1,xx&amp;gt;&lt;br /&gt;
                 convert sm to comdmark in temp&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
                 crt fmt(xx,&#039;2/0R&#039;):&#039; &#039;:temp&lt;br /&gt;
$else&lt;br /&gt;
                 crt fmt(xx,&#039;R%2&#039;):&#039; &#039;:temp&lt;br /&gt;
$endif&lt;br /&gt;
              next xx&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           if numb gt presnumb or numb lt 1 then&lt;br /&gt;
              crt &#039;PRestore must be in range 1-&#039;:presnumb:&#039;.&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           if dlim ne &#039;&#039; then&lt;br /&gt;
              if not(rest eq rest&amp;lt;1,1,1&amp;gt;) then&lt;br /&gt;
                 crt &#039;Invalid - delimiter in prestore&#039;&lt;br /&gt;
                 comi = &#039;&#039;&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
              pres&amp;lt;1,numb&amp;gt; = change(rest,dlim,sm)&lt;br /&gt;
           end else&lt;br /&gt;
              salt = pres&amp;lt;1,numb&amp;gt;&lt;br /&gt;
           end&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
q:   begin case&lt;br /&gt;
* Various forms for quitting&lt;br /&gt;
        case comd eq &#039;Q&#039; or comd = &#039;QK&#039; or comd = &#039;QUIT&#039; or comd = &#039;QUITK&#039;&lt;br /&gt;
           if not(viewflag) and (orig ne this) then&lt;br /&gt;
              stub = &#039;***** Record changed --- OK to Quit? (N/Y)&amp;gt;&#039;&lt;br /&gt;
              gosub get.answ&lt;br /&gt;
              if answ eq yes[1,1] then stopsign = true&lt;br /&gt;
           end else stopsign = true&lt;br /&gt;
           if stopsign then&lt;br /&gt;
              if orig eq &#039;&#039; then&lt;br /&gt;
                 crt &#039;Quit &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot; not created.&#039;&lt;br /&gt;
              end else crt &#039;Quit &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot; unchanged.&#039;&lt;br /&gt;
              if index(comd,&#039;K&#039;,1) then&lt;br /&gt;
                 killsign = true&lt;br /&gt;
                 if idcnt gt 1 then crt &#039;Select list cancelled.&#039;&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
r:   begin case&lt;br /&gt;
        case comd eq &#039;RA&#039;                ; * view or repeat change&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           gosub change.command&lt;br /&gt;
        case comd eq &#039;R&#039; and dlim ne &#039;&#039; and index(rest,dlim,1) ; * change&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           crt ; comd = &#039;C&#039;&lt;br /&gt;
           gosub change.command&lt;br /&gt;
        case comd eq &#039;R&#039;                 ; * replace lines&lt;br /&gt;
           if viewflag then crt ; gosub viewonly ; return&lt;br /&gt;
           if not(last) then&lt;br /&gt;
              crt &#039;Empty record, use Insert (I) command.&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           if here lt 1 then here = 1 ; gosub display.line&lt;br /&gt;
           chng = 0 ; save = here ; savl = last&lt;br /&gt;
           if numb lt 1 then numb = 1&lt;br /&gt;
           if dlim ne &#039;&#039; and rest eq &#039;&#039; then rest = &#039; &#039;&lt;br /&gt;
           loop&lt;br /&gt;
              crt begn:&lt;br /&gt;
              if lfmt then crt fmt(here,lfmt):&#039;=&#039;:&lt;br /&gt;
              crt ceop:&lt;br /&gt;
              if rest eq &#039;&#039; then&lt;br /&gt;
                 stub = here:&#039;=&#039;&lt;br /&gt;
                 if lfmt then stub = fmt(here,lfmt):&#039;=&#039;&lt;br /&gt;
                 gosub get.rope; line = rope&lt;br /&gt;
              end else line = rest&lt;br /&gt;
              gosub parse.line&lt;br /&gt;
           until line eq &#039;&#039; do&lt;br /&gt;
              crt goup:begn:ceol:&lt;br /&gt;
              if lfmt then crt fmt(here,lfmt):&#039;: &#039;:&lt;br /&gt;
              crt line&lt;br /&gt;
              if line eq comdmark then&lt;br /&gt;
                 line = &#039;&#039;&lt;br /&gt;
                 crt begn:&lt;br /&gt;
                 if lfmt then crt fmt(here,lfmt):&#039;: &#039;:&lt;br /&gt;
              end&lt;br /&gt;
              if numb gt 1 then crt&lt;br /&gt;
              if line eq &#039; &#039; then line = &#039;&#039;&lt;br /&gt;
              if not(chng) then gosub savethis&lt;br /&gt;
              chng += 1&lt;br /&gt;
              memr(cell)&amp;lt;lnum&amp;gt; = line&lt;br /&gt;
              here += 1 ; numb -= 1&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              if numb eq 0 then exit&lt;br /&gt;
           repeat&lt;br /&gt;
           if here ne save then here -= 1&lt;br /&gt;
           if chng then gosub reset.record; gosub get.line&lt;br /&gt;
           crt begn:ceol:&lt;br /&gt;
        case comd eq &#039;RELEASE&#039;           ; * release the item lock&lt;br /&gt;
           release file,item&lt;br /&gt;
           lock = false&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
s:   begin case&lt;br /&gt;
        case comd eq &#039;S&#039;                 ; * search processing&lt;br /&gt;
           if numb eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Last &#039;:looknumb:&#039; searches (latest first)&#039;&lt;br /&gt;
              for xx = 1 to looknumb&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
                 crt fmt(xx,&#039;2/0R&#039;):&#039; &#039;:look&amp;lt;1,xx&amp;gt;&lt;br /&gt;
$else&lt;br /&gt;
                 crt fmt(xx,&#039;R%2&#039;):&#039; &#039;:look&amp;lt;1,xx&amp;gt;&lt;br /&gt;
$endif&lt;br /&gt;
              next xx&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           if numb gt looknumb or numb lt 1 then&lt;br /&gt;
              crt &#039;Search must be in range 1-&#039;:looknumb:&#039;.&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           comi = look&amp;lt;1,numb&amp;gt;&lt;br /&gt;
           if comi eq &#039;&#039; then&lt;br /&gt;
              crt &#039;There is no search number &#039;:numb:&#039;.&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           look = delete(look,1,numb,0)&lt;br /&gt;
           look = insert(look,1,1,0,comi)&lt;br /&gt;
           gosub parse.command&lt;br /&gt;
           if comd eq &#039;&#039; then comd = &#039;L&#039; ; numb = huge&lt;br /&gt;
           comi = &#039;&#039;&lt;br /&gt;
           redo = true&lt;br /&gt;
        case comd eq &#039;SAVE&#039; or comd eq &#039;SV&#039;         ; * save the item&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           comd = &#039;SV&#039;&lt;br /&gt;
           if rest eq &#039;&#039; then&lt;br /&gt;
              if not(sec.write.flg) then&lt;br /&gt;
                 crt &#039;File disabled&#039;&lt;br /&gt;
                 comi = &#039;&#039;&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
              gosub write.record&lt;br /&gt;
           end else gosub save.stuff&lt;br /&gt;
        case comd eq &#039;SEQ&#039;               ; * build a sequence&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if dlim eq &#039;&#039; then&lt;br /&gt;
              crt &#039;Too few fields in this command.&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           good = true&lt;br /&gt;
           cfrom = field(rest,dlim,1)&lt;br /&gt;
           cto = field(rest,dlim,2)&lt;br /&gt;
           if cto eq &#039;&#039; then cto = 1&lt;br /&gt;
           if not(num(cto)) then&lt;br /&gt;
              crt &#039;Base for sequence command must be a number.&#039;&lt;br /&gt;
              good = false&lt;br /&gt;
           end&lt;br /&gt;
           bit = field(rest,dlim,3)&lt;br /&gt;
           if bit eq &#039;&#039; then bit = 1&lt;br /&gt;
           if not(num(bit)) then&lt;br /&gt;
              crt &#039;Increment for sequence command must be a number.&#039;&lt;br /&gt;
              good = false&lt;br /&gt;
           end else&lt;br /&gt;
              if not(bit) then&lt;br /&gt;
                 crt &#039;Increment for sequence command must not be zero.&#039;&lt;br /&gt;
                 good = false&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           if not(good) then gosub bad.comd ; return&lt;br /&gt;
           rest = dlim:field(rest,dlim,4,2)&lt;br /&gt;
           if rest ne dlim then&lt;br /&gt;
              gosub parse.cols&lt;br /&gt;
              if not(good) then return&lt;br /&gt;
           end else cols = &#039;&#039;&lt;br /&gt;
           chng = 0 ; save = here ; savl = last&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub get.line ; temp = line&lt;br /&gt;
              if cols then&lt;br /&gt;
                 bite = index(line[cols,colf],cfrom,1)&lt;br /&gt;
                 if bite then bite = bite + cols - 1&lt;br /&gt;
              end else&lt;br /&gt;
                 bite = index(line,cfrom,1)&lt;br /&gt;
              end&lt;br /&gt;
              if bite then&lt;br /&gt;
                 temp = line[1,bite-1]:cto&lt;br /&gt;
                 temp = temp:line[bite+len(cfrom),len(line)]&lt;br /&gt;
              end&lt;br /&gt;
              if &#039;*&#039;:temp ne &#039;*&#039;:line then&lt;br /&gt;
                 cto = cto + bit&lt;br /&gt;
                 if not(chng) then gosub savethis&lt;br /&gt;
                 chng += 1&lt;br /&gt;
                 memr(cell)&amp;lt;lnum&amp;gt; = temp&lt;br /&gt;
                 gosub display.line&lt;br /&gt;
              end&lt;br /&gt;
           next here&lt;br /&gt;
           here = dusk&lt;br /&gt;
           if chng then gosub reset.record&lt;br /&gt;
        case comd eq &#039;SHOW&#039;              ; * show changes flag&lt;br /&gt;
           rest = upcase(rest)&lt;br /&gt;
           begin case&lt;br /&gt;
              case rest eq &#039;ON&#039; ; shew = true&lt;br /&gt;
              case rest eq &#039;OFF&#039; ; shew = false&lt;br /&gt;
              case 1 ; shew = not(shew)&lt;br /&gt;
           end case&lt;br /&gt;
           if shew&lt;br /&gt;
              then crt &#039;Show changes flag is ON&#039;&lt;br /&gt;
              else crt &#039;Show changes flag is OFF&#039;&lt;br /&gt;
        case comd eq &#039;SORT&#039; or comd eq &#039;SORTU&#039;    ; * sort the block&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           test = index(comd,&#039;U&#039;,1)&lt;br /&gt;
           if not(beg) and not(fin) then&lt;br /&gt;
              crt &#039;Command requests a block operation, but no block is defined.&#039;&lt;br /&gt;
              gosub bad.comd&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           if beg le 1 then&lt;br /&gt;
              temp = 0&lt;br /&gt;
           end else&lt;br /&gt;
              temp = index(this,am,beg-1)&lt;br /&gt;
              if not(temp) then&lt;br /&gt;
                 crt &#039;Cannot find beginning of block&#039;&lt;br /&gt;
                 gosub bad.comd ; return&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           rest = upcase(rest)&lt;br /&gt;
           if rest eq &#039;&#039; then rest = &#039;AL&#039;&lt;br /&gt;
           if not(index(&#039;*AR*AL*DR*DL*&#039;,&#039;*&#039;:rest:&#039;*&#039;,1)) then&lt;br /&gt;
              crt &#039;Invalid sort sequence - use &amp;quot;AL&amp;quot; &amp;quot;AR&amp;quot; &amp;quot;DL&amp;quot; or &amp;quot;DR&amp;quot;&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           temp&amp;lt;2&amp;gt; = index(this,am,fin)&lt;br /&gt;
           if fin eq last then temp&amp;lt;2&amp;gt; = len(this)+1&lt;br /&gt;
           if not(temp&amp;lt;2&amp;gt;) then&lt;br /&gt;
              crt &#039;Cannot find end of block&#039;&lt;br /&gt;
              gosub bad.comd ; return&lt;br /&gt;
           end&lt;br /&gt;
           if blockflag then&lt;br /&gt;
              stub = &#039;Sort block beginning at &#039;: beg:&#039; and ending at &#039;: fin:&#039;?&#039;&lt;br /&gt;
              gosub get.answ&lt;br /&gt;
              if answ ne yes[1,1] then&lt;br /&gt;
                 crt &#039;Block command cancelled.&#039;&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           gosub savethat&lt;br /&gt;
           bits = &#039;&#039;&lt;br /&gt;
           for here = beg to fin&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              locate(line,bits;posn;rest) then&lt;br /&gt;
                 if test then good = false else good = true&lt;br /&gt;
              end else good = true&lt;br /&gt;
              if good then bits = insert(bits,posn;line)&lt;br /&gt;
           next here&lt;br /&gt;
           here = oopl&lt;br /&gt;
           if fin ne last&lt;br /&gt;
              then this = this[1,temp&amp;lt;1&amp;gt;]:bits:am:this[temp&amp;lt;2&amp;gt;+1,len(this)]&lt;br /&gt;
              else this = this[1,temp&amp;lt;1&amp;gt;]:bits&lt;br /&gt;
           bits = &#039;&#039;&lt;br /&gt;
           gosub set.record&lt;br /&gt;
* If any tags are in the sorted block then clear the tags,&lt;br /&gt;
* as it really makes no sense to try and sort them.&lt;br /&gt;
           good = true&lt;br /&gt;
           xxno = dcount(krj&amp;lt;1&amp;gt;,vm)&lt;br /&gt;
           for xx = 1 to xxno&lt;br /&gt;
              posn = krj&amp;lt;2,xx&amp;gt;&lt;br /&gt;
              if posn ge beg and posn le fin then good = false&lt;br /&gt;
           next xx&lt;br /&gt;
           if not(good) then&lt;br /&gt;
              krj = &#039;&#039;&lt;br /&gt;
              crt &#039;Tags cleared&#039;&lt;br /&gt;
           end&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;SPACE&#039;               ; * change spacing flag for &#039;L&#039;&lt;br /&gt;
           rest = upcase(rest)&lt;br /&gt;
           begin case&lt;br /&gt;
              case rest eq &#039;ON&#039; ; spaceflag = true&lt;br /&gt;
              case rest eq &#039;OFF&#039; ; spaceflag = false&lt;br /&gt;
              case 1 ; spaceflag = not(spaceflag)&lt;br /&gt;
           end case&lt;br /&gt;
           if spaceflag then&lt;br /&gt;
              crt &#039;SPACE flag is ON&#039;&lt;br /&gt;
           end else crt &#039;SPACE flag is OFF&#039;&lt;br /&gt;
        case comd eq &#039;SPOOL&#039;             ; * print&lt;br /&gt;
           save = here&lt;br /&gt;
           if numb eq &#039;&#039; and rest matches &#039;1N0N&#039; then numb = rest&lt;br /&gt;
           if numb eq &#039;&#039; then here = 1 ; numb = last&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           head = &#039;Record - &#039;:item:&#039; File - &#039;:fnam:&#039; Account - &#039;:acct:&#039; &#039;&lt;br /&gt;
           head = head:timedate():&amp;quot;&#039;LL&#039;&amp;quot;&lt;br /&gt;
           temp = span&lt;br /&gt;
           printer on&lt;br /&gt;
           temp = temp - llen - 2&lt;br /&gt;
           heading head&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              convert badc to gudc in line&lt;br /&gt;
              print fmt(here,lfmt):&#039;: &#039;:line[1,temp]&lt;br /&gt;
              loop&lt;br /&gt;
                 line = line[temp+1,len(line)]&lt;br /&gt;
              until line eq &#039;&#039; do&lt;br /&gt;
                 print space(llen+2):line[1,temp]&lt;br /&gt;
              repeat&lt;br /&gt;
           next here&lt;br /&gt;
           printer close&lt;br /&gt;
           if dawn ne 1 or dusk ne last then&lt;br /&gt;
              crt &#039;Lines &#039;:dawn:&#039; to &#039;:dusk:&#039; of &#039;:&lt;br /&gt;
           end&lt;br /&gt;
           crt &#039;&amp;quot;&#039;:item:&#039;&amp;quot; spooled to the printer.&#039;&lt;br /&gt;
           here = save&lt;br /&gt;
        case comd eq &#039;SPOOLHELP&#039;         ; * print the help&lt;br /&gt;
           rest = am&lt;br /&gt;
           gosub show.help&lt;br /&gt;
        case comd eq &#039;STAMP&#039;             ; * stamp it&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           gosub savethat&lt;br /&gt;
           last += 1 ; here += 1 ; lnum += 1&lt;br /&gt;
           line = &#039;* Last updated by &#039;:name:&#039; in account &#039;:acct:&#039; at &#039;:timedate()&lt;br /&gt;
           gosub insert.line&lt;br /&gt;
           gosub reset.record&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
t:   begin case&lt;br /&gt;
        case comd eq &#039;T&#039;                 ; * top&lt;br /&gt;
           here = 0&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;TC&#039;                ; * text case (make line in)&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then ccom = &#039;MCT&#039; else ccom = &#039;QMCT&#039;&lt;br /&gt;
           gosub conv.command&lt;br /&gt;
* Various ways to TRIM the line&lt;br /&gt;
        case comd eq &#039;TRIM&#039; or comd = &#039;TRIMF&#039; or comd = &#039;TRIMB&#039;&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           chng = 0 ; save = here ; savl = last&lt;br /&gt;
           if rest and comd eq &#039;TRIM&#039; then&lt;br /&gt;
              seek = field(rest,dlim,1)&lt;br /&gt;
              if seek matches &#039;3n&#039; then seek = char(seek)&lt;br /&gt;
              mark = field(rest,dlim,2)&lt;br /&gt;
              mark = upcase(trim(mark))[1,1]&lt;br /&gt;
              if index(&#039;ABCDEFLRT&#039;,mark,1) else&lt;br /&gt;
                 crt &#039;Invalid TRIM argument - must be one of &amp;quot;ABCDEFLRT&amp;quot;&#039;&lt;br /&gt;
                 gosub bad.comd&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
           end else seek = &#039;&#039;&lt;br /&gt;
           show = shew ; dnum = 1&lt;br /&gt;
           if numb eq &#039;&#039; and rest matches &#039;1N0N&#039; then numb = rest&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              begin case&lt;br /&gt;
                 case comd eq &#039;TRIM&#039;&lt;br /&gt;
                    if seek eq &#039;&#039;&lt;br /&gt;
                       then temp = trim(line)&lt;br /&gt;
                       else temp = trim(line,seek,mark)&lt;br /&gt;
                 case comd eq &#039;TRIMF&#039; ; temp = trimf(line)&lt;br /&gt;
                 case comd eq &#039;TRIMB&#039; ; temp = trimb(line)&lt;br /&gt;
              end case&lt;br /&gt;
              gosub check.line&lt;br /&gt;
           next here&lt;br /&gt;
           here = dusk&lt;br /&gt;
           if chng then&lt;br /&gt;
              gosub reset.record&lt;br /&gt;
              crt chng:&#039; lines changed - now at &#039;:here&lt;br /&gt;
           end&lt;br /&gt;
        case comd eq &#039;TWIN&#039; or comd eq &#039;TRIPLE&#039; ; * sideways cloning of line&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if dlim ne &#039;&#039; then&lt;br /&gt;
              line = rest ; gosub parse.line ; join = line&lt;br /&gt;
           end&lt;br /&gt;
           if here and here le last else return&lt;br /&gt;
           chng = 0 ; save = here&lt;br /&gt;
           gosub set.bounds&lt;br /&gt;
           for here = dawn to dusk&lt;br /&gt;
              gosub get.line&lt;br /&gt;
              if comd eq &#039;TWIN&#039;&lt;br /&gt;
                 then test = line:join:line&lt;br /&gt;
                 else test = line:join:line:join:line&lt;br /&gt;
              if test ne line then&lt;br /&gt;
                 chng += 1&lt;br /&gt;
                 memr(cell)&amp;lt;lnum&amp;gt; = test&lt;br /&gt;
              end&lt;br /&gt;
           next here&lt;br /&gt;
           if chng eq 0 then return&lt;br /&gt;
           temp = &#039;Split &#039;:chng:&#039; lines&#039;&lt;br /&gt;
           if join ne &#039;&#039; then temp := &#039; and joined the parts with &amp;quot;&#039;:join:&#039;&amp;quot;&#039;&lt;br /&gt;
           crt temp&lt;br /&gt;
           here = save&lt;br /&gt;
           gosub savethat&lt;br /&gt;
           gosub reset.record&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
u:   begin case&lt;br /&gt;
        case comd eq &#039;U&#039;                 ; * same as &amp;quot;-&amp;quot;&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           here = here - numb&lt;br /&gt;
           if here lt 0 then here = 0&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;UC&#039;                ; * upper case (make line in)&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if rest eq &#039;&#039; then ccom = &#039;MCU&#039; else ccom = &#039;QMCU&#039;&lt;br /&gt;
           gosub conv.command&lt;br /&gt;
        case comd eq &#039;UNLOAD&#039; ; comd = &#039;SV&#039; ; redo = true&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
v:   begin case&lt;br /&gt;
        case comd eq &#039;V&#039;                 ; * version information&lt;br /&gt;
           crt (upcase(verb):&#039; = &#039;) &#039;R#20&#039;:help.def&lt;br /&gt;
$ifdef qm&lt;br /&gt;
           temp = trans(&#039;NEWVOC&#039;,&#039;$RELEASE&#039;,2,&#039;X&#039;)&lt;br /&gt;
           if temp eq &#039;&#039; then&lt;br /&gt;
              temp = trans(&#039;VOC&#039;,&#039;$RELEASE&#039;,2,&#039;X&#039;)&lt;br /&gt;
           end&lt;br /&gt;
           if temp eq &#039;&#039; then temp = &#039;?&#039;&lt;br /&gt;
           crt (&#039;QM = &#039;) &#039;R#20&#039;:temp&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
           crt (&#039;Licence = &#039;) &#039;R#20&#039;:system(31)&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
$endif&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
           crt &#039;    UniData version &#039;:oconv(&#039;version&#039;,&#039;TVOC;X;;1&#039;)&lt;br /&gt;
$endif&lt;br /&gt;
$ifdef universe&lt;br /&gt;
           temp =  oconv(&#039;RELLEVEL&#039;,&#039;TNEWACC;X;;2&#039;)&lt;br /&gt;
           if temp eq &#039;&#039; then&lt;br /&gt;
              temp = oconv(&#039;RELLEVEL&#039;,&#039;TVOC;X;;2&#039;)&lt;br /&gt;
           end&lt;br /&gt;
           if temp eq &#039;&#039; then temp = &#039;not known&#039;&lt;br /&gt;
           crt &#039;   UniVerse version &#039;:temp&lt;br /&gt;
        case comd eq &#039;VLIST&#039;&lt;br /&gt;
           execute comi capturing disp&lt;br /&gt;
           stub = &amp;quot;Press return to continue showing VLIST &#039;T&#039;op &#039;-&#039;back &#039;Q&#039;uit&amp;quot;&lt;br /&gt;
           gosub show.disp&lt;br /&gt;
$endif&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
w:   begin case&lt;br /&gt;
        case comd eq &#039;W&#039; or comd eq &#039;WHERE&#039;      ; * what we are editing&lt;br /&gt;
           crt&lt;br /&gt;
           if viewflag&lt;br /&gt;
              then crt &#039;Viewing &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
              else crt &#039;Editing &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
           if idcnt gt 1 then crt &#039; [&#039;:id:&#039;/&#039;:idcnt:&#039;]&#039;:&lt;br /&gt;
           crt&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;WM&#039;             ; * word marker display (change)&lt;br /&gt;
           if dlim ne &#039;&#039; then wordmark = dlim&lt;br /&gt;
           if wordmark eq &#039;&amp;quot;&#039;&lt;br /&gt;
              then crt &#039;WordMark is &#039;:&amp;quot;&#039;&amp;quot;:wordmark:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
              else crt &#039;WordMark is &#039;:&#039;&amp;quot;&#039;:wordmark:&#039;&amp;quot;&#039;&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
x:   begin case&lt;br /&gt;
* Another way of quitting&lt;br /&gt;
        case comd eq &#039;X&#039; ; comd = &#039;QK&#039; ; redo = true&lt;br /&gt;
        case comd eq &#039;XEQ&#039;               ; * execute a command&lt;br /&gt;
           if viewflag then gosub viewonly ; return&lt;br /&gt;
           if not(sec.xeq.flg) then&lt;br /&gt;
              crt &#039;XEQ disabled&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           loop&lt;br /&gt;
              if rest ne &#039;&#039; then execute rest&lt;br /&gt;
              test = @(0,0)&lt;br /&gt;
              stub = &#039;&amp;lt;RETURN&amp;gt; or command :&#039;&lt;br /&gt;
              gosub get.rope; rest = rope&lt;br /&gt;
              if rest eq &#039;&#039; then&lt;br /&gt;
                 crt; crt &#039;Returned - &#039;:&lt;br /&gt;
                 crt &#039;Editing &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
              end&lt;br /&gt;
           until rest eq &#039;&#039; do&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
              crt&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
           repeat&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case comd eq &#039;XTD&#039;               ; * hex to decimal&lt;br /&gt;
$ifdef universe&lt;br /&gt;
           crt xtd(rest)&lt;br /&gt;
$else&lt;br /&gt;
           crt iconv(rest,&#039;MX&#039;)&lt;br /&gt;
$endif&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
y:   begin case&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
z:   begin case&lt;br /&gt;
        case 1 ; gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
set.bounds:&lt;br /&gt;
     if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
     dawn = here&lt;br /&gt;
     if dawn lt 1 then dawn = 1&lt;br /&gt;
     dusk = dawn + numb - 1&lt;br /&gt;
     if dusk gt last then dusk = last&lt;br /&gt;
     numb = 0&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
null.command:&lt;br /&gt;
     if dlim eq &#039;:&#039; then comd = &#039;XEQ&#039; ; return&lt;br /&gt;
     if dlim eq &#039;/&#039; then&lt;br /&gt;
        comd = &#039;L&#039;&lt;br /&gt;
        if numb eq &#039;&#039; then numb = huge&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     if dlim eq &#039;-&#039; or dlim eq &#039;+&#039; then&lt;br /&gt;
        if rest eq &#039;&#039; then rest = 1&lt;br /&gt;
     end&lt;br /&gt;
     if numb ne &#039;&#039; then comd = numb ; return&lt;br /&gt;
     if dlim eq &#039;&#039; and rest eq &#039;&#039; then&lt;br /&gt;
        here += 1&lt;br /&gt;
        if here gt last then here = 1&lt;br /&gt;
        gosub display.line&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     crt&lt;br /&gt;
     begin case&lt;br /&gt;
        case dlim eq &#039;+&#039; and rest matches &#039;1N0N&#039;&lt;br /&gt;
           here = here + rest&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case dlim eq &#039;-&#039; and rest matches &#039;1N0N&#039;&lt;br /&gt;
           here = here - rest&lt;br /&gt;
           if here lt 0 then here = 0&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        case dlim eq &#039;^&#039;&lt;br /&gt;
           wild = not(wild)&lt;br /&gt;
           if wild&lt;br /&gt;
              then crt &#039;Expansion of non-printing characters enabled&#039;&lt;br /&gt;
              else crt &#039;Expansion of non-printing characters disabled&#039;&lt;br /&gt;
        case dlim eq &#039;=&#039;&lt;br /&gt;
           crt &#039;UNIDATA prestore is not implemented - Use &amp;quot;PR&amp;quot;&#039;&lt;br /&gt;
        case dlim eq &#039;.&#039;&lt;br /&gt;
           gosub dot.command&lt;br /&gt;
        case dlim eq &#039;$&#039;&lt;br /&gt;
           if not(sec.xcom.flg) then&lt;br /&gt;
              crt &#039;$ external commands disabled&#039;&lt;br /&gt;
              comi = &#039;&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           save = comi ; comi = rest&lt;br /&gt;
           gosub parse.command&lt;br /&gt;
           comi = save&lt;br /&gt;
           comd = &#039;$&#039;:comd&lt;br /&gt;
           xcom = oconv(comd,&#039;TAE_XCOMS;X;2;2&#039;)&lt;br /&gt;
           begin case&lt;br /&gt;
              case xcom eq &#039;&#039;&lt;br /&gt;
                 crt &#039;Record &amp;quot;&#039;:comd:&#039;&amp;quot; does not exist in &amp;quot;AE_XCOMS&amp;quot;.&#039;&lt;br /&gt;
              case xcom[len(xcom)-2,3] ne &#039;_AE&#039;&lt;br /&gt;
                 disp = &#039;&#039;&lt;br /&gt;
                 disp&amp;lt;-1&amp;gt; = &amp;quot;Line 2 of record &#039;&amp;quot;:rest:&amp;quot;&#039; in file &#039;AE_XCOMS&#039;&amp;quot;&lt;br /&gt;
                 disp&amp;lt;-1&amp;gt; = &amp;quot;contains &#039;&amp;quot;:xcom:&amp;quot;&#039;.&amp;quot;&lt;br /&gt;
                 disp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
                 disp&amp;lt;-1&amp;gt; = &#039;This line should contain the name of a Basic subroutine that&#039;&lt;br /&gt;
                 disp&amp;lt;-1&amp;gt; = &amp;quot;has been written to implement the external command &#039;&amp;quot;:rest:&amp;quot;&#039;.&amp;quot;&lt;br /&gt;
                 disp&amp;lt;-1&amp;gt; = &amp;quot;The program name must end in &#039;_AE&#039;.&amp;quot;&lt;br /&gt;
                 stub = &#039;Press RETURN to continue&#039;&lt;br /&gt;
                 gosub show.disp&lt;br /&gt;
              case 1&lt;br /&gt;
                 that = this ; savl = here:am:last:beg:am:fin:am:krj&lt;br /&gt;
                 save = comi:am:comd:am:item:am:fnam&lt;br /&gt;
                 comd = comd:&#039; &#039;:rest&lt;br /&gt;
                 call @xcom(mat junk)&lt;br /&gt;
                 item = save&amp;lt;3&amp;gt;&lt;br /&gt;
                 fnam = save&amp;lt;4&amp;gt;&lt;br /&gt;
                 if here lt 0 then here = 0&lt;br /&gt;
                 gosub set.record&lt;br /&gt;
                 if here gt last then here = last&lt;br /&gt;
                 comd = &#039;&#039;&lt;br /&gt;
                 if that ne this then&lt;br /&gt;
                    crt save&amp;lt;2&amp;gt;:&#039; - CHANGES HAVE BEEN MADE&#039;&lt;br /&gt;
                    oops = that ; oopc = save&amp;lt;1&amp;gt;&lt;br /&gt;
                    oopl = savl&amp;lt;1&amp;gt; ; oopf = savl&amp;lt;2&amp;gt;&lt;br /&gt;
                    oopb = savl&amp;lt;3&amp;gt;:am:savl&amp;lt;4&amp;gt; ; oopk = field(savl,am,5,3)&lt;br /&gt;
                 end&lt;br /&gt;
                 that = &#039;&#039;&lt;br /&gt;
           end case&lt;br /&gt;
        case comi eq &#039;?&#039;&lt;br /&gt;
           disp = &#039;         Login name = &#039;:name:&#039; (&#039;:term:&#039;, userno &#039;:whom:&#039;)&#039;&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = &#039;            Account = &#039;:acct&lt;br /&gt;
           if path ne &#039;&#039; then disp&amp;lt;-1&amp;gt; = &#039;           VOC path = &#039;:path&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = &#039;              Level = &#039;:levl&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = &#039;          File name = &#039;:fnam&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = &#039;          Record id = &#039;:item&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = &#039;       Current line = &#039;:here&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = &#039;              Lines = &#039;:last&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = &#039;         Characters = &#039;:len(this)&lt;br /&gt;
           if chan ne &#039;&#039; then&lt;br /&gt;
              disp&amp;lt;-1&amp;gt; = &#039;Last Change command = &#039;:chan&amp;lt;1,1&amp;gt;&lt;br /&gt;
           end&lt;br /&gt;
           if cmat ne &#039;&#039; then&lt;br /&gt;
              temp = &#039;CM&#039;:cmat&amp;lt;1,3&amp;gt;:cmat&amp;lt;1,1&amp;gt;:cmat&amp;lt;1,2&amp;gt;&lt;br /&gt;
              disp&amp;lt;-1&amp;gt; = &#039;Last CMatch command = &#039;:temp&lt;br /&gt;
           end&lt;br /&gt;
           if olda then&lt;br /&gt;
              temp = &#039;A&#039;:olda&amp;lt;1,2&amp;gt;:olda&amp;lt;1,1&amp;gt;&lt;br /&gt;
              disp&amp;lt;-1&amp;gt; = &#039;Last Append command = &#039;:temp&lt;br /&gt;
           end&lt;br /&gt;
           if beg or fin then&lt;br /&gt;
              disp&amp;lt;-1&amp;gt; = &#039;              Block = &#039;:beg:&#039;-&#039;:fin&lt;br /&gt;
           end&lt;br /&gt;
           if comdmark eq &#039;&amp;quot;&#039; then&lt;br /&gt;
              temp = &amp;quot;&#039;&amp;quot;:comdmark:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
           end else temp = &#039;&amp;quot;&#039;:comdmark:&#039;&amp;quot;&#039;&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = &#039;Command Delimiter is &#039;:temp:&#039;, &#039;&lt;br /&gt;
           if nill eq &#039;&amp;quot;&#039; then&lt;br /&gt;
              temp = &amp;quot;&#039;&amp;quot;:nill:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
           end else temp = &#039;&amp;quot;&#039;:nill:&#039;&amp;quot;&#039;&lt;br /&gt;
           disp := &#039;character to end inserting is &#039;:temp:&#039;, &#039;&lt;br /&gt;
           if wordmark eq &#039;&amp;quot;&#039; then&lt;br /&gt;
              temp = &amp;quot;&#039;&amp;quot;:wordmark:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
           end else temp = &#039;&amp;quot;&#039;:wordmark:&#039;&amp;quot;&#039;&lt;br /&gt;
           disp := &#039;WordMark is &#039;:temp&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = &#039;Page: window for PA/PL/PP is &#039;:pwin:&#039;, length for P is &#039;:plen&lt;br /&gt;
           if wild&lt;br /&gt;
              then disp&amp;lt;-1&amp;gt; = &#039;Expansion of non-printing characters enabled&#039;&lt;br /&gt;
              else disp&amp;lt;-1&amp;gt; = &#039;Expansion of non-printing characters disabled&#039;&lt;br /&gt;
           if caseflag then&lt;br /&gt;
              disp&amp;lt;-1&amp;gt; = &#039;CASE&#039;:&#039; flag ON&#039;:&#039;, &#039;&lt;br /&gt;
           end else disp&amp;lt;-1&amp;gt; = &#039;CASE&#039;:&#039; flag OFF&#039;:&#039;, &#039;&lt;br /&gt;
           if spaceflag then&lt;br /&gt;
              disp := &#039;SPACE&#039;:&#039; flag ON&#039;:&#039;, &#039;&lt;br /&gt;
           end else disp := &#039;SPACE&#039;:&#039; flag OFF&#039;:&#039;, &#039;&lt;br /&gt;
           if shew then&lt;br /&gt;
              disp := &#039;SHOW&#039;:&#039; flag ON&#039;:&#039;, &#039;&lt;br /&gt;
           end else disp := &#039;SHOW&#039;:&#039; flag OFF&#039;:&#039;, &#039;&lt;br /&gt;
           if blockflag then&lt;br /&gt;
              disp := &#039;BLOCK&#039;:&#039; flag ON&#039;&lt;br /&gt;
           end else disp := &#039;BLOCK&#039;:&#039; flag OFF&#039;&lt;br /&gt;
           if oopc ne &#039;&#039; then&lt;br /&gt;
              disp&amp;lt;-1&amp;gt; = &#039;OOPS will restore record prior to command: &#039;:oopc&lt;br /&gt;
           end else&lt;br /&gt;
              disp&amp;lt;-1&amp;gt; = &#039;OOPS already executed, or no changes in effect.&#039;&lt;br /&gt;
           end&lt;br /&gt;
           gosub show.disp&lt;br /&gt;
        case comi[1,2] eq &#039;&amp;lt;&amp;gt;&#039; ; gosub botharr&lt;br /&gt;
        case comi[1,1] eq &#039;&amp;lt;&#039; ; gosub leftarr&lt;br /&gt;
        case comi[1,1] eq &#039;&amp;gt;&#039; ; gosub rightarr&lt;br /&gt;
        case dlim eq &#039;\&#039; and rest[1,1] eq &#039;\&#039;    ;* clear the tag pointers&lt;br /&gt;
           krj = &#039;&#039;&lt;br /&gt;
           crt &#039;Tags cleared&#039;&lt;br /&gt;
        case dlim eq &#039;\&#039;      ;* set a tag pointer&lt;br /&gt;
           locate(here,krj,2;posn) then&lt;br /&gt;
              crt &#039;There is already a Tag on line &#039;:here&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           if rest eq &#039;&#039; then rest = &#039;T&#039;:here&lt;br /&gt;
           rest = upcase(rest)&lt;br /&gt;
           locate(rest,krj,1;posn) then&lt;br /&gt;
              crt &#039;There is already a Tag labelled &#039;:rest&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           posn = krj&amp;lt;3&amp;gt;&lt;br /&gt;
           krj&amp;lt;1&amp;gt; = field(krj&amp;lt;1&amp;gt;,vm,1,posn)&lt;br /&gt;
           posn += 1&lt;br /&gt;
           krj&amp;lt;1,posn&amp;gt; = rest&lt;br /&gt;
           krj&amp;lt;2,posn&amp;gt; = here&lt;br /&gt;
           krj&amp;lt;3&amp;gt; = posn&lt;br /&gt;
           crt &#039;Setting Tag labelled &#039;:rest:&#039; at line &#039;:here&lt;br /&gt;
        case (dlim eq &#039;[&#039; or dlim eq &#039;]&#039;) and (rest[1,1] eq &#039;[&#039; or rest[1,1] eq &#039;]&#039;)&lt;br /&gt;
           if krj&amp;lt;3&amp;gt; eq &#039;&#039;&lt;br /&gt;
              then disp = &#039;No Tag found&#039;&lt;br /&gt;
              else disp = &#039;Tags at line-Labelled&#039;&lt;br /&gt;
           posn = krj&amp;lt;3&amp;gt;&lt;br /&gt;
           xxno = dcount(krj&amp;lt;1&amp;gt;,vm)&lt;br /&gt;
           for xx = 1 to xxno&lt;br /&gt;
              disp&amp;lt;-1&amp;gt; = krj&amp;lt;2,xx&amp;gt; &#039;r#12&#039;&lt;br /&gt;
              if xx eq posn then disp := &#039;&amp;gt;&#039; else disp := &#039; &#039;&lt;br /&gt;
              disp := krj&amp;lt;1,xx&amp;gt;&lt;br /&gt;
           next xx&lt;br /&gt;
           convert badc to gudc in disp&lt;br /&gt;
           gosub show.disp&lt;br /&gt;
        case dlim eq &#039;[&#039; and rest eq &#039;&#039;&lt;br /&gt;
           posn = krj&amp;lt;3&amp;gt;-1&lt;br /&gt;
           if posn gt 0 then&lt;br /&gt;
              comd = krj&amp;lt;2,posn&amp;gt;&lt;br /&gt;
              krj&amp;lt;3&amp;gt; = posn&lt;br /&gt;
              crt &#039;Moved to line &#039;:comd:&#039; labelled &#039;:krj&amp;lt;1&lt;br /&gt;
           end else comd = &#039;&#039;&lt;br /&gt;
           if comd eq &#039;&#039; then crt &#039;No Tag found&#039;&lt;br /&gt;
        case dlim eq &#039;]&#039; and rest eq &#039;&#039;&lt;br /&gt;
           posn = krj&amp;lt;3&amp;gt;+1&lt;br /&gt;
           comd = krj&amp;lt;2,posn&amp;gt;&lt;br /&gt;
           if comd eq &#039;&#039; then&lt;br /&gt;
              crt &#039;No Tag found&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              krj&amp;lt;3&amp;gt; = posn&lt;br /&gt;
              crt &#039;Moved to line &#039;:comd:&#039; labelled &#039;:krj&amp;lt;1&lt;br /&gt;
           end&lt;br /&gt;
        case dlim eq &#039;[&#039; or dlim eq &#039;]&#039;&lt;br /&gt;
           locate(upcase(rest),krj,1;posn) then comd = krj&amp;lt;2,posn&amp;gt; else comd = &#039;&#039;&lt;br /&gt;
           if comd ne &#039;&#039; then&lt;br /&gt;
              krj&amp;lt;3&amp;gt; = posn&lt;br /&gt;
              crt &#039;Moved to line &#039;:comd:&#039; labelled &#039;:krj&amp;lt;1&lt;br /&gt;
              return&lt;br /&gt;
           end else crt &#039;No Tag found&#039;&lt;br /&gt;
        case 1&lt;br /&gt;
           gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
parse.cols:&lt;br /&gt;
     good = true&lt;br /&gt;
     cols = field(rest,dlim,2)&lt;br /&gt;
     convert &#039;,.&#039; to &#039;--&#039; in cols&lt;br /&gt;
     rest = field(rest,dlim,1)&lt;br /&gt;
     colf = field(cols,&#039;-&#039;,2)&lt;br /&gt;
     cols = field(cols,&#039;-&#039;,1)&lt;br /&gt;
     if colf eq &#039;&#039; then colf = cols&lt;br /&gt;
     if cols ne &#039;&#039; then&lt;br /&gt;
        if not(cols matches &#039;1N0N&#039;) or not(colf matches &#039;1N0N&#039;) then&lt;br /&gt;
           crt &#039;Column specifications must be positive whole numbers.&#039;&lt;br /&gt;
           gosub bad.comd&lt;br /&gt;
           good = false&lt;br /&gt;
           return&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     if colf lt cols then&lt;br /&gt;
        crt &#039;Ending column # must exceed or equal starting column #.&#039;&lt;br /&gt;
        gosub bad.comd&lt;br /&gt;
        good = false&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     colf = colf - cols + 1&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
parse.atts:&lt;br /&gt;
     convert &#039;-&#039; to dlim in rest&lt;br /&gt;
     if dlim eq &#039;&amp;quot;&#039; then temp = &amp;quot;&#039;&amp;quot; else temp = &#039;&amp;quot;&#039;&lt;br /&gt;
     temp = &#039;1N0N&#039;:temp:dlim:temp:&#039;1N0N&#039;&lt;br /&gt;
     if rest matches temp then&lt;br /&gt;
        numb = field(rest,dlim,2) - field(rest,dlim,1) + 1&lt;br /&gt;
        rest = field(rest,dlim,1)&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
change.command:&lt;br /&gt;
     if comd eq &#039;RA&#039; then&lt;br /&gt;
        if numb eq &#039;&#039; then&lt;br /&gt;
           crt &#039;Last &#039;:channumb:&#039; changes (latest first)&#039;&lt;br /&gt;
           for xx = 1 to channumb&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
              crt fmt(xx,&#039;2/0R&#039;):&#039; &#039;:chan&amp;lt;1,xx&amp;gt;&lt;br /&gt;
$else&lt;br /&gt;
              crt fmt(xx,&#039;R%2&#039;):&#039; &#039;:chan&amp;lt;1,xx&amp;gt;&lt;br /&gt;
$endif&lt;br /&gt;
           next xx&lt;br /&gt;
           return&lt;br /&gt;
        end&lt;br /&gt;
        if numb gt channumb or numb lt 1 then&lt;br /&gt;
           crt &#039;Change must be in range 1-&#039;:channumb:&#039;.&#039;&lt;br /&gt;
           comi = &#039;&#039;&lt;br /&gt;
           return&lt;br /&gt;
        end&lt;br /&gt;
        comi = chan&amp;lt;1,numb&amp;gt;&lt;br /&gt;
        if comi eq &#039;&#039; then&lt;br /&gt;
           crt &#039;There is no change number &#039;:numb:&#039;.&#039;&lt;br /&gt;
           return&lt;br /&gt;
        end&lt;br /&gt;
        chan = delete(chan,1,numb,0)&lt;br /&gt;
        chan = insert(chan,1,1,0,comi)&lt;br /&gt;
        gosub parse.command&lt;br /&gt;
        comi = &#039;RA&#039;&lt;br /&gt;
     end&lt;br /&gt;
save = upcase(field(rest,dlim,3,2))&lt;br /&gt;
if save ne &#039;&#039; then rest = rest[1,col1()]&lt;br /&gt;
     gosub get.fromto&lt;br /&gt;
temp = save&lt;br /&gt;
     if comi eq &#039;&#039; then return&lt;br /&gt;
     chng = 0 ; save = here ; savl = last&lt;br /&gt;
     glob = index(temp,&#039;G&#039;,1)&lt;br /&gt;
     show = shew or index(temp,&#039;S&#039;,1)&lt;br /&gt;
convert dlim:&#039;GS&#039; to &#039;-&#039; in temp&lt;br /&gt;
rest = dlim:temp&lt;br /&gt;
gosub parse.cols&lt;br /&gt;
if not(good) then return&lt;br /&gt;
     if numb lt plen then show = true&lt;br /&gt;
     dnum = 1&lt;br /&gt;
     gosub set.bounds&lt;br /&gt;
     for here = dawn to dusk&lt;br /&gt;
        gosub get.line&lt;br /&gt;
        gosub change.line&lt;br /&gt;
        gosub check.line&lt;br /&gt;
     next here&lt;br /&gt;
     here = dusk&lt;br /&gt;
     if comi ne &#039;&#039; and upcase(comi) ne &#039;RA&#039; then&lt;br /&gt;
        chan = insert(chan,1,1,0,comi)&lt;br /&gt;
        chan = delete(chan,1,channumb,0)&lt;br /&gt;
     end&lt;br /&gt;
     if chng then&lt;br /&gt;
        gosub reset.record&lt;br /&gt;
        if not(show) and dnum gt plen then&lt;br /&gt;
           crt chng:&#039; lines changed - now at &#039;:here&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
get.fromto:&lt;br /&gt;
     if count(rest,dlim) gt 2 then&lt;br /&gt;
        crt &#039;Too many delimiters (3 max.).&#039;&lt;br /&gt;
        comi = &#039;&#039;&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     line = field(rest,dlim,1)&lt;br /&gt;
     gosub parse.line&lt;br /&gt;
     cfrom = line&lt;br /&gt;
     line = field(rest,dlim,2)&lt;br /&gt;
     gosub parse.line&lt;br /&gt;
     cto = line&lt;br /&gt;
     if cto eq &#039;&#039; and count(rest,dlim) lt 2 then&lt;br /&gt;
        crt &#039;Missing required TO field (for &amp;quot;CHANGE/FROM/TO&amp;quot;).&#039;&lt;br /&gt;
        comi = &#039;&#039;&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
change.line:&lt;br /&gt;
     if cfrom eq &#039;&#039; then&lt;br /&gt;
        temp = cto:line&lt;br /&gt;
     end else&lt;br /&gt;
        if glob then&lt;br /&gt;
           temp = change(line,cfrom,cto)&lt;br /&gt;
        end else&lt;br /&gt;
           temp = index(line,cfrom,1)&lt;br /&gt;
           if temp then&lt;br /&gt;
              temp = line[1,temp-1]:cto:line[temp+len(cfrom),len(line)]&lt;br /&gt;
           end else temp = line&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
conv.command:&lt;br /&gt;
     chng = 0 ; save = here ; savl = last&lt;br /&gt;
     show = shew or index(rest,&#039;S&#039;,1) or index(rest,&#039;s&#039;,1)&lt;br /&gt;
     dnum = 1&lt;br /&gt;
     if numb lt plen then show = true&lt;br /&gt;
     if numb eq &#039;&#039; and rest matches &#039;1N0N&#039; then numb = rest&lt;br /&gt;
     gosub set.bounds&lt;br /&gt;
     ctyp = ccom[1,1]&lt;br /&gt;
     begin case&lt;br /&gt;
* ICONV&lt;br /&gt;
        case ctyp eq &#039;*&#039; ; ccom = ccom[2,huge]&lt;br /&gt;
* Text conversion LC, TC, or UC command&lt;br /&gt;
        case ctyp eq &#039;Q&#039; ; ccom = ccom[2,huge]&lt;br /&gt;
     end case&lt;br /&gt;
     for here = dawn to dusk&lt;br /&gt;
        gosub get.line&lt;br /&gt;
        begin case&lt;br /&gt;
           case ctyp eq &#039;*&#039;&lt;br /&gt;
              temp = iconv(line,ccom)&lt;br /&gt;
           case ctyp eq &#039;Q&#039;&lt;br /&gt;
              temp = field(trim(line),&#039; &#039;,1)&lt;br /&gt;
              flag = false&lt;br /&gt;
              if temp ne &#039;REMOVE&#039; then&lt;br /&gt;
                 if temp[1,3] eq &#039;REM&#039; then flag = true&lt;br /&gt;
                 if temp[1,1] eq &#039;*&#039; then flag = true&lt;br /&gt;
                 if temp[1,1] eq &#039;!&#039; then flag = true&lt;br /&gt;
              end&lt;br /&gt;
              if flag then&lt;br /&gt;
                 temp = line&lt;br /&gt;
              end else&lt;br /&gt;
                 xxno = len(line)&lt;br /&gt;
                 temp = &#039;&#039;&lt;br /&gt;
                 flag = &#039;&#039;&lt;br /&gt;
                 for xx = 1 to xxno&lt;br /&gt;
                    bit = line[xx,1]&lt;br /&gt;
                    begin case&lt;br /&gt;
                       case bit eq flag ; flag = &#039;&#039;&lt;br /&gt;
                       case flag ne &#039;&#039;&lt;br /&gt;
                       case index(qt,bit,1) ; flag = bit&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
                       case bit eq &#039;;&#039;&lt;br /&gt;
                          test = trim(line[xx+1,huge])[1,1]&lt;br /&gt;
                          if test eq &#039;*&#039; or test eq &#039;!&#039; then flag = am&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
                       case 1 ; bit = oconv(bit,ccom)&lt;br /&gt;
                    end case&lt;br /&gt;
                    temp = temp:bit&lt;br /&gt;
                 next xx&lt;br /&gt;
              end&lt;br /&gt;
           case 1&lt;br /&gt;
              temp = oconv(line,ccom)&lt;br /&gt;
        end case&lt;br /&gt;
        if temp eq &#039;&#039; then temp = line&lt;br /&gt;
        gosub check.line&lt;br /&gt;
     next here&lt;br /&gt;
     here = dusk&lt;br /&gt;
     if chng then&lt;br /&gt;
        gosub reset.record&lt;br /&gt;
        if not(show) and dnum gt plen then&lt;br /&gt;
           crt chng:&#039; lines changed - now at &#039;:here&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
dot.command:&lt;br /&gt;
     if trim(comi) eq &#039;.&#039; then comi = &#039;.L1&#039;&lt;br /&gt;
     save = comi&lt;br /&gt;
     comi = field(comi,dlim,2,huge)&lt;br /&gt;
     gosub parse.command&lt;br /&gt;
     begin case&lt;br /&gt;
        case comd eq &#039;A&#039;                 ; * append to line&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb gt dcount(stak,vm) then&lt;br /&gt;
              crt &#039;History command &#039;:numb:&#039; does not exist.&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              stak&amp;lt;1,numb&amp;gt; := rest&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
              crt fmt(numb,&#039;3/0R&#039;):&#039;. &#039;:stak&amp;lt;1,numb&amp;gt;&lt;br /&gt;
$else&lt;br /&gt;
              crt fmt(numb,&#039;R%3&#039;):&#039;. &#039;:stak&amp;lt;1,numb&amp;gt;&lt;br /&gt;
$endif&lt;br /&gt;
           end&lt;br /&gt;
        case comd eq &#039;C&#039;                 ; * change lines&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb gt dcount(stak,vm) then&lt;br /&gt;
              crt &#039;History command &#039;:numb:&#039; does not exist.&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              gosub get.fromto&lt;br /&gt;
              if comi eq &#039;&#039; then comd = &#039;&#039; ; return&lt;br /&gt;
              glob = index(field(rest,dlim,3),&#039;G&#039;,1)&lt;br /&gt;
              glob = glob + index(field(rest,dlim,3),&#039;g&#039;,1)&lt;br /&gt;
              line = stak&amp;lt;1,numb&amp;gt;&lt;br /&gt;
              gosub change.line&lt;br /&gt;
              stak&amp;lt;1,numb&amp;gt; = temp&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
              crt fmt(numb,&#039;3/0R&#039;):&#039;. &#039;:temp&lt;br /&gt;
$else&lt;br /&gt;
              crt fmt(numb,&#039;R%3&#039;):&#039;. &#039;:temp&lt;br /&gt;
$endif&lt;br /&gt;
           end&lt;br /&gt;
        case comd eq &#039;D&#039;                 ; * delete lines&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb gt dcount(stak,vm) then&lt;br /&gt;
              crt &#039;History command &#039;:numb:&#039; does not exist.&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              stak = delete(stak,1,numb,0)&lt;br /&gt;
              crt &#039;History #&#039;:numb:&#039; DELETEd.&#039;&lt;br /&gt;
           end&lt;br /&gt;
        case comd eq &#039;I&#039;                 ; * insert a new line&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb gt dcount(stak,vm) then&lt;br /&gt;
              crt &#039;History command &#039;:numb:&#039; does not exist.&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              if rest ne &#039;&#039; then&lt;br /&gt;
                 stak = insert(stak,1,numb,0,rest)&lt;br /&gt;
                 stak = delete(stak,1,staknumb,0)&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
                 crt fmt(numb,&#039;3/0R&#039;):&#039;. &#039;:stak&amp;lt;1,numb&amp;gt;&lt;br /&gt;
$else&lt;br /&gt;
                 crt fmt(numb,&#039;R%3&#039;):&#039;. &#039;:stak&amp;lt;1,numb&amp;gt;&lt;br /&gt;
$endif&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
        case comd eq &#039;L&#039;                 ; * list lines&lt;br /&gt;
           if numb eq &#039;&#039; then numb = plen&lt;br /&gt;
           if numb gt dcount(stak,vm) then numb = dcount(stak,vm)&lt;br /&gt;
           temp = rem(numb+1,plen)&lt;br /&gt;
           for xx = numb to 1 step -1&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
              crt fmt(xx,&#039;3/0R&#039;):&#039;. &#039;:stak&amp;lt;1,xx&amp;gt;&lt;br /&gt;
$else&lt;br /&gt;
              crt fmt(xx,&#039;R%3&#039;):&#039;. &#039;:stak&amp;lt;1,xx&amp;gt;&lt;br /&gt;
$endif&lt;br /&gt;
              if xx gt 1 and rem(xx,plen) eq temp then&lt;br /&gt;
                 stub = &#039;Press return to continue, Q to quit&#039;&lt;br /&gt;
                 rlen = 1&lt;br /&gt;
                 gosub get.rope; crt begn:ceol:&lt;br /&gt;
                 wait = trim(upcase(rope))[1,1]&lt;br /&gt;
                 if wait eq &#039;Q&#039; then exit&lt;br /&gt;
              end&lt;br /&gt;
           next xx&lt;br /&gt;
        case comd eq &#039;R&#039;                 ; * restore a line to latest&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb le dcount(stak,vm) then&lt;br /&gt;
              temp = stak&amp;lt;1,numb&amp;gt;&lt;br /&gt;
              stak = insert(stak,1,1,0,temp)&lt;br /&gt;
              stak = delete(stak,1,staknumb,0)&lt;br /&gt;
           end&lt;br /&gt;
        case comd eq &#039;S&#039;&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb gt presnumb then&lt;br /&gt;
              crt numb:&#039; is greater than pre-store limit of &#039;:presnumb&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           rest = trim(rest)&lt;br /&gt;
           dawn = field(rest,dlim,1) ; if dawn eq &#039;&#039; then dawn = 1&lt;br /&gt;
           dusk = field(rest,dlim,2) ; if dusk eq &#039;&#039; then dusk = 1&lt;br /&gt;
           if not(dawn matches &#039;1N0N&#039; and dusk matches &#039;1N0N&#039;) then&lt;br /&gt;
              crt &#039;One of the values was not a number&#039;&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
           if dawn gt dusk then temp = dawn ; dawn = dusk ; dusk = temp&lt;br /&gt;
           temp = &#039;&#039;&lt;br /&gt;
           for xx = dusk to dawn step -1&lt;br /&gt;
              temp&amp;lt;1,1,-1&amp;gt; = stak&amp;lt;1,xx&amp;gt;&lt;br /&gt;
           next xx&lt;br /&gt;
           pres&amp;lt;1,numb&amp;gt; = temp&lt;br /&gt;
        case comd eq &#039;U&#039;                 ; * upcase line&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb gt dcount(stak,vm)&lt;br /&gt;
              then crt &#039;History command &#039;:numb:&#039; does not exist.&#039;&lt;br /&gt;
              else stak&amp;lt;1,numb&amp;gt; = upcase(stak&amp;lt;1,numb&amp;gt;)&lt;br /&gt;
        case comd eq &#039;UL&#039;                ; * downcase line&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb gt dcount(stak,vm)&lt;br /&gt;
              then crt &#039;History command &#039;:numb:&#039; does not exist.&#039;&lt;br /&gt;
              else stak&amp;lt;1,numb&amp;gt; = downcase(stak&amp;lt;1,numb&amp;gt;)&lt;br /&gt;
        case comd eq &#039;UT&#039;                ; * mixed case line&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb gt dcount(stak,vm)&lt;br /&gt;
              then crt &#039;History command &#039;:numb:&#039; does not exist.&#039;&lt;br /&gt;
              else stak&amp;lt;1,numb&amp;gt; = oconv(stak&amp;lt;1,numb&amp;gt;,&#039;mct&#039;)&lt;br /&gt;
        case comd eq &#039;X&#039;              ; * re-execute an editor command&lt;br /&gt;
           if numb eq &#039;&#039; then numb = 1&lt;br /&gt;
           if numb gt dcount(stak,vm) then&lt;br /&gt;
              crt &#039;History command &#039;:numb:&#039; does not exist.&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              salt = stak&amp;lt;1,numb&amp;gt;&lt;br /&gt;
              stak = delete(stak,1,numb,0)&lt;br /&gt;
           end&lt;br /&gt;
        case 1&lt;br /&gt;
           comi = save&lt;br /&gt;
           gosub bad.command&lt;br /&gt;
     end case&lt;br /&gt;
     comi = &#039;&#039; ; comd = &#039;&#039;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
viewonly:&lt;br /&gt;
     crt &#039;That command is not allowed in VIEW mode&#039;:bell&lt;br /&gt;
     comi = &#039;&#039;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
bad.command:&lt;br /&gt;
     crt &#039;Command not understood - try &amp;quot;H&amp;quot; for help.&#039;&lt;br /&gt;
bad.comd:&lt;br /&gt;
     xxno = len(comi)&lt;br /&gt;
     temp = &#039;&#039;&lt;br /&gt;
     for xx = 1 to xxno&lt;br /&gt;
        bite = comi[xx,1]&lt;br /&gt;
        bite = seq(bite)&lt;br /&gt;
        if bite ge 127 or bite lt 32 then&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
           bite = &#039;^&#039;:fmt(bite,&#039;3/0R&#039;)&lt;br /&gt;
$else&lt;br /&gt;
           bite = &#039;^&#039;:fmt(bite,&#039;R%3&#039;)&lt;br /&gt;
$endif&lt;br /&gt;
        end else bite = char(bite)&lt;br /&gt;
        temp = temp:bite&lt;br /&gt;
     next xx&lt;br /&gt;
     crt &#039;Command was: &amp;quot;&#039;:temp:&#039;&amp;quot;&#039;&lt;br /&gt;
     temp = &#039;&#039;&lt;br /&gt;
     comi = &#039;&#039;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
save.stuff:&lt;br /&gt;
     if not(sec.unload.flg) then&lt;br /&gt;
        crt &#039;Unload disabled&#039;&lt;br /&gt;
        comi = &#039;&#039;&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     keepquot = false&lt;br /&gt;
     gosub parse.rest&lt;br /&gt;
     odpt = &#039;&#039; ; ofpt = bite&amp;lt;1&amp;gt; ; oipt = bite&amp;lt;2&amp;gt;&lt;br /&gt;
     onam = ofpt&lt;br /&gt;
     if ofpt eq &#039;DICT&#039; then&lt;br /&gt;
        odpt = ofpt ; ofpt = oipt ; oipt = bite&amp;lt;3&amp;gt;&lt;br /&gt;
        onam = onam:&#039; &#039;:ofpt&lt;br /&gt;
     end&lt;br /&gt;
     if oipt eq &#039;&#039; then&lt;br /&gt;
        if odpt ne &#039;&#039; then&lt;br /&gt;
           crt &#039;Cannot save to null item.&#039;&lt;br /&gt;
           gosub bad.comd ; return&lt;br /&gt;
        end&lt;br /&gt;
        oipt = ofpt ; odpt = dprt ; ofpt = fprt ; onam = fnam&lt;br /&gt;
     end&lt;br /&gt;
     if dprt eq odpt and fprt eq ofpt then&lt;br /&gt;
        ofil = file&lt;br /&gt;
     end else&lt;br /&gt;
        open odpt, ofpt to ofil else&lt;br /&gt;
           crt &#039;Cannot open &#039;:&#039;&amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
           gosub bad.comd ; return&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     if prepflag then&lt;br /&gt;
        sec.call2.type = 2&lt;br /&gt;
        sec.fn2 = ofpt&lt;br /&gt;
        sec.id2 = oipt&lt;br /&gt;
        sec.dict2.flg = (odpt = &#039;DICT&#039;)&lt;br /&gt;
        call @prepprog(mat security)&lt;br /&gt;
        if sec.stop.flg then stop&lt;br /&gt;
        if not(sec.ok2.flg) then&lt;br /&gt;
           gosub bad.comd ; return&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     if source.control then&lt;br /&gt;
        dict.flag = odpt&lt;br /&gt;
        file.name = ofpt&lt;br /&gt;
        record.name = oipt&lt;br /&gt;
        record.data = this&lt;br /&gt;
        caller = &#039;3&#039;&lt;br /&gt;
        write.allowed = &#039;1&#039;&lt;br /&gt;
        updated = &#039;0&#039;&lt;br /&gt;
        call source.control(dict.flag,file.name,&lt;br /&gt;
        record.name,record.data,caller,write.allowed,updated)&lt;br /&gt;
        if write.allowed ne &#039;1&#039; then&lt;br /&gt;
           crt &#039;WRITE NOT ALLOWED&#039;&lt;br /&gt;
           return&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     readv test from ofil, oipt, 1 then&lt;br /&gt;
        stub = &#039;Record already exists. Overwrite (y/n)? &#039;&lt;br /&gt;
        gosub get.answ&lt;br /&gt;
        if answ ne yes[1,1] then return&lt;br /&gt;
     end&lt;br /&gt;
     if comd eq &#039;PASTE&#039; then&lt;br /&gt;
        write kept on ofil, oipt on error gosub writerr ; return&lt;br /&gt;
     end else&lt;br /&gt;
        write this on ofil, oipt on error gosub writerr ; return&lt;br /&gt;
     end&lt;br /&gt;
     crt &#039;Record &amp;quot;&#039;:oipt:&#039;&amp;quot; saved in &amp;quot;&#039;:onam:&#039;&amp;quot;.&#039;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
write.record:&lt;br /&gt;
     if rest ne &#039;&#039; then&lt;br /&gt;
        if comd eq &#039;FD&#039; then&lt;br /&gt;
           crt &#039;&amp;quot;FD&amp;quot; operates only on the current record &amp;amp; file.&#039;&lt;br /&gt;
        end else&lt;br /&gt;
           crt &#039;&amp;quot;FI&amp;quot; only for current record &amp;amp; file. Use SAVE.&#039;&lt;br /&gt;
        end&lt;br /&gt;
        gosub bad.comd ; return&lt;br /&gt;
     end&lt;br /&gt;
     if source.control then&lt;br /&gt;
        dict.flag = dprt&lt;br /&gt;
        file.name = fprt&lt;br /&gt;
        record.name = item&lt;br /&gt;
        if comd eq &#039;FD&#039; then record.data = &#039;&#039; else record.data = this&lt;br /&gt;
        caller = &#039;3&#039;&lt;br /&gt;
        write.allowed = &#039;1&#039;&lt;br /&gt;
        updated = &#039;0&#039;&lt;br /&gt;
        call source.control(dict.flag,file.name,&lt;br /&gt;
        record.name,record.data,caller,write.allowed,updated)&lt;br /&gt;
        if write.allowed ne &#039;1&#039; then&lt;br /&gt;
           crt &#039;WRITE NOT ALLOWED&#039;&lt;br /&gt;
           return&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     if not(lock) then&lt;br /&gt;
        crt &#039;Record lock has been released!   Write not allowed.&#039;&lt;br /&gt;
        comi = &#039;&#039;&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     if comd eq &#039;FD&#039; then&lt;br /&gt;
        stub = &#039;***** You are about to DELETE the record! OK? &#039;:ny&lt;br /&gt;
        gosub get.answ&lt;br /&gt;
        if answ ne yes[1,1] then return&lt;br /&gt;
&lt;br /&gt;
        delete file, item on error gosub writerr ; return&lt;br /&gt;
&lt;br /&gt;
        crt &#039;Deleted &amp;quot;&#039;:item:&#039;&amp;quot; from file &amp;quot;&#039;:fnam:&#039;&amp;quot;.&#039;&lt;br /&gt;
     end else&lt;br /&gt;
        if comd eq &#039;SV&#039; then&lt;br /&gt;
&lt;br /&gt;
           writeu this on file, item on error gosub writerr ; return&lt;br /&gt;
&lt;br /&gt;
           orig = this ; oops = &#039;&#039; ; oopc = &#039;&#039; ; oopl = &#039;&#039; ; oopf = &#039;&#039;&lt;br /&gt;
           oopb = &#039;&#039; ; oopk = &#039;&#039;&lt;br /&gt;
           crt &#039;Saved &amp;quot;&#039;:item:&#039;&amp;quot; in &amp;quot;&#039;:fnam:&#039;&amp;quot; - now at line &#039;:here:&#039;.&#039;&lt;br /&gt;
           return&lt;br /&gt;
        end else&lt;br /&gt;
&lt;br /&gt;
           write this on file, item on error gosub writerr ; return&lt;br /&gt;
&lt;br /&gt;
           if orig eq this then&lt;br /&gt;
              crt &#039;Filed &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot; UNCHANGED.&#039;&lt;br /&gt;
           end else crt &#039;Filed &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;.&#039;&lt;br /&gt;
           oops = &#039;&#039; ; oopc = &#039;&#039; ; oopl = &#039;&#039; ; oopf = &#039;&#039;    ; * ewd&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     stopsign = true&lt;br /&gt;
     if index(comd,&#039;B&#039;,1) then&lt;br /&gt;
        temp = &#039;BASIC&#039;&lt;br /&gt;
$ifdef qm&lt;br /&gt;
        if index(comd,&#039;D&#039;,1) then temp&amp;lt;2&amp;gt; = &#039; DEBUGGING&#039;&lt;br /&gt;
$endif&lt;br /&gt;
        gosub exec.that&lt;br /&gt;
     end&lt;br /&gt;
     if index(comd,&#039;C&#039;,1) then&lt;br /&gt;
        temp = &#039;CATALOG&#039;&lt;br /&gt;
        begin case&lt;br /&gt;
           case index(comd,&#039;L&#039;,1) ; temp&amp;lt;2&amp;gt; = &#039; LOCAL&#039;&lt;br /&gt;
*          case index(comd,&#039;G&#039;,1) ; temp&amp;lt;2&amp;gt; = &#039; GLOBAL&#039;&lt;br /&gt;
        end case&lt;br /&gt;
        gosub exec.that&lt;br /&gt;
     end&lt;br /&gt;
     if index(comd,&#039;R&#039;,1) then temp = &#039;RUN&#039; ; gosub exec.that&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
edit.fields:&lt;br /&gt;
     if here lt 1 then here = 1&lt;br /&gt;
     gosub get.line ; temp = line&lt;br /&gt;
     convert vmrk to am in line&lt;br /&gt;
     ttid = whom:&#039;_&#039;:levl:&#039;_&#039;:vals:&#039;.in.line#&#039;:here&lt;br /&gt;
&lt;br /&gt;
     write line on acom, ttid on error gosub writerr ; return&lt;br /&gt;
&lt;br /&gt;
     crt view:&#039;ing &#039;:vals:&#039; as fields...&#039;:&lt;br /&gt;
     execute verb:&#039; AE_COMS &#039;:ttid:options&lt;br /&gt;
     test = @(0,0)&lt;br /&gt;
     crt &#039;Back &#039;:view:&#039;ing the record &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;&lt;br /&gt;
     read line from acom, ttid else line = &#039;&#039;&lt;br /&gt;
     delete acom, ttid&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
reset.fields:&lt;br /&gt;
     convert am to vmrk in line&lt;br /&gt;
     if temp ne line then&lt;br /&gt;
        gosub savethat&lt;br /&gt;
        memr(cell)&amp;lt;lnum&amp;gt; = line&lt;br /&gt;
        gosub reset.record&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
get.load:&lt;br /&gt;
     temp = &#039;&#039;&lt;br /&gt;
     if trim(rest) eq &#039;&#039; then&lt;br /&gt;
        stub = &#039;Record name, or file name and record name &amp;gt;&#039;&lt;br /&gt;
        gosub get.rope; rest = rope; crt&lt;br /&gt;
        if trim(rest) eq &#039;&#039; then temp = &#039;&#039;; return&lt;br /&gt;
     end&lt;br /&gt;
     keepquot = false&lt;br /&gt;
     gosub parse.rest&lt;br /&gt;
     onam = bite&amp;lt;1&amp;gt;&lt;br /&gt;
     onid = bite&amp;lt;2&amp;gt;&lt;br /&gt;
     if onam eq &#039;DICT&#039; then&lt;br /&gt;
        onam = onam:&#039; &#039;:onid&lt;br /&gt;
        onid = bite&amp;lt;3&amp;gt;&lt;br /&gt;
        if onid eq &#039;&#039; then onid = item&lt;br /&gt;
     end&lt;br /&gt;
     if onid eq &#039;&#039; then onid = onam ; onam = &#039;&#039;&lt;br /&gt;
     if onid eq &#039;&#039; then return&lt;br /&gt;
     if onam eq &#039;&#039; then&lt;br /&gt;
        onam = fnam&lt;br /&gt;
        odpt = dprt&lt;br /&gt;
        ofpt = fprt&lt;br /&gt;
        ofil = file&lt;br /&gt;
     end else&lt;br /&gt;
        odpt = field(onam,&#039; &#039;,1)&lt;br /&gt;
        ofpt = field(onam,&#039; &#039;,2)&lt;br /&gt;
        if ofpt eq &#039;&#039; then ofpt = odpt ; odpt = &#039;&#039;&lt;br /&gt;
        open odpt, ofpt to ofil else&lt;br /&gt;
           crt &#039;Cannot open &#039;:onam&lt;br /&gt;
           gosub bad.comd ; return&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     read temp from ofil, onid else&lt;br /&gt;
        if dcount(bite,am) eq 1 then&lt;br /&gt;
           open onid to ofil then&lt;br /&gt;
              read temp from ofil, item then return&lt;br /&gt;
           end&lt;br /&gt;
        end&lt;br /&gt;
        crt &#039;Record &amp;quot;&#039;:onid:&#039;&amp;quot; was not found on file &amp;quot;&#039;:onam:&#039;&amp;quot;.&#039;&lt;br /&gt;
        gosub bad.comd ; return&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
changematch.command:&lt;br /&gt;
     patt = field(rest,dlim,1)&lt;br /&gt;
     gosub parse.pattern&lt;br /&gt;
     if not(good) then&lt;br /&gt;
        crt &#039;Pattern: character &amp;quot;&#039;:bit:&#039;&amp;quot; is not allowed unless quoted.&#039;&lt;br /&gt;
        comi = &#039;&#039;&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     if comd eq &#039;CM&#039; then cmat = dlim:vm:rest:vm:numb&lt;br /&gt;
     cto = field(rest,dlim,3,huge)&lt;br /&gt;
     line = cto ; gosub parse.line ; cto = line&lt;br /&gt;
     cfrom = upcase(field(rest,dlim,2))&lt;br /&gt;
     if cfrom eq &#039;&#039; then cfrom = &#039;L&#039;&lt;br /&gt;
     if cfrom eq &#039;L&#039; then mmat = dlim:vm:rest&lt;br /&gt;
     if numb eq &#039;&#039; and cto eq &#039;&#039; and (cfrom eq &#039;L&#039; or cfrom eq &#039;N&#039;) then&lt;br /&gt;
        numb = last&lt;br /&gt;
        flag = true&lt;br /&gt;
     end else flag = false&lt;br /&gt;
     if len(cfrom) eq 1 and index(&#039;ADLNPR&#039;,cfrom,1) then&lt;br /&gt;
     end else&lt;br /&gt;
        gosub parse.cols&lt;br /&gt;
        if not(good) then return&lt;br /&gt;
        cfrom = &#039;&#039;&lt;br /&gt;
        colf = cols + colf - 1&lt;br /&gt;
     end&lt;br /&gt;
cm.del.entry:&lt;br /&gt;
     gosub set.bounds&lt;br /&gt;
     show = shew ; dnum = 1&lt;br /&gt;
     chng = 0 ; save = here ; savl = last ; dnum = 2&lt;br /&gt;
     test = &#039;&#039;&lt;br /&gt;
     for here = dawn to dusk&lt;br /&gt;
        gosub get.line&lt;br /&gt;
        if cfrom eq &#039;DE&#039;&lt;br /&gt;
           then good = index(line,patt,1)&lt;br /&gt;
           else good = (line matches patt)&lt;br /&gt;
        if not(good) then&lt;br /&gt;
           if cfrom eq &#039;N&#039; then&lt;br /&gt;
              numb += 1&lt;br /&gt;
              if show or numb lt plen then gosub display.line&lt;br /&gt;
              if flag then dusk = here&lt;br /&gt;
           end&lt;br /&gt;
           continue&lt;br /&gt;
        end&lt;br /&gt;
        numb += 1&lt;br /&gt;
        temp = line&lt;br /&gt;
        begin case&lt;br /&gt;
           case cfrom eq &#039;A&#039;&lt;br /&gt;
              temp = line:cto&lt;br /&gt;
           case cfrom[1,1] eq &#039;D&#039;&lt;br /&gt;
              if show or numb lt plen then crt fmt((here + chng),lfmt):&#039;+ &#039;:line&lt;br /&gt;
              test&amp;lt;-1&amp;gt; = here&lt;br /&gt;
           case cfrom eq &#039;L&#039;&lt;br /&gt;
              gosub display.line&lt;br /&gt;
&lt;br /&gt;
              if flag then dusk = here&lt;br /&gt;
           case cfrom eq &#039;P&#039;&lt;br /&gt;
              temp = cto:line&lt;br /&gt;
           case cfrom eq &#039;R&#039;&lt;br /&gt;
              temp = cto&lt;br /&gt;
           case cfrom eq &#039;N&#039;&lt;br /&gt;
              numb -= 1&lt;br /&gt;
           case 1&lt;br /&gt;
              gosub parse.temp&lt;br /&gt;
        end case&lt;br /&gt;
        if not(index(&#039;DL&#039;,cfrom,1)) or cfrom eq &#039;&#039; then&lt;br /&gt;
           gosub check.line&lt;br /&gt;
        end&lt;br /&gt;
     next here&lt;br /&gt;
     if cfrom[1,1] eq &#039;D&#039; and numb then&lt;br /&gt;
        gosub savethis&lt;br /&gt;
        for here = numb to 1 step -1&lt;br /&gt;
           temp = test&amp;lt;here&amp;gt;&lt;br /&gt;
           cell = int((temp-1)/cellsize) + 1&lt;br /&gt;
           coff = rem(temp,cellsize)&lt;br /&gt;
           if coff eq 0 then coff = cellsize&lt;br /&gt;
           del memr(cell)&amp;lt;coff&amp;gt;&lt;br /&gt;
&lt;br /&gt;
           if beg eq temp then beg = 0&lt;br /&gt;
           if beg gt temp then beg -= 1&lt;br /&gt;
           if fin eq temp then fin = 0&lt;br /&gt;
           if fin gt temp then fin -= 1&lt;br /&gt;
           for xx = dcount(krj&amp;lt;1&amp;gt;,vm) to 1 step -1&lt;br /&gt;
              begin case&lt;br /&gt;
                 case krj&amp;lt;2,xx&amp;gt; gt temp ; krj&amp;lt;2,xx&amp;gt; -= 1&lt;br /&gt;
                 case krj&amp;lt;2,xx&amp;gt; eq temp&lt;br /&gt;
                    del krj&amp;lt;1,xx&amp;gt; ; del krj&amp;lt;2,xx&amp;gt; ; krj&amp;lt;3&amp;gt; -= 1&lt;br /&gt;
              end case&lt;br /&gt;
           next xx&lt;br /&gt;
        next here&lt;br /&gt;
        test = &#039;&#039;&lt;br /&gt;
        gosub reset.record&lt;br /&gt;
        here = dusk - numb&lt;br /&gt;
     end else&lt;br /&gt;
        here = dusk&lt;br /&gt;
     end&lt;br /&gt;
     if dawn ne dusk then&lt;br /&gt;
        if here lt last&lt;br /&gt;
           then crt &#039;At line &#039;:here:&#039;.&#039;&lt;br /&gt;
           else crt &#039;Bottom at &#039;:here:&#039;.&#039;&lt;br /&gt;
     end&lt;br /&gt;
     if not(numb) then&lt;br /&gt;
        if cfrom eq &#039;N&#039; then&lt;br /&gt;
           crt &#039;No lines (in &#039;:dawn:&#039;-&#039;:dusk:&#039;) NOT matching pattern &amp;quot;&#039;:patt:&#039;&amp;quot;&#039;&lt;br /&gt;
        end else crt &#039;No lines (in &#039;:dawn:&#039;-&#039;:dusk:&#039;) matching pattern &amp;quot;&#039;:patt:&#039;&amp;quot;&#039;&lt;br /&gt;
     end else&lt;br /&gt;
        begin case&lt;br /&gt;
           case cfrom[1,1] eq &#039;D&#039;&lt;br /&gt;
              crt &#039;Deleted &#039;:numb:&#039; lines matching &amp;quot;&#039;:patt:&#039;&amp;quot;&#039;&lt;br /&gt;
           case cfrom eq &#039;L&#039;&lt;br /&gt;
              crt &#039;Found &#039;:numb:&#039; lines matching &amp;quot;&#039;:patt:&#039;&amp;quot;&#039;&lt;br /&gt;
           case cfrom eq &#039;N&#039;&lt;br /&gt;
              crt &#039;Found &#039;:numb:&#039; lines NOT matching &amp;quot;&#039;:patt:&#039;&amp;quot;&#039;&lt;br /&gt;
        end case&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
     if chng then&lt;br /&gt;
        gosub reset.record&lt;br /&gt;
        begin case&lt;br /&gt;
           case dawn eq dusk&lt;br /&gt;
              return&lt;br /&gt;
           case cfrom eq &#039;A&#039;&lt;br /&gt;
              crt &#039;&amp;quot;&#039;:cto:&#039;&amp;quot; appended to &#039;:&lt;br /&gt;
           case cfrom[1,1] eq &#039;D&#039;&lt;br /&gt;
              crt &#039;Deleted &#039;:&lt;br /&gt;
           case cfrom eq &#039;P&#039;&lt;br /&gt;
              crt &#039;&amp;quot;&#039;:cto:&#039;&amp;quot; prefixed to &#039;:&lt;br /&gt;
           case cfrom eq &#039;R&#039;&lt;br /&gt;
              crt &#039;Replaced with &amp;quot;%&amp;quot;, &#039;:&lt;br /&gt;
           case cfrom eq &#039;L&#039; or cfrom eq &#039;N&#039;&lt;br /&gt;
           case cols eq colf&lt;br /&gt;
              crt &#039;Element &#039;:cols:&#039; changed to &amp;quot;&#039;:cto:&#039;&amp;quot; in &#039;:&lt;br /&gt;
           case cols&lt;br /&gt;
              crt &#039;Element &#039;:cols:&#039;-&#039;:colf:&#039; changed to &amp;quot;&#039;:cto:&#039;&amp;quot; in &#039;:&lt;br /&gt;
        end case&lt;br /&gt;
        if chng eq 1&lt;br /&gt;
           then crt &#039;1 line matching &amp;quot;&#039;:patt:&#039;&amp;quot;&#039;&lt;br /&gt;
           else crt chng:&#039; lines matching &amp;quot;&#039;:patt:&#039;&amp;quot;&#039;&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
parse.pattern:&lt;br /&gt;
* bits&amp;lt;1&amp;gt; are the pattern pieces&lt;br /&gt;
*     &amp;lt;2&amp;gt; quote or &#039;p&#039;attern flag&lt;br /&gt;
*     &amp;lt;3&amp;gt; partial patterns&lt;br /&gt;
     cntr = 1&lt;br /&gt;
     bits = &#039;&#039;&lt;br /&gt;
     flag = &#039;&#039;&lt;br /&gt;
     good = true&lt;br /&gt;
     first = true&lt;br /&gt;
     xxno = len(patt)&lt;br /&gt;
     gosub quote.pattern&lt;br /&gt;
     for xx = 1 to xxno&lt;br /&gt;
        bit = patt[xx,1]&lt;br /&gt;
        begin case&lt;br /&gt;
           case bit = flag&lt;br /&gt;
              flag = &#039;&#039;&lt;br /&gt;
              first = true&lt;br /&gt;
              cntr = cntr + 1&lt;br /&gt;
           case flag ne &#039;&#039;&lt;br /&gt;
              bits&amp;lt;1,cntr&amp;gt; = bits&amp;lt;1,cntr&amp;gt;:bit&lt;br /&gt;
           case index(qt,bit,1)&lt;br /&gt;
              bits&amp;lt;2,cntr&amp;gt; = bit&lt;br /&gt;
              flag = bit&lt;br /&gt;
           case first&lt;br /&gt;
              if not(bit matches &#039;1n&#039;) then&lt;br /&gt;
                 good = false&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
              first = false&lt;br /&gt;
              bits&amp;lt;2,cntr&amp;gt; = &#039;p&#039;&lt;br /&gt;
              bits&amp;lt;1,cntr&amp;gt; = bits&amp;lt;1,cntr&amp;gt;:bit&lt;br /&gt;
              if bit eq &#039;0&#039; then bits&amp;lt;3,cntr&amp;gt; = patt[xx+2,xxno]&lt;br /&gt;
           case 1&lt;br /&gt;
              if not(index(&#039;AaNnXx&#039;,bit,1)) then&lt;br /&gt;
                 good = false&lt;br /&gt;
                 return&lt;br /&gt;
              end&lt;br /&gt;
              bits&amp;lt;1,cntr&amp;gt; = bits&amp;lt;1,cntr&amp;gt;:oconv(bit,&#039;mcu&#039;)&lt;br /&gt;
              first = true&lt;br /&gt;
              cntr = cntr + 1&lt;br /&gt;
        end case&lt;br /&gt;
     next xx&lt;br /&gt;
     cntr = cntr - 1&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
quote.pattern:&lt;br /&gt;
* Adds quotes to the pattern if required&lt;br /&gt;
* If they use any quotes at all, we don&#039;t do a thing&lt;br /&gt;
     if index(patt,&#039;&amp;quot;&#039;,1) then return&lt;br /&gt;
     if index(patt,&#039;\&#039;,1) then return&lt;br /&gt;
     if index(patt,&amp;quot;&#039;&amp;quot;,1) then return&lt;br /&gt;
     xx = 1&lt;br /&gt;
     temp = &#039;&#039;&lt;br /&gt;
     test = &#039;&#039;&lt;br /&gt;
     loop&lt;br /&gt;
        left = patt[xx,2]:&#039;*&#039;&lt;br /&gt;
        if index(&#039;0123456789&#039;,left[1,1],1) and index(&#039;AaNnXx&#039;,left[2,1],1) then&lt;br /&gt;
           if test ne &#039;&#039; then temp := &amp;quot;&#039;&amp;quot;:test:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
           temp := patt[xx,2]&lt;br /&gt;
           test = &#039;&#039;&lt;br /&gt;
           xx += 1&lt;br /&gt;
        end else test := patt[xx,1]&lt;br /&gt;
     until xx gt xxno do&lt;br /&gt;
        xx += 1&lt;br /&gt;
     repeat&lt;br /&gt;
     patt = temp&lt;br /&gt;
     if test ne &#039;&#039; then patt := &amp;quot;&#039;&amp;quot;:test:&amp;quot;&#039;&amp;quot;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
parse.temp:&lt;br /&gt;
     temp = &#039;&#039;&lt;br /&gt;
     posn = 1&lt;br /&gt;
     xxno = len(line)&lt;br /&gt;
     for xx = 1 to cntr&lt;br /&gt;
        what = bits&amp;lt;1,xx&amp;gt;&lt;br /&gt;
        type = bits&amp;lt;2,xx&amp;gt;&lt;br /&gt;
        nmbr = what[1,1]&lt;br /&gt;
        begin case&lt;br /&gt;
           case xx gt colf&lt;br /&gt;
              temp&amp;lt;xx&amp;gt; = line[posn,xxno]&lt;br /&gt;
              xx = cntr&lt;br /&gt;
           case type ne &#039;p&#039;&lt;br /&gt;
              temp&amp;lt;xx&amp;gt; = line[posn,len(what)]&lt;br /&gt;
              posn = posn + len(what)&lt;br /&gt;
           case xx = cntr&lt;br /&gt;
              temp&amp;lt;xx&amp;gt; = line[posn,xxno]&lt;br /&gt;
           case nmbr = &#039;0&#039;&lt;br /&gt;
* look to match the rest of the line with the partial pattern&lt;br /&gt;
              test = bits&amp;lt;3,xx&amp;gt;&lt;br /&gt;
              yy = posn&lt;br /&gt;
              bit = &#039;&#039;&lt;br /&gt;
              loop&lt;br /&gt;
              until yy gt xxno do&lt;br /&gt;
                 chit = line[yy,xxno]&lt;br /&gt;
              until chit matches test do&lt;br /&gt;
                 bit := chit[1,1]&lt;br /&gt;
                 yy += 1&lt;br /&gt;
              repeat&lt;br /&gt;
              posn += len(bit)&lt;br /&gt;
              temp&amp;lt;xx&amp;gt; = bit&lt;br /&gt;
           case 1&lt;br /&gt;
              bit = line[posn,nmbr]&lt;br /&gt;
              posn += len(bit)&lt;br /&gt;
              temp&amp;lt;xx&amp;gt; = bit&lt;br /&gt;
        end case&lt;br /&gt;
     next xx&lt;br /&gt;
     temp&amp;lt;cols&amp;gt; = cto&lt;br /&gt;
     for xx = cols+1 to colf&lt;br /&gt;
        temp = delete(temp,cols+1)&lt;br /&gt;
     next xx&lt;br /&gt;
     convert am to &#039;&#039; in temp&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
get.lines:&lt;br /&gt;
     stub = &#039;&amp;quot;Q&amp;quot;uit, or starting line &amp;gt; &#039;&lt;br /&gt;
     pick = 1&lt;br /&gt;
     gosub get.rope; dawn = rope&lt;br /&gt;
     dawn = upcase(trim(dawn))&lt;br /&gt;
     if dawn eq &#039;&#039; then dawn = &#039;Q&#039;&lt;br /&gt;
     if dawn[1,1] eq &#039;Q&#039; then temp = false ; crt ; return&lt;br /&gt;
     if not(dawn matches &#039;1N0N&#039;) then&lt;br /&gt;
        crt&lt;br /&gt;
        crt &#039;Nothing done - starting and ending lines must be numeric.&#039;&lt;br /&gt;
        gosub bad.comd ; return&lt;br /&gt;
     end&lt;br /&gt;
     if dawn gt dcount(temp,am) then&lt;br /&gt;
        crt&lt;br /&gt;
        crt &#039;Nothing done - record does not have that many lines.&#039;&lt;br /&gt;
        gosub bad.comd ; return&lt;br /&gt;
     end&lt;br /&gt;
     stub = stub:dawn:&#039; &#039;:&#039;, ending line &amp;gt; &#039;&lt;br /&gt;
     pick = dcount(temp,am)&lt;br /&gt;
     gosub get.rope; dusk = rope&lt;br /&gt;
     dusk = upcase(trim(dusk))&lt;br /&gt;
     if dusk eq &#039;&#039; then dusk = &#039;Q&#039;&lt;br /&gt;
     if dusk[1,1] eq &#039;Q&#039; then temp = false ; crt ; return&lt;br /&gt;
     if not(dusk matches &#039;1N0N&#039;) then&lt;br /&gt;
        crt&lt;br /&gt;
        crt &#039;Nothing done - starting and ending lines must be numeric.&#039;&lt;br /&gt;
        gosub bad.comd ; return&lt;br /&gt;
     end&lt;br /&gt;
     if dusk gt dcount(temp,am) then&lt;br /&gt;
        dusk = dcount(temp,am)&lt;br /&gt;
        crt begn:&#039;File is &#039;:onam:&#039;: &amp;quot;Q&amp;quot;uit, or starting line &amp;gt; &#039;:dawn:&#039;, &#039;:dusk:&lt;br /&gt;
     end&lt;br /&gt;
     temp = field(temp,am,dawn,dusk-dawn+1)&lt;br /&gt;
     crt&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
parse.bite:&lt;br /&gt;
     temp = &#039;&#039;&lt;br /&gt;
     loop&lt;br /&gt;
     while bite ne &#039;&#039; do&lt;br /&gt;
        bite = trimf(bite)&lt;br /&gt;
        xx = fold&lt;br /&gt;
        if count(bite[1,xx],&#039; &#039;) and trim(bite[xx+1,1]) ne &#039;&#039; then&lt;br /&gt;
           loop&lt;br /&gt;
           until trim(bite[xx,1]) eq &#039;&#039; do&lt;br /&gt;
              xx -=1&lt;br /&gt;
           repeat&lt;br /&gt;
           temp&amp;lt;-1&amp;gt; = bite[1,xx-1]&lt;br /&gt;
        end else&lt;br /&gt;
           temp&amp;lt;-1&amp;gt; = bite[1,xx]&lt;br /&gt;
        end&lt;br /&gt;
        bite = bite[xx+1,len(bite)]&lt;br /&gt;
     repeat&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
show.help:&lt;br /&gt;
     crt&lt;br /&gt;
     if help eq &#039;&#039; then&lt;br /&gt;
        help = &#039;&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039; &#039;:verb:&#039; version &#039;:help.def&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039; This program can be called with the following formats:&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot; &amp;quot;:verb:&amp;quot;               file and record id&#039;s are prompted for&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot; &amp;quot;:verb:&amp;quot; file          record id&#039;s are prompted for&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot; &amp;quot;:verb:&amp;quot; file id       &amp;quot;:view:&amp;quot; the record &#039;id&#039; in &#039;file&#039;&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot; &amp;quot;:verb:&amp;quot; file id id... &amp;quot;:view:&amp;quot; multiple records in &#039;file&#039;&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot; &amp;quot;:verb:&amp;quot; file *        &amp;quot;:view:&amp;quot; all records in &#039;file&#039;&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot; SELECT            may precede &#039;&amp;quot;:verb:&amp;quot; file&#039; command&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039; Special ASCII characters may be entered as:&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;    ^nnn  where nnn is the decimal character code (like ^027)&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;    ^     will enter a single UP ARROW character.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039; The following commands may be used in the Editor:&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;A#           - Do the last Append command again for # lines.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;A# any       - Append &#039;any&#039; to # lines (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;B            + Set the current line pointer to the BOTTOM line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;B# any       - BREAK # lines (default 1) after string &#039;any&#039; into two lines.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;BC# posn     = Break Column - Break # lines (default 1) after posn into two.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;BCD# posn    = Break Column and Discard the second part.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;BCK# posn    = Break Column and Keep only the second part.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;BCR# posn    = Break Column and Reverse the order of the two parts.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;BCS# posn    = Break Column and Swap the parts about the character at posn.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;BD# any      - BREAK after string &#039;any&#039; and Discard the second part.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;BK# any      - BREAK after string &#039;any&#039; and Keep only the second part.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;BR# any      - BREAK after string &#039;any&#039; and Reverse the order of the two parts.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;BS# any      - BREAK after string &#039;any&#039; and Swap the parts about &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;BLEACH ON/OFF# Switch colourisation flag.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;BLOCK ON/OFF + Switch block operation confirmation flag.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               If neither ON nor OFF is used, then toggle BLOCK flag.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;C            - Do the last &#039;CHANGE&#039; command again.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;C///         - CHANGE one or more lines. Full formats is:&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               C[#]/from/to/[G][S]&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               where    / - is any delimiter character.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                        # - number of lines to CHANGE (default 1).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                     from - is the character string to be replaced.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                       to - is the character string to substitute.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;                        G - &#039;G&#039;lobal flag - CHANGE all instances in line.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;                        S - &#039;S&#039;how flag - display all changes made.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;CASE ON/OFF  + Switch CASE flag for FL, FLA, L, LA, LN, LNA commands.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               If neither ON nor OFF is used, then toggle CASE flag.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               OFF means that the commands are not case sensitive.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;CAT          - Synonym for &#039;J&#039;oin.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;CD           + Show or change the command delimiter.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               (this is the input for a blank line).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;CLEAR        # Clear the kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;CM///        - ChangeMatch one or more lines. Full formats is:&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               CM[#]/pattern[/range/to]&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               where      / - is any delimiter character.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                          # - number of lines to CHANGE (default 1).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                    pattern - is the pattern match for the line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                         to - is the character string to substitute/add.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                      range - Can be numeric, which field(s) to change,&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;                           or &#039;A&#039;ppend or &#039;P&#039;refix to the line,&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;                           or &#039;D&#039;elete, &#039;R&#039;eplace, &#039;L&#039;ocate (default) the line.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               EG &#039;CM/6X&#039; will scan to the line matching &#039;6X&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               Also; &#039;N&#039;ot - locate the next non-matching line.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;COL          + Display relative COLUMN POSITIONS on the Terminal.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;COPY         # Copy the predefined block to the kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;COPY#        # Copy the next # lines to the kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;COPYx/y      # Copy x lines starting at line y to the kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;COPY/x/y     # Copy lines from x to y inclusive to the kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;COUNT#/any   + Count of &#039;any&#039; in next # lines (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;CRT xxxx     - Inserts a line CRT &#039;xxxx = &#039;:xxxx&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               Use double quote or backslash as delimiter to change quotes.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;CUT          = Move the predefined block to the kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;CUT#         = Move the next # lines to the kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;CUTx/y       = Move x lines starting at line y to kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;CUT/x/y      = Move lines from x to y inclusive to kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;D            + Display the current line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;DE           - DELETE the current line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;DE#          - DELETE &#039;#&#039; lines (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;DE#/any      - DELETE as above, but only if the line contains &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;DISPLAY xxxx - Inserts a line DISPLAY &#039;xxxx = &#039;:xxxx&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               Just like CRT, handy to distinguish debug code.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;DROP         - Remove the predefined block.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;DTX any      + Convert decimal string &#039;any&#039; to hexadecimal and display it.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;DUP          - DUPLICATE the current line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;DUP#         - DUPLICATE the current line &#039;#&#039; times.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EC           + Edit a called subroutine in this file.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;ECS          # Edit the command stack.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EF#          + Edit fields delimited by CHAR(#) as lines.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EI           + Edit the included code.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EIT          + Edit I-type (not just a split on semi-colon).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EK           # Edit the kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EPR          + Edit the prestored commands.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EPR#         # Edit prestored commqnd #.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;ESS          # Edit Search Stack.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;ESV          + Edit subvalues as 1ines.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;ET           # Edit the line tabs.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EV           + Edit multivalues as lines.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EW           + Edit words as lines.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EXIT (EX)    + QUIT - EXIT the program.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;EXITK (EXK)  + QUITKill - EXIT the program, abandon any active SELECT list.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FD           - DELETE the entire record from the file.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FI           - FILE the record. You can also process it.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               FIB = BASIC, FIC = CATALOG, FIR = RUN&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               You can have up to three processes (EG. FIBCR).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               You can modify BASIC with D for DEBUGGING (EG. FIBD).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               You can modify CATALOG with L for LOCAL (EG. FICL).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FILE         - Synonym for SAVE.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FL           + Find the next Label.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;FL any       + Find the label &#039;any&#039; or matching pattern &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FL#          + Find (display) the labels in next # lines.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FLA          + Find label above this line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FM           + Find Matching logic by position.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FMA          + Find Matching logic by position above this line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FOLD/length  - Split current line (on blanks if possible) to fit width.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;FORMAT (FOR) + FORMAT a BASIC program to show logical structure by&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               indenting. This has the following keywords;&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               &#039;-Mx&#039; = Set margin to x.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               &#039;-Iy&#039; = Set Indentation to y.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               &#039;-A&#039; = Align comments with code.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               &#039;-N&#039; = No CASE indentation.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               &#039;-C&#039; = Compress - same as &#039;-M0 -I1 -A -N&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;G#           + GO TO line &#039;#&#039; (&#039;G&#039; is optional).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;HELP (H)     + Prompt user to display HELP information on the Terminal.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;HELP any     + Display HELP information on Terminal for &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;HELP NEW     + Display HELP information on new features.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;HEX          + Displays the current line in hexadecimal.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;I            - INSERT new lines AFTER the current line. Prompt for&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               successive lines. INPUT until NULL input. An INPUT line&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               of a single space will store an empty line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;I any        - INSERT (INPUT) the line &#039;any&#039; AFTER the current line.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;I#/any       - INSERT # lines of &#039;any&#039; AFTER the current line.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;IC any       - IConv the line using the conversion &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;IN command   - Insert the results of the command AFTER the current line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               It is not a good idea to use a command requiring input.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;J#/any       - Join next &#039;#&#039; lines (default 1), separated by &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;KEEP name    # Copy the record &#039;name&#039; into the kept buffer.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               line #&#039;s will be prompted.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;KEEP f name  # Copy the record &#039;name&#039; from file &#039;f&#039; into the kept buffer,&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               line #&#039;s will be prompted.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;KEEPA        # KEEPAll - KEEP without line # prompting.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;KEPT (K)     # Display the kept buffer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;L            + Repeat the last &#039;LOCATE&#039; command (L, LA, LN, or LNA).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;L any        + LOCATE the next line that contains the string &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;L#/any/10-20 + LOCATE in next # lines those with &#039;any&#039; in columns 10 to 20.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               So &#039;L#&#039; effectively lists # lines.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;L#!any!THING # LOCATE in next # lines those with &#039;any&#039; OR &#039;THING&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;L#&amp;amp;any&amp;amp;THING # LOCATE in next # lines those with &#039;any&#039; AND &#039;THING&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               ! and &amp;amp; work this way for LA, LN, and LNA commands too.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;LA#/any/1-20 + Locate lines above this one (reverse order).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;LC#          - Change &#039;#&#039; lines to lower case (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;LC# any        Comments and quoted strings are unchanged.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;LL#/length   + Show lines &#039;length&#039; or longer (null &#039;#&#039; is a search).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;LN#/any/1-20 + LOCATE NOT - line without &#039;any&#039; in columns 10 to 20.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;LNA#/an/1-20 + LOCATE line above this without &#039;an&#039; in columns 1 to 20.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;LOAD name    - LOAD the record &#039;name&#039; from the current FILE,&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               line #&#039;s will be prompted.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;LOAD f name  - LOAD the record &#039;name&#039; from file &#039;f&#039;,&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               line #&#039;s will be prompted.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;LOADA        - LOADAll - LOAD without line # prompting.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;LD           - Synonym for LOAD.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;LDA          - Synonym for LOADA.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;M pattern    + Search for a line matching the pattern.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;MACRO#       + Toggle macro recording into #th PRESTORE command.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;MERGE (ME)   = Merge a copy of the predefined block after the current line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;MERGEx/y     = Merge x lines starting at line y.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;MERGE/x/y    = Merge lines starting at x to line y inclusive.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;MOVE (MV)    - Move the predefined block to after the current line.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;MOVEx/y      = Move the x lines starting at line y.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;MOVE/x/y     = Move the lines starting at x to line y inclusive.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;NUM          + Toggle the line numbering.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;NULL/symbol  + Change the null line input for &#039;I&#039; to &#039;symbol&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;OC# any      - OConv &#039;#&#039; lines using the conversion &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;OOPS         - RESTORE the record to the condition prior to last change.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;OUT#         # Outline (labels, gotos, gosubs) for &#039;#&#039; lines (default all).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;OUT# CEPS      Show Calls, Executes, Performs, and caSe also (* for all).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;P            + PRINT on Terminal one page worth of lines.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;P#           + PRINT on Terminal &#039;#&#039; lines starting with the current line.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;PA#          + PRINT the current line and the prior &#039;#&#039; lines,&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               do not change the current line pointer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;PASTE        = Paste the kept buffer after the current line&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;PASTE name   = Copy the kept buffer under the specified &#039;name&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;PASTE f name = Copy the kept buffer as record &#039;name&#039; in file &#039;f&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;PE           + Page Edit mode.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;PL#          + PRINT the current line and the next &#039;#&#039; lines,&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               do not change the current line pointer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;PP#          + PAGE.PRINT a window of &#039;#&#039; lines around the current line,&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               do not change the current line pointer.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;PR           + Show the PRESTORE commands.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;PR#          + Run the #th PRESTORE command.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;PR#/any      + Change the #th PRESTORE command.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               where / - is any delimiter character which will also be&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                         used as the command separator.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;QUIT (Q)     + QUIT - EXIT the program.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;QUITK (QK)   + QuitKill - EXIT the program, abandon any active SELECT list.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;R            - Replace the line with prompted for text.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;R any        - REPLACE this line with &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;R#/any       - REPLACE # lines with &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;R///         - CHANGE one or more lines (same as C/// command).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;RA           = Show last 20 &#039;CHANGE&#039; commands.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;RA#          = Repeat #th &#039;CHANGE&#039; command.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;RELEASE      + RELEASE the update record LOCK for this file.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;S            - Show last 20 &#039;LOCATE&#039; commands.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;S#           - Repeat #th &#039;LOCATE&#039; command.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;SAVE         - SAVE a copy of this record under the original name.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;SAVE name    - SAVE a copy of this record under the specified &#039;name&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;SAVE f name  - SAVE a copy of this record as record &#039;name&#039; in file &#039;f&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;SEQ#////     - Build a sequence. Format is:&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               SEQ#/from/base/inc/cols&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               where    / - is any delimiter character.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                        # - number of lines to CHANGE (default 1).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                     from - is the character string to be replaced.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                     base - is the start number (defaults to 1).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                      inc - is the increment (defaults to 1).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                     cols - restricts the change to a column range.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;SHOW ON/OFF  + toggle overriding &#039;S&#039;how flag for &#039;C&#039; command.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               OFF won&#039;t show more than a page of changes.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               If neither ON nor OFF is used, then toggle SHOW flag.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;SORT seq     - Sort the predefined block (seq defaults to &#039;AL&#039;).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;SORTU seq    # Sort unique predefined block (&#039;AL&#039; default seq).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;SPACE ON/OFF + Switch SPACE flag for L, LA, LN, LNA commands.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               If neither ON nor OFF is used, then toggle SPACE flag.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               OFF means that the commands will ignore spaces and tabs.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;SPOOL        + SPOOL entire record to PRINTER.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;SPOOL#       + SPOOL &#039;#&#039; lines to the PRINTER.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;SPOOLHELP    + SPOOL the HELP listing to the default PRINTER.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;SPOUT#       # SPOO outline (labels, gotos, gosubs) for &#039;#&#039; lines (default all).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;SPOUT# CEPS    Show Calls, Executes, Performs, and caSe also (* for all).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;STAMP        - INSERT a &#039;last modified&#039; stamp into the record, which&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;               begins with a &#039;*&#039; (for BASIC &#039;comment&#039;), and contains the&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               account name, LOGIN name (if different from account name),&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               date and time. Used to mark when record was last changed.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;SV           - Synonym for SAVE.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;T            + Set current line to the TOP (before first line).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;TC#          - Change &#039;#&#039; lines to text or mixed case (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;TC# any        Comments and quoted strings are unchanged.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;TRIM#        - TRIM &#039;#&#039; lines (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;TRIM# a b    = TRIM &#039;#&#039; lines of character &#039;a&#039; with argument &#039;b&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;TRIMB#       - TRIMB &#039;#&#039; lines (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;TRIMF#       - TRIMF &#039;#&#039; lines (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;TRIPLE#/any  = Copy &#039;#&#039; lines (default 1) into three clones, joined by &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;TWIN#/any    = Copy &#039;#&#039; lines (default 1) into two clones, joined by &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;UC#          - Change &#039;#&#039; lines to upper case (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;UC# any        Comments and quoted strings are unchanged.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;UNLOAD       - Synonym for SAVE.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;V            + Version information.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;WHERE (W)    + Show the item and file being &#039;:view:&#039;ed.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;WM           + Show or change the word marker.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;X            + QuitKill - EXIT the program, abandon any active SELECT list.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;XEQ          - The XEQ command allows a user to execute any legal PERFORM&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                command from within the program. Upon completion of the&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;                command, control will be returned back to the program.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;XTD any      + Convert hexadecimal string &#039;any&#039; to decimal and display it.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;/any         + Same as L99999999/any - NOTE you are left at the bottom.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.A# any      + APPEND &#039;any&#039; to command &#039;#&#039; (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.C#///       + CHANGE stack command &#039;#&#039; (default 1). Syntax is like &#039;C&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.D#          + DELETE stack command &#039;#&#039; (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.I# any      + INSERT &#039;any&#039; at stack position &#039;#&#039; (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.L#          + LIST on the Terminal the last &#039;#&#039; stack commands.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.R#          + RECALL (copy) command &#039;#&#039; to stack position 1.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.S# n m      + SAVE stack n to m as prestore &#039;#&#039; (all default to 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.U#          # UPCASE stack command &#039;#&#039; (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.UL#         # lower case stack command &#039;#&#039; (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.UT#         # text case stack command &#039;#&#039; (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;.X#          + EXECUTE stack command &#039;#&#039; (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               The command will be put in stack position 1.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;+#           + Advance current line pointer by &#039;#&#039; lines (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;-#           + Back up current line pointer by &#039;#&#039; lines (default 1).&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;\            # Set a line tag with default label like &#039;T#&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;\any         # Set a line tag labelled &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;\\           # Clear the line tags.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;]any         # Go to the line tag &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;[any         # Go to the line tag &#039;any&#039;.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;]            # Go to the next line tag.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;[            # Go to the previous line tag.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;]]           # Display the line tags.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;[[           # Display the line tags.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &amp;quot;#            + Set the current line pointer to the &#039;#&#039; line.&amp;quot;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;&amp;lt;#           + Sets the starting block pointer to # (current line default).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;&amp;gt;#           + Sets the ending block pointer to # (current line default).&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;&amp;lt;&amp;gt;# #        + Set both block pointers at the same time.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;^            + Switch UP ARROW on/off to show non-printing characters as&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;               ^nnn where nnn is the decimal equivalent of ASCII code.&#039;&lt;br /&gt;
        help&amp;lt;-1&amp;gt; = &#039;?            + Show various parameters - easier to use than explain.&#039;&lt;br /&gt;
     end&lt;br /&gt;
     rest = trim(upcase(rest))&lt;br /&gt;
     if rest eq am then&lt;br /&gt;
        hard = true&lt;br /&gt;
        rest = &#039;&#039;&lt;br /&gt;
     end else hard = false&lt;br /&gt;
     disp = &#039;&#039;&lt;br /&gt;
     stub = &#039;&#039;&lt;br /&gt;
     if rest eq &#039;&#039; then flag = true else flag = false&lt;br /&gt;
     if rest eq &#039;NEW&#039; then disp = &#039;New Features&#039;:am&lt;br /&gt;
     good = false&lt;br /&gt;
     xxno = dcount(help,am)&lt;br /&gt;
     for xx = 1 to xxno&lt;br /&gt;
        temp = help&amp;lt;xx&amp;gt;&lt;br /&gt;
        bite = temp[1,len(rest)]&lt;br /&gt;
        bit = temp[14,1]&lt;br /&gt;
        if index(&#039;-+=#&#039;,bit,1)&lt;br /&gt;
           then temp = temp[1,13]:&#039;-&#039;:temp[15,huge]&lt;br /&gt;
           else bit = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
        if bit ne &#039;&#039; then&lt;br /&gt;
           flag = false&lt;br /&gt;
           if bit eq &#039;#&#039; and rest eq &#039;NEW&#039;               then flag = true&lt;br /&gt;
           if (bit eq &#039;#&#039; or bit eq &#039;+&#039;) and rest eq &#039;&#039;  then flag = true&lt;br /&gt;
           if not(viewflag) then&lt;br /&gt;
              if bit eq &#039;eq&#039; and rest eq &#039;NEW&#039;            then flag = true&lt;br /&gt;
              if bit eq &#039;=&#039; or bit eq &#039;-&#039; and rest eq &#039;&#039; then flag = true&lt;br /&gt;
           end&lt;br /&gt;
        end&lt;br /&gt;
        if not(flag) and rest ne &#039;&#039; and bite eq rest then&lt;br /&gt;
           if bit eq &#039;#&#039; or bit eq &#039;+&#039; then flag = true&lt;br /&gt;
           if not(viewflag) then&lt;br /&gt;
              if bit eq &#039;=&#039; or bit eq &#039;-&#039; then flag = true&lt;br /&gt;
           end&lt;br /&gt;
        end&lt;br /&gt;
        if flag then&lt;br /&gt;
           disp&amp;lt;-1&amp;gt; = temp&lt;br /&gt;
           good = true&lt;br /&gt;
        end&lt;br /&gt;
     next xx&lt;br /&gt;
&lt;br /&gt;
     if not(good) then&lt;br /&gt;
        disp := am&lt;br /&gt;
        disp&amp;lt;-1&amp;gt; = &#039;No explanation of &amp;quot;&#039;:rest:&#039;&amp;quot; is available.&#039;&lt;br /&gt;
        disp&amp;lt;-1&amp;gt; = &#039;For a list of words that have explanations, type &amp;quot;HELP&amp;quot;.&#039;&lt;br /&gt;
        disp := am&lt;br /&gt;
     end&lt;br /&gt;
     if hard then gosub print.disp else gosub show.disp&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
show.disp:&lt;br /&gt;
     write disp on voc,&#039;&amp;amp;DISP.&#039;:whom&lt;br /&gt;
     if stub eq &#039;&#039; then stub = &#039;Press return to continue showing explanation, Q to quit&#039;&lt;br /&gt;
     xxno = dcount(disp,am)&lt;br /&gt;
     pg = 0&lt;br /&gt;
     for xx = 1 to xxno&lt;br /&gt;
        pg += 1&lt;br /&gt;
        if pg ge system(3) then&lt;br /&gt;
           loop&lt;br /&gt;
              rlen = 1&lt;br /&gt;
              gosub get.rope; answ = rope&lt;br /&gt;
              crt begn:ceol:&lt;br /&gt;
              answ = trim(upcase(answ))[1,1]&lt;br /&gt;
           until index(&#039;QT-&#039;,answ,1) do&lt;br /&gt;
           repeat&lt;br /&gt;
           if answ eq &#039;Q&#039; then return&lt;br /&gt;
           if answ eq &#039;T&#039; then xx = 1&lt;br /&gt;
           if answ eq &#039;-&#039; then&lt;br /&gt;
              xx -= 2*(system(3)-1)&lt;br /&gt;
              if xx lt 1 then xx = 1&lt;br /&gt;
           end&lt;br /&gt;
           pg = 1&lt;br /&gt;
        end&lt;br /&gt;
        crt disp&amp;lt;xx&amp;gt;&lt;br /&gt;
     next xx&lt;br /&gt;
     disp = &#039;&#039;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
print.disp:&lt;br /&gt;
     printer on&lt;br /&gt;
     heading upcase(verb):&amp;quot; help file    &amp;quot;:timedate():&amp;quot;&#039;LL&#039;&amp;quot;&lt;br /&gt;
     xxno = dcount(disp,am)&lt;br /&gt;
     for xx = 1 to xxno&lt;br /&gt;
        print disp&amp;lt;xx&amp;gt;&lt;br /&gt;
     next xx&lt;br /&gt;
     printer close&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
get.page.comd:&lt;br /&gt;
     gosub get.keyc&lt;br /&gt;
do.page.comd:&lt;br /&gt;
     locate(keyc,keys;cpos) then cpos = acts&amp;lt;cpos&amp;gt; else cpos = 0&lt;br /&gt;
     begin case&lt;br /&gt;
        case cpos eq uarr ;* up key&lt;br /&gt;
           if here le 1 then crt bell:; return&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           here -= 1&lt;br /&gt;
           if prow le 1 then&lt;br /&gt;
              ptop = ptop - botl&lt;br /&gt;
              if ptop lt 1 then ptop = 1&lt;br /&gt;
              gosub disp.page&lt;br /&gt;
           end&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
        case cpos eq darr ;* down key&lt;br /&gt;
           if here ge last then crt bell:; return&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           here += 1&lt;br /&gt;
           if prow ge botl then&lt;br /&gt;
              ptop = ptop + botl&lt;br /&gt;
              if ptop ge last then ptop = last - botl + 1&lt;br /&gt;
              if ptop le 1 then ptop = 1&lt;br /&gt;
              gosub display.page&lt;br /&gt;
           end&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
        case cpos eq larr ;* left key&lt;br /&gt;
           if pchr le 1 then crt bell:; return&lt;br /&gt;
           pchr -= 1&lt;br /&gt;
           if pchr lt ppos then&lt;br /&gt;
              gosub check.page&lt;br /&gt;
              gosub disp.page&lt;br /&gt;
           end&lt;br /&gt;
        case cpos eq rarr ;* right key&lt;br /&gt;
           pchr += 1&lt;br /&gt;
           if pchr-ppos ge span then&lt;br /&gt;
              gosub check.page&lt;br /&gt;
              gosub disp.page&lt;br /&gt;
           end&lt;br /&gt;
        case cpos eq upag ;* page up key&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           ptop -= botl&lt;br /&gt;
           if ptop lt 1 then ptop = 1&lt;br /&gt;
           here -= botl&lt;br /&gt;
           if here lt 1 then here = 1&lt;br /&gt;
           pchr = 1&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
           gosub disp.page&lt;br /&gt;
        case cpos eq dpag ;* page down key&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           ptop = ptop + botl&lt;br /&gt;
           if ptop ge last then ptop = last - botl + 1&lt;br /&gt;
           here = here + botl&lt;br /&gt;
           if here gt last then here = last&lt;br /&gt;
           pchr = 1&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
           gosub disp.page&lt;br /&gt;
        case cpos eq lpag ;* start of line key&lt;br /&gt;
           pchr = 1&lt;br /&gt;
           if pchr lt ppos then gosub check.page; gosub disp.page&lt;br /&gt;
        case cpos eq rpag ;* end of line key&lt;br /&gt;
           pchr = len(temp)+1&lt;br /&gt;
           if pchr lt ppos then gosub check.page; gosub disp.page&lt;br /&gt;
           if pchr-ppos ge span then&lt;br /&gt;
              gosub check.page&lt;br /&gt;
              gosub disp.page&lt;br /&gt;
           end&lt;br /&gt;
        case cpos eq tpag ;* top page key&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           here = 1&lt;br /&gt;
           ptop = 1&lt;br /&gt;
           pchr = 1&lt;br /&gt;
           gosub disp.page&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
        case cpos eq bpag ;* bottom page key&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           here = last&lt;br /&gt;
           ptop = last - botl + 1&lt;br /&gt;
           gosub get.line&lt;br /&gt;
           pchr = len(line)+1&lt;br /&gt;
           gosub disp.page&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
        case cpos eq escp ;* escape key&lt;br /&gt;
           if this ne that then&lt;br /&gt;
              crt @(0,botl):ceol:revb:&#039;ABANDONING CHANGES&#039;:revf&lt;br /&gt;
           end&lt;br /&gt;
           this = that&lt;br /&gt;
           here = savl&amp;lt;1&amp;gt;&lt;br /&gt;
           gosub set.record&lt;br /&gt;
           mode = &#039;LINE&#039;&lt;br /&gt;
        case cpos eq phlp ;* help key&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           gosub page.help&lt;br /&gt;
        case cpos eq zoom ;* Go to line key&lt;br /&gt;
           crt bott:&lt;br /&gt;
           stub = &#039;Go to line :&#039;&lt;br /&gt;
           stay = pchr&lt;br /&gt;
           gosub get.rope; numb = trim(rope)&lt;br /&gt;
           pchr = stay&lt;br /&gt;
           crt bott:revb:&#039;Press &amp;lt;F1&amp;gt; for help.&#039;:revf:&lt;br /&gt;
           if not(numb matches &#039;1N0N&#039;) then numb = here&lt;br /&gt;
           if numb gt last then numb = last&lt;br /&gt;
           if numb eq here then return&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           here = numb&lt;br /&gt;
           ptop = here&lt;br /&gt;
           pchr = 1&lt;br /&gt;
           gosub disp.page&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
        case cpos eq skey ;* forward search&lt;br /&gt;
           crt bott:&lt;br /&gt;
           stub = &#039;Search: &#039;:&#039;&amp;gt; &#039;&lt;br /&gt;
           stay = pchr&lt;br /&gt;
           pick = lastfind; gosub get.rope; lastfind = rope&lt;br /&gt;
           pchr = stay&lt;br /&gt;
           crt bott:revb:&#039;Press &amp;lt;F1&amp;gt; for help.&#039;:revf:&lt;br /&gt;
           if lastfind eq &#039;&#039; then return&lt;br /&gt;
* is it in this line or the rest of the item?&lt;br /&gt;
           test = index(temp[pchr+1,huge],lastfind,1)&lt;br /&gt;
           save = here&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           if test then&lt;br /&gt;
              test += pchr&lt;br /&gt;
           end else&lt;br /&gt;
              dawn = here+1&lt;br /&gt;
              dusk = last&lt;br /&gt;
              for here = dawn to dusk until test&lt;br /&gt;
                 gosub get.line&lt;br /&gt;
                 test = index(line,lastfind,1)&lt;br /&gt;
                 if test then save = here&lt;br /&gt;
              next here&lt;br /&gt;
           end&lt;br /&gt;
           if test then&lt;br /&gt;
              if save lt ptop or save ge (ptop+botl) then ptop = save&lt;br /&gt;
              here = save&lt;br /&gt;
              pchr = test&lt;br /&gt;
              gosub disp.page&lt;br /&gt;
           end else here = save&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
        case cpos eq rkey ;* reverse search&lt;br /&gt;
           crt bott:&lt;br /&gt;
           stub = &#039;Search: &#039;:&#039;&amp;lt; &#039;&lt;br /&gt;
           stay = pchr&lt;br /&gt;
           pick = lastfind; gosub get.rope; lastfind = rope&lt;br /&gt;
           pchr = stay&lt;br /&gt;
           crt bott:revb:&#039;Press &amp;lt;F1&amp;gt; for help.&#039;:revf:&lt;br /&gt;
           if lastfind eq &#039;&#039; then return&lt;br /&gt;
* is it in this line before the cursor position or the rest of the item above?&lt;br /&gt;
           test = index(temp[1,pchr-1],lastfind,1)&lt;br /&gt;
           save = here&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           if not(test) then&lt;br /&gt;
              dawn = 1&lt;br /&gt;
              dusk = here-1&lt;br /&gt;
              for here = dusk to dawn step -1 until test&lt;br /&gt;
                 gosub get.line&lt;br /&gt;
                 what = count(line,lastfind)&lt;br /&gt;
                 if what then&lt;br /&gt;
                    test = index(line,lastfind,what)&lt;br /&gt;
                    save = here&lt;br /&gt;
                 end&lt;br /&gt;
              next here&lt;br /&gt;
           end&lt;br /&gt;
           if test then&lt;br /&gt;
              if save lt ptop or save ge (ptop+botl) then ptop = save&lt;br /&gt;
              here = save&lt;br /&gt;
              pchr = test&lt;br /&gt;
              gosub disp.page&lt;br /&gt;
           end else here = save&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
&lt;br /&gt;
        case not(sec.write.flg)&lt;br /&gt;
           crt bell:&lt;br /&gt;
        case cpos eq delc ;* delete character key&lt;br /&gt;
           if temp eq &#039;&#039; then return&lt;br /&gt;
           if pchr eq 1 then&lt;br /&gt;
              temp = temp[2,len(temp)]&lt;br /&gt;
           end else&lt;br /&gt;
              temp = temp[1,pchr-1]:temp[pchr+1,len(temp)]&lt;br /&gt;
           end&lt;br /&gt;
           crap = temp[pchr,span-pcol]&lt;br /&gt;
           convert badc to gudc in crap&lt;br /&gt;
           crt @(pcol,prow):ceol:crap:&lt;br /&gt;
        case cpos eq dell ;* delete line key&lt;br /&gt;
           del this&amp;lt;here&amp;gt;&lt;br /&gt;
           gosub set.record&lt;br /&gt;
           gosub disp.page&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
        case cpos eq delr ;* delete to end of line key&lt;br /&gt;
           if pchr gt len(temp) then&lt;br /&gt;
              if here ge last then crt bell:; return&lt;br /&gt;
              line = fmt(temp,&#039;l#&#039;:pchr-1):this&amp;lt;here+1&amp;gt;&lt;br /&gt;
              del this&amp;lt;here&amp;gt;&lt;br /&gt;
              this&amp;lt;here&amp;gt; = line&lt;br /&gt;
              gosub set.record&lt;br /&gt;
              gosub disp.page&lt;br /&gt;
              gosub get.line; temp = line&lt;br /&gt;
           end else&lt;br /&gt;
              temp = temp[1,pchr-1]&lt;br /&gt;
              this&amp;lt;here&amp;gt; = temp&lt;br /&gt;
              memr(cell)&amp;lt;lnum&amp;gt; = temp&lt;br /&gt;
              line = temp&lt;br /&gt;
              crt @(pcol,prow):ceol:&lt;br /&gt;
           end&lt;br /&gt;
        case cpos eq back ;* backspace key&lt;br /&gt;
           if pchr eq 1 then crt bell:; return&lt;br /&gt;
           pchr -= 1&lt;br /&gt;
           temp = temp[1,pchr-1]:temp[pchr+1,len(temp)]&lt;br /&gt;
           if pchr lt ppos then&lt;br /&gt;
              gosub check.page&lt;br /&gt;
              gosub disp.page&lt;br /&gt;
           end else&lt;br /&gt;
              pcol = rem(pchr-1,span)&lt;br /&gt;
              crt @(pcol,prow):ceol:&lt;br /&gt;
              crap = temp[pchr,span-pcol]&lt;br /&gt;
              convert badc to gudc in crap&lt;br /&gt;
              crt crap:&lt;br /&gt;
           end&lt;br /&gt;
        case cpos eq carr ;* carriage return key&lt;br /&gt;
           if pchr eq 1 then&lt;br /&gt;
              line = &#039;&#039;&lt;br /&gt;
           end else&lt;br /&gt;
              line = temp[1,pchr-1]&lt;br /&gt;
              temp = temp[pchr,len(temp)]&lt;br /&gt;
           end&lt;br /&gt;
           if lnum eq 0 then lnum = 1&lt;br /&gt;
           memr(cell)&amp;lt;lnum&amp;gt; = line&lt;br /&gt;
           last += 1&lt;br /&gt;
           lnum += 1&lt;br /&gt;
           line = temp&lt;br /&gt;
           gosub insert.line&lt;br /&gt;
           gosub reset.record&lt;br /&gt;
           here += 1&lt;br /&gt;
           pchr = 1&lt;br /&gt;
           if prow ge botl then&lt;br /&gt;
              ptop = ptop + botl&lt;br /&gt;
              if ptop ge last then ptop = last - botl + 1&lt;br /&gt;
              if ptop le 1 then ptop = 1&lt;br /&gt;
              gosub display.page&lt;br /&gt;
           end else gosub disp.page&lt;br /&gt;
           gosub get.line; temp = line&lt;br /&gt;
        case cpos eq togg ;* toggle mode key&lt;br /&gt;
           if mode&amp;lt;2&amp;gt; eq &#039;Ins&#039; then&lt;br /&gt;
              mode&amp;lt;2&amp;gt; = &#039;Rep&#039;&lt;br /&gt;
           end else mode&amp;lt;2&amp;gt; = &#039;Ins&#039;&lt;br /&gt;
        case cpos eq writ ;* write away data key&lt;br /&gt;
           gosub check.page&lt;br /&gt;
           mode = &#039;LINE&#039;&lt;br /&gt;
        case seq(keyc) lt 28 or seq(keyc) gt 127 or len(keyc) gt 1&lt;br /&gt;
           crt bell:&lt;br /&gt;
        case seq(keyc) eq 30 or seq(keyc) eq 31&lt;br /&gt;
           crt bell:&lt;br /&gt;
        case 1&lt;br /&gt;
           if seq(keyc) eq 28 then keyc = char(252)&lt;br /&gt;
           if seq(keyc) eq 29 then keyc = char(253)&lt;br /&gt;
           if pchr and len(temp) lt (pchr-1) then&lt;br /&gt;
              temp = temp:str(&#039; &#039;,pchr)&lt;br /&gt;
              temp = temp[1,pchr-1]&lt;br /&gt;
           end&lt;br /&gt;
           if mode&amp;lt;2&amp;gt; eq &#039;Ins&#039;&lt;br /&gt;
              then offset = pchr&lt;br /&gt;
              else offset = pchr+1&lt;br /&gt;
           if pchr eq 1&lt;br /&gt;
              then temp = keyc:temp[offset,len(temp)]&lt;br /&gt;
              else temp = temp[1,pchr-1]:keyc:temp[offset,len(temp)]&lt;br /&gt;
           if mode&amp;lt;2&amp;gt; eq &#039;Ins&#039; then&lt;br /&gt;
              crt @(pcol,prow):ceol:&lt;br /&gt;
              crap = temp[pchr,span-pcol]&lt;br /&gt;
           end else crap = keyc&lt;br /&gt;
           convert badc to gudc in crap&lt;br /&gt;
           crt @(pcol,prow):crap:&lt;br /&gt;
           pchr += 1&lt;br /&gt;
           if pchr-ppos ge span then&lt;br /&gt;
              gosub check.page&lt;br /&gt;
              gosub disp.page&lt;br /&gt;
           end&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
check.page:&lt;br /&gt;
     if &#039;*&#039;:temp ne &#039;*&#039;:line then&lt;br /&gt;
        memr(cell)&amp;lt;lnum&amp;gt; = temp&lt;br /&gt;
        gosub reset.record&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
page.help:&lt;br /&gt;
     gosub clear.page&lt;br /&gt;
     if pagehelp eq &#039;&#039; then&lt;br /&gt;
        if sec.write.flg then&lt;br /&gt;
           pagehelp = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;                              Page editing help&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; Cursor movement keys                    Line movement keys&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;       UP = &amp;lt;UP arrow&amp;gt; or ^Z               LEFT END = &amp;lt;Home&amp;gt; or ^A&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;     DOWN = &amp;lt;DOWN arrow&amp;gt; or ^J            RIGHT END = &amp;lt;End&amp;gt; or ^E&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;     LEFT = &amp;lt;LEFT arrow&amp;gt; or ^U           GO TO LINE = ^G&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;    RIGHT = &amp;lt;RIGHT arrow&amp;gt; or ^F                 (prompts for desired line)&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; Page movement keys                      Deleting keys&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; PREVIOUS = &amp;lt;Page Up&amp;gt; or ^P                DELETE CHAR = &amp;lt;Delete&amp;gt; or ^D&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;     NEXT = &amp;lt;Page Down&amp;gt; or ^N              DELETE LINE = &amp;lt;Ctrl-Home&amp;gt; or ^X&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;      TOP = &amp;lt;Ctrl-Page Up&amp;gt; or ^T         DELETE TO EOL = &amp;lt;Ctrl-End&amp;gt; or ^K or ^R&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;   BOTTOM = &amp;lt;Ctrl-Page Down&amp;gt; or ^B&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;                                         &amp;lt;Ctrl-]&amp;gt; = Value Mark&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; &amp;lt;Backspace&amp;gt; is destructive              &amp;lt;Ctrl-\&amp;gt; = Sub-value Mark&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; &amp;lt;Enter&amp;gt; splits the line&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; &amp;lt;Insert&amp;gt; or &amp;lt;Tab&amp;gt; toggles between the insert and overwrite modes&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; &amp;lt;F2&amp;gt; or ^W Returns to line editor mode WITH changes&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; &amp;lt;Esc&amp;gt; or ^Q Returns without changes&#039;&lt;br /&gt;
        end else&lt;br /&gt;
           pagehelp = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;                              Page viewing help&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; Cursor movement keys                    Line movement keys&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;       UP = &amp;lt;UP arrow&amp;gt; or ^Z               LEFT END = &amp;lt;Home&amp;gt; or ^A&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;     DOWN = &amp;lt;DOWN arrow&amp;gt; or ^J            RIGHT END = &amp;lt;End&amp;gt; or ^E&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;     LEFT = &amp;lt;LEFT arrow&amp;gt; or ^U           GO TO LINE = ^G&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;    RIGHT = &amp;lt;RIGHT arrow&amp;gt; or ^F                 (prompts for desired line)&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; Page movement keys           &#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; PREVIOUS = &amp;lt;Page Up&amp;gt; or ^P   &#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;     NEXT = &amp;lt;Page Down&amp;gt; or ^N &#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;      TOP = &amp;lt;Ctrl-Page Up&amp;gt; or ^T&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;   BOTTOM = &amp;lt;Ctrl-Page Down&amp;gt; or ^B&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039;&#039;&lt;br /&gt;
           pagehelp&amp;lt;-1&amp;gt; = &#039; &amp;lt;Esc&amp;gt; or ^Q Returns without changes&#039;&lt;br /&gt;
        end&lt;br /&gt;
     end&lt;br /&gt;
     disp = pagehelp ; stub = &#039;&#039;&lt;br /&gt;
     gosub show.disp&lt;br /&gt;
     crt bott:&lt;br /&gt;
     stub = &#039;Press RETURN to continue&#039;&lt;br /&gt;
     gosub get.rope&lt;br /&gt;
     gosub display.page&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
get.line:&lt;br /&gt;
     line = &#039;&#039;&lt;br /&gt;
     if here eq 0 then&lt;br /&gt;
        cell = 1&lt;br /&gt;
        lnum = 0&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     if here gt last then return&lt;br /&gt;
     cell = int((here-1)/cellsize) + 1&lt;br /&gt;
     coff = rem(here,cellsize)&lt;br /&gt;
     if ooff and ocel eq cell and ooff eq coff - 1 then&lt;br /&gt;
        lnum = ooff ; ooff = coff&lt;br /&gt;
     end else&lt;br /&gt;
        tlin = memr(cell)&lt;br /&gt;
        lnum = 0 ; ocel = cell ; ooff = coff&lt;br /&gt;
     end&lt;br /&gt;
     loop&lt;br /&gt;
        remove bite from tlin setting dlim&lt;br /&gt;
        line = line:bite&lt;br /&gt;
     while dlim do&lt;br /&gt;
        if dlim eq 2 then&lt;br /&gt;
           lnum += 1&lt;br /&gt;
           if lnum eq coff then exit&lt;br /&gt;
           line = &#039;&#039;&lt;br /&gt;
        end else&lt;br /&gt;
           line = line:char(256-dlim)&lt;br /&gt;
        end&lt;br /&gt;
     repeat&lt;br /&gt;
     if not(dlim) then lnum += 1&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
delete.lines:&lt;br /&gt;
     chng = 0&lt;br /&gt;
     if dawn gt dusk then&lt;br /&gt;
        crt &#039;No deletion possible - &#039;:dawn:&#039; &amp;gt; &#039;:dusk:&#039;.&#039;&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     gosub savethat&lt;br /&gt;
     chng = dusk - dawn + 1&lt;br /&gt;
     begin case&lt;br /&gt;
        case dawn le 1 and dusk ge last&lt;br /&gt;
           krj = &#039;&#039;&lt;br /&gt;
           this = &#039;&#039;&lt;br /&gt;
           beg = 0&lt;br /&gt;
           fin = 0&lt;br /&gt;
        case dusk ge last&lt;br /&gt;
           temp = index(this,am,dawn-1)&lt;br /&gt;
           this = this[1,temp-1]&lt;br /&gt;
           if beg gt dawn then beg = 0&lt;br /&gt;
           if fin gt dawn then fin = 0&lt;br /&gt;
           for xx = dcount(krj&amp;lt;1&amp;gt;,vm) to 1 step -1&lt;br /&gt;
              if krj&amp;lt;2,xx&amp;gt; gt dawn then&lt;br /&gt;
                 del krj&amp;lt;1,xx&amp;gt; ; del krj&amp;lt;2,xx&amp;gt; ; krj&amp;lt;3&amp;gt; -= 1&lt;br /&gt;
              end&lt;br /&gt;
           next xx&lt;br /&gt;
        case dawn eq 1&lt;br /&gt;
           temp = index(this,am,dusk)&lt;br /&gt;
           this = this[temp+1,len(this)]&lt;br /&gt;
           if beg le dusk then beg = 0 else beg = beg - chng&lt;br /&gt;
           if fin le dusk then fin = 0 else fin = fin - chng&lt;br /&gt;
           for xx = dcount(krj&amp;lt;1&amp;gt;,vm) to 1 step -1&lt;br /&gt;
              if krj&amp;lt;2,xx&amp;gt; le dusk then&lt;br /&gt;
                 del krj&amp;lt;1,xx&amp;gt; ; del krj&amp;lt;2,xx&amp;gt; ; krj&amp;lt;3&amp;gt; -= 1&lt;br /&gt;
              end&lt;br /&gt;
           next xx&lt;br /&gt;
        case 1&lt;br /&gt;
           temp = index(this,am,dawn-1)&lt;br /&gt;
           temp&amp;lt;2&amp;gt; = index(this,am,dusk)&lt;br /&gt;
           this = this[1,temp&amp;lt;1&amp;gt;]:this[temp&amp;lt;2&amp;gt;+1,len(this)]&lt;br /&gt;
           if beg ge dawn and beg le dusk then beg = 0 else&lt;br /&gt;
              if beg gt dusk then beg -= chng&lt;br /&gt;
           end&lt;br /&gt;
           if fin ge dawn and fin le dusk then fin = 0 else&lt;br /&gt;
              if fin gt dusk then fin -= chng&lt;br /&gt;
           end&lt;br /&gt;
           for xx = dcount(krj&amp;lt;1&amp;gt;,vm) to 1 step -1&lt;br /&gt;
              begin case&lt;br /&gt;
                 case krj&amp;lt;2,xx&amp;gt; gt dusk ; krj&amp;lt;2,xx&amp;gt; -= chng&lt;br /&gt;
                 case krj&amp;lt;2,xx&amp;gt; ge dawn&lt;br /&gt;
                    del krj&amp;lt;1,xx&amp;gt; ; del krj&amp;lt;2,xx&amp;gt; ; krj&amp;lt;3&amp;gt; -= 1&lt;br /&gt;
              end case&lt;br /&gt;
           next xx&lt;br /&gt;
     end case&lt;br /&gt;
     begin case&lt;br /&gt;
        case here gt dusk&lt;br /&gt;
           here = here - dusk + dawn - 1&lt;br /&gt;
        case here gt dawn&lt;br /&gt;
           here = dawn&lt;br /&gt;
     end case&lt;br /&gt;
     gosub set.record&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
check.line:&lt;br /&gt;
     if &#039;*&#039;:temp ne &#039;*&#039;:line then&lt;br /&gt;
        if not(chng) then gosub savethis&lt;br /&gt;
        chng += 1&lt;br /&gt;
        memr(cell)&amp;lt;lnum&amp;gt; = temp&lt;br /&gt;
        if shew or dnum lt plen then gosub display.line&lt;br /&gt;
     end&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
insert.line:&lt;br /&gt;
     if here le beg then beg += 1&lt;br /&gt;
     if here le fin then fin += 1&lt;br /&gt;
     yyno = dcount(krj&amp;lt;1&amp;gt;,vm)&lt;br /&gt;
     for yy = 1 to yyno&lt;br /&gt;
        if krj&amp;lt;2,yy&amp;gt; gt here then krj&amp;lt;2,yy&amp;gt; += 1&lt;br /&gt;
     next yy&lt;br /&gt;
     memr(cell) = insert(memr(cell),lnum,0,0,line)&lt;br /&gt;
     if lfmt and len(last) gt 3 and len(last) ne llen then gosub get.lfmt&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
display.line:&lt;br /&gt;
     begin case&lt;br /&gt;
        case last eq 0&lt;br /&gt;
           here = 0&lt;br /&gt;
           gosub get.line&lt;br /&gt;
           crt begn:&#039;Top of empty record.&#039;&lt;br /&gt;
        case here eq 0&lt;br /&gt;
           gosub get.line&lt;br /&gt;
           crt &#039;Top.&#039;&lt;br /&gt;
        case here gt last&lt;br /&gt;
           crt &#039;Bottom.&#039;&lt;br /&gt;
        case 1&lt;br /&gt;
           gosub get.line&lt;br /&gt;
           if wild then&lt;br /&gt;
              xxno = len(line)&lt;br /&gt;
              temp = &#039;&#039;&lt;br /&gt;
              for xx = 1 to xxno&lt;br /&gt;
                 bite = line[xx,1]&lt;br /&gt;
                 bite = seq(bite)&lt;br /&gt;
                 if bite ge 127 or bite lt 32 then&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
                    bite = &#039;^&#039;:fmt(bite,&#039;3/0R&#039;)&lt;br /&gt;
$else&lt;br /&gt;
                    bite = &#039;^&#039;:fmt(bite,&#039;R%3&#039;)&lt;br /&gt;
$endif&lt;br /&gt;
                 end else bite = char(bite)&lt;br /&gt;
                 temp = temp:bite&lt;br /&gt;
              next xx&lt;br /&gt;
              line = temp&lt;br /&gt;
           end else convert badc to gudc in line&lt;br /&gt;
           crt begn:ceol:&lt;br /&gt;
           if lfmt then&lt;br /&gt;
              blk = &#039;: &#039;&lt;br /&gt;
              if here eq beg then blk = &#039;&amp;lt; &#039;&lt;br /&gt;
              if here eq fin then blk = &#039;&amp;gt; &#039;&lt;br /&gt;
              if here eq beg and here eq fin then blk = &#039;&amp;lt;&amp;gt;&#039;&lt;br /&gt;
              if lfmt then crt (here lfmt):blk:&lt;br /&gt;
           end&lt;br /&gt;
&lt;br /&gt;
           if bleach then&lt;br /&gt;
              crt line&lt;br /&gt;
           end else&lt;br /&gt;
              if here ge beg and here le fin&lt;br /&gt;
                 then showline = @(-13):@(-5):line:@(-6):@(-14)&lt;br /&gt;
*                 else call SORT.LINE(showline,line,1,len(line),lastfind,caseflag)&lt;br /&gt;
                 else setoff = 1 ; width = len(line) ; gosub getshowline&lt;br /&gt;
              crt showline&lt;br /&gt;
           end&lt;br /&gt;
&lt;br /&gt;
           dnum += 1&lt;br /&gt;
           if here eq last then crt &#039;Bottom at line &#039;:last:&#039;.&#039;&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
clear.page:&lt;br /&gt;
     for xx = system(3)-1 to 0 step -1&lt;br /&gt;
        crt @(00,xx):ceol:&lt;br /&gt;
     next xx&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
display.page:&lt;br /&gt;
     crt clpg&lt;br /&gt;
disp.page:&lt;br /&gt;
     if pchr lt 1 then pchr = 1&lt;br /&gt;
     gosub clear.page&lt;br /&gt;
     gosub get.lfmt&lt;br /&gt;
     crt bott:revb:&#039;Press &amp;lt;F1&amp;gt; for help.&#039;:revf:&lt;br /&gt;
     crt @(0,0):ceol:revb:&lt;br /&gt;
     if viewflag&lt;br /&gt;
        then crt &#039;Viewing &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;:&lt;br /&gt;
        else crt &#039;Editing &amp;quot;&#039;:item:&#039;&amp;quot; in file &amp;quot;&#039;:fnam:&#039;&amp;quot;&#039;:&lt;br /&gt;
     crt revf:&lt;br /&gt;
     if idcnt gt 1 then crt &#039; &amp;lt;&#039;:id:&#039;/&#039;:idcnt:&#039;&amp;gt; &#039;:&lt;br /&gt;
     crt&lt;br /&gt;
     ppos = int((pchr-1)/span)&lt;br /&gt;
     ppos = span*ppos+1&lt;br /&gt;
     save = here:am:lnum:am:cell:am:line&lt;br /&gt;
     for xx = 1 to botl&lt;br /&gt;
        here = ptop + xx - 1&lt;br /&gt;
        gosub get.line&lt;br /&gt;
        if bleach then&lt;br /&gt;
           disp = line[ppos,span]&lt;br /&gt;
           convert badc to gudc in disp&lt;br /&gt;
        end else&lt;br /&gt;
           convert badc to gudc in line&lt;br /&gt;
           disp = line&lt;br /&gt;
           if here ge beg and here le fin&lt;br /&gt;
              then showline = @(-13):@(-5):disp[ppos,span]:@(-6):@(-14)&lt;br /&gt;
*              else call SORT.LINE(showline,disp,ppos,span,lastfind,caseflag)&lt;br /&gt;
              else setoff = ppos ; width = span ; gosub getshowline&lt;br /&gt;
           disp = showline&lt;br /&gt;
        end&lt;br /&gt;
        crt @(0,xx):disp:&lt;br /&gt;
     next xx&lt;br /&gt;
     here = save&amp;lt;1&amp;gt;; lnum = save&amp;lt;2&amp;gt;; cell = save&amp;lt;3&amp;gt;; line = save&amp;lt;4&amp;gt;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
savethis:&lt;br /&gt;
     oops = this ; oopc = comi ; oopl = save ; oopf = savl&lt;br /&gt;
     oopb = beg:am:fin ; oopk = krj&lt;br /&gt;
*     if level eq 0 then write oops on voc, &#039;&amp;amp;LED.&#039;:whom&lt;br /&gt;
     return&lt;br /&gt;
savethat:&lt;br /&gt;
     oops = this ; oopc = comi ; oopl = here ; oopf = last&lt;br /&gt;
     oopb = beg:am:fin ; oopk = krj&lt;br /&gt;
*     if level eq 0 then write oops on voc, &#039;&amp;amp;LED.&#039;:whom&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
reset.record:&lt;br /&gt;
     matbuild this from memr using am&lt;br /&gt;
set.record:&lt;br /&gt;
     gosub parse.record&lt;br /&gt;
     gosub get.line&lt;br /&gt;
     if len(last) gt 3 and len(last) ne llen then gosub get.lfmt&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
parse.record:&lt;br /&gt;
     this = this&lt;br /&gt;
     ocel = &#039;&#039; ; ooff = &#039;&#039;&lt;br /&gt;
     last = dcount(this,am)&lt;br /&gt;
     if last eq 0 then&lt;br /&gt;
        dim memr(1)&lt;br /&gt;
        mat memr = &#039;&#039;&lt;br /&gt;
        cell = 1 ; lnum = 0&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     numcells = int((last-1)/cellsize)+1&lt;br /&gt;
     dim memr(numcells)&lt;br /&gt;
     mat memr = &#039;&#039;&lt;br /&gt;
     cell = 1&lt;br /&gt;
     lnum = 0&lt;br /&gt;
     for cell = 1 to numcells&lt;br /&gt;
        memr(cell) = field(this,@am,(cell-1)*cellsize+1,cellsize)&lt;br /&gt;
     next cell&lt;br /&gt;
!    line = &#039;&#039;&lt;br /&gt;
!    loop&lt;br /&gt;
!       remove bite from this setting mark&lt;br /&gt;
!       line = line:bite&lt;br /&gt;
!       begin case&lt;br /&gt;
!          case mark eq 0&lt;br /&gt;
!             if line ne &#039;&#039; then&lt;br /&gt;
!                line = line[1,len(line)]&lt;br /&gt;
!             end&lt;br /&gt;
!             memr(cell) = line&lt;br /&gt;
!          case mark eq 2&lt;br /&gt;
!             lnum += 1&lt;br /&gt;
!             if lnum ge cellsize then&lt;br /&gt;
!                memr(cell) = line&lt;br /&gt;
!                line = &#039;&#039;&lt;br /&gt;
!                cell += 1&lt;br /&gt;
!                lnum = 0&lt;br /&gt;
!             end else&lt;br /&gt;
!                line = line:char(256-mark)&lt;br /&gt;
!             end&lt;br /&gt;
!          case 1&lt;br /&gt;
!             line = line:char(256-mark)&lt;br /&gt;
!       end case&lt;br /&gt;
!    while mark do&lt;br /&gt;
!    repeat&lt;br /&gt;
     cell = 1&lt;br /&gt;
     lnum = 0&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
locked.record:&lt;br /&gt;
     stub = &#039;Record is currently locked by another user. Try again? &#039;:ny:&#039; &#039;&lt;br /&gt;
     gosub get.rope; answ = rope&lt;br /&gt;
     answ = upcase(trim(answ))&lt;br /&gt;
     if answ eq &#039;PASSWORD&#039; then&lt;br /&gt;
        lock = false&lt;br /&gt;
        read this from file, item then goto carry.on&lt;br /&gt;
     end&lt;br /&gt;
     if answ[1,1] eq yes[1,1] then goto edit.item&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
exec.that:&lt;br /&gt;
     temp = temp&amp;lt;1&amp;gt;:&#039; &#039;:fnam:&#039; &#039;:item:temp&amp;lt;2&amp;gt;&lt;br /&gt;
     if fileinfo(file,3) ne &#039;4&#039; then&lt;br /&gt;
        crt &#039;Cannot &#039;:temp:&#039; - must be type 1 or 19&#039;&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     execute temp&lt;br /&gt;
     test = @(0,0)&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
parse.rest:&lt;br /&gt;
     bite = &#039;&#039;&lt;br /&gt;
     flag = &#039;&#039;&lt;br /&gt;
     posn = 1&lt;br /&gt;
     xxno = len(rest)&lt;br /&gt;
     for xx = 1 to xxno&lt;br /&gt;
        bit = rest[xx,1]&lt;br /&gt;
        if flag eq &#039;&#039; then&lt;br /&gt;
           if bit eq &#039; &#039; then&lt;br /&gt;
              if bite&amp;lt;posn&amp;gt; ne &#039;&#039; then posn += 1&lt;br /&gt;
           end else&lt;br /&gt;
              if index(qt,bit,1) then&lt;br /&gt;
                 flag = bit&lt;br /&gt;
                 if keepquot then bite&amp;lt;posn&amp;gt; = bite&amp;lt;posn&amp;gt;:bit&lt;br /&gt;
              end else&lt;br /&gt;
                 if bit eq &#039;(&#039; then&lt;br /&gt;
                    flag = &#039;)&#039;&lt;br /&gt;
                    if bite&amp;lt;posn&amp;gt; ne &#039;&#039; then posn += 1&lt;br /&gt;
                    bite&amp;lt;posn&amp;gt; = &#039;(&#039;&lt;br /&gt;
                 end else bite&amp;lt;posn&amp;gt; = bite&amp;lt;posn&amp;gt;:bit&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
        end else&lt;br /&gt;
           if bit ne flag then&lt;br /&gt;
              bite&amp;lt;posn&amp;gt; = bite&amp;lt;posn&amp;gt;:bit&lt;br /&gt;
           end else&lt;br /&gt;
              if keepquot or bit eq &#039;)&#039; then bite&amp;lt;posn&amp;gt; = bite&amp;lt;posn&amp;gt;:bit&lt;br /&gt;
              posn += 1&lt;br /&gt;
              flag = &#039;&#039;&lt;br /&gt;
           end&lt;br /&gt;
        end&lt;br /&gt;
     next xx&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
split.itype:&lt;br /&gt;
     bite = &#039;&#039;&lt;br /&gt;
     flag = &#039;&#039;&lt;br /&gt;
     posn = 1&lt;br /&gt;
     xxno = len(line)&lt;br /&gt;
     for xx = 1 to xxno&lt;br /&gt;
        bit = line[xx,1]&lt;br /&gt;
        if flag eq &#039;&#039; then&lt;br /&gt;
           if bit eq &#039;;&#039; then&lt;br /&gt;
              posn += 1&lt;br /&gt;
           end else&lt;br /&gt;
              if index(qt,bit,1) then flag = bit&lt;br /&gt;
              if bit eq &#039;(&#039; then flag = &#039;)&#039;&lt;br /&gt;
              bite&amp;lt;posn&amp;gt; = bite&amp;lt;posn&amp;gt;:bit&lt;br /&gt;
           end&lt;br /&gt;
        end else&lt;br /&gt;
           if bit eq flag[1,1] then flag = flag[2,huge]&lt;br /&gt;
           if bit eq &#039;(&#039; and flag[1,1] eq &#039;)&#039; then flag := &#039;)&#039;&lt;br /&gt;
           bite&amp;lt;posn&amp;gt; = bite&amp;lt;posn&amp;gt;:bit&lt;br /&gt;
        end&lt;br /&gt;
     next xx&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
get.lfmt:&lt;br /&gt;
* set up the line format&lt;br /&gt;
     llen = len(last)&lt;br /&gt;
     if llen lt 3 then llen = 3&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
     lfmt = llen:&#039;/0R&#039;&lt;br /&gt;
$else&lt;br /&gt;
     lfmt = &#039;R%&#039;:llen&lt;br /&gt;
     if index(item,&#039;_IType.&#039;,1) then lfmt = llen:&#039;@R&#039;&lt;br /&gt;
$endif&lt;br /&gt;
     prmt = &#039;*&#039;:str(&#039;-&#039;,llen-1)&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
leftarr: *&lt;br /&gt;
     numb = oconv(trim(comi[2,len(comi)]),&#039;MCN&#039;)&lt;br /&gt;
     if numb eq &#039;&#039; then numb = here&lt;br /&gt;
     if numb gt last then numb = &#039;&#039;&lt;br /&gt;
     if numb ge 0 then&lt;br /&gt;
        crt &#039;Block starts at line &#039;:numb:&lt;br /&gt;
        beg = numb&lt;br /&gt;
        if fin and beg gt fin then&lt;br /&gt;
           crt &#039;; End moved from &#039;:fin:&#039; to &#039;:beg&lt;br /&gt;
           fin = beg&lt;br /&gt;
           mov = 1&lt;br /&gt;
        end else&lt;br /&gt;
           if fin then mov = fin - beg + 1 else mov = last - beg&lt;br /&gt;
           crt &#039; (&#039;:mov:&#039; lines)&#039;&lt;br /&gt;
        end&lt;br /&gt;
        if numb eq here then gosub display.line&lt;br /&gt;
     end else crt &#039;Cannot mark line &#039;:numb&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
rightarr: *&lt;br /&gt;
     numb = oconv(trim(comi[2,len(comi)]),&#039;MCN&#039;)&lt;br /&gt;
     if numb eq &#039;&#039; then numb = here&lt;br /&gt;
     if numb gt last then numb = &#039;&#039;&lt;br /&gt;
     if numb ge 0 then&lt;br /&gt;
        crt &#039;Block ends at line &#039;:numb:&lt;br /&gt;
        fin = numb&lt;br /&gt;
        if beg gt fin then&lt;br /&gt;
           crt &#039;; Start moved from &#039;:beg:&#039; to &#039;:fin&lt;br /&gt;
           beg = fin&lt;br /&gt;
           mov = 1&lt;br /&gt;
        end else&lt;br /&gt;
           if beg then mov = fin - beg + 1 else mov = fin&lt;br /&gt;
           crt &#039; (&#039;:mov:&#039; lines)&#039;&lt;br /&gt;
        end&lt;br /&gt;
        if numb eq here then gosub display.line&lt;br /&gt;
     end else crt &#039;Cannot mark line &#039;:numb&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
botharr: *&lt;br /&gt;
     numb = trim(comi[3,len(comi)])&lt;br /&gt;
     begin case&lt;br /&gt;
        case numb matches &#039;1N0N&#039;&lt;br /&gt;
           numb = numb:am:numb&lt;br /&gt;
        case numb matches &#039;1N0N&amp;quot;-&amp;quot;1N0N&#039;&lt;br /&gt;
           numb = field(numb,&#039;-&#039;,1):am:field(numb,&#039;-&#039;,2)&lt;br /&gt;
        case numb matches &#039;1N0N&amp;quot; &amp;quot;1N0N&#039;&lt;br /&gt;
           numb = field(numb,&#039; &#039;,1):am:field(numb,&#039; &#039;,2)&lt;br /&gt;
        case numb eq &#039;&#039;&lt;br /&gt;
           numb = here:am:here&lt;br /&gt;
        case 1&lt;br /&gt;
           numb = &#039;&#039;&lt;br /&gt;
     end case&lt;br /&gt;
     if numb&amp;lt;2&amp;gt; gt last then numb&amp;lt;2&amp;gt; = last&lt;br /&gt;
     if numb&amp;lt;1&amp;gt; gt last then numb = &#039;&#039;&lt;br /&gt;
     if numb&amp;lt;2&amp;gt; lt numb&amp;lt;1&amp;gt; then&lt;br /&gt;
        crt &#039;Block starts at &#039;:numb&amp;lt;1&amp;gt;:&#039; and ends at &#039;:numb&amp;lt;2&amp;gt;:&#039; =&amp;gt; &#039;:&lt;br /&gt;
        numb = &#039;&#039;&lt;br /&gt;
     end&lt;br /&gt;
     if numb ne &#039;&#039; then&lt;br /&gt;
        beg = numb&amp;lt;1&amp;gt;&lt;br /&gt;
        fin = numb&amp;lt;2&amp;gt;&lt;br /&gt;
        if beg eq fin then&lt;br /&gt;
           crt &#039;Block starts and ends at line &#039;:beg&lt;br /&gt;
        end else&lt;br /&gt;
           crt &#039;Block starts at &#039;:beg:&#039; and ends at &#039;:fin&lt;br /&gt;
        end&lt;br /&gt;
        if here eq beg or here eq fin then&lt;br /&gt;
           gosub display.line&lt;br /&gt;
        end&lt;br /&gt;
     end else crt &#039;Cannot mark Block&#039;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
recalc.posn:&lt;br /&gt;
     begin case&lt;br /&gt;
        case posn lt rest and posn le oopl&lt;br /&gt;
        case posn lt rest and posn gt oopl&lt;br /&gt;
           posn += numb&lt;br /&gt;
        case posn ge rest and posn lt (rest+numb)&lt;br /&gt;
           posn += (here+1-rest)&lt;br /&gt;
        case posn ge (rest+numb) and posn le oopl&lt;br /&gt;
           posn -= numb&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
find.label:&lt;br /&gt;
     temp = field(trimf(line),&#039; &#039;,1)&lt;br /&gt;
     temp = trim(temp,char(13),&#039;B&#039;)&lt;br /&gt;
     chit = temp[1,1]&lt;br /&gt;
     begin case&lt;br /&gt;
        case chit eq &#039;*&#039; or chit eq &#039;!&#039; ; temp = &#039;&#039;&lt;br /&gt;
        case chit matches &#039;1N&#039; or chit eq &#039;.&#039;&lt;br /&gt;
           temp = field(temp,&#039;*&#039;,1)&lt;br /&gt;
           temp = field(temp,&#039;!&#039;,1)&lt;br /&gt;
           temp = field(temp,&#039;:&#039;,1)&lt;br /&gt;
           test = convert(&#039;.0123456789&#039;,&#039;&#039;,temp)&lt;br /&gt;
           if test ne &#039;&#039; then temp = &#039;&#039;&lt;br /&gt;
        case chit matches &#039;1A&#039; and index(temp,&#039;:&#039;,1)&lt;br /&gt;
           temp = field(temp,&#039;:&#039;,1)&lt;br /&gt;
           test = oconv(oconv(temp,&#039;MC/A&#039;),&#039;MC/N&#039;)&lt;br /&gt;
           test = convert(&#039;._%$&#039;,&#039;&#039;,test)&lt;br /&gt;
           if test ne &#039;&#039; then temp = &#039;&#039;&lt;br /&gt;
        case 1&lt;br /&gt;
           temp = &#039;&#039;   &lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
get.answ:&lt;br /&gt;
     loop&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
        rlen = 1&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
        gosub get.rope&lt;br /&gt;
        answ = upcase(trim(rope)[1,1])&lt;br /&gt;
     until answ eq yes[1,1] or answ eq no[1,1] do&lt;br /&gt;
        crt &#039;Please answer Y or N&#039;&lt;br /&gt;
     repeat&lt;br /&gt;
     crt&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
writerr:&lt;br /&gt;
$ifdef qm&lt;br /&gt;
     if status() eq er$trigger then&lt;br /&gt;
        crt &#039;Data validation error: &#039;: @trigger.return.code&lt;br /&gt;
     end else&lt;br /&gt;
        crt &#039;Write error &#039;: status():&#039; (o/s error %2) - Data not saved. Original data will be lost if you leave the editor now.&#039;&lt;br /&gt;
     end&lt;br /&gt;
$else&lt;br /&gt;
     crt &#039;Write error &#039;: status():&#039; (o/s error %2) - Data not saved. Original data will be lost if you leave the editor now.&#039;&lt;br /&gt;
$endif&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
indenter:&lt;br /&gt;
     marg = fr(1) ;* the margin&lt;br /&gt;
     dent = fr(2) ;* the indentation&lt;br /&gt;
     supp = fr(6) ;* flag - suppress &#039;!&#039; output&lt;br /&gt;
     astx = not(fr(9)) ;* flag - keep &#039;*&#039; comments on page edge&lt;br /&gt;
     suit = not(fr(10)) ;* flag - indent &#039;CASE&#039; statements&lt;br /&gt;
     dead = &#039;ACDGHIJKMPQSVXYZ&#039;&lt;br /&gt;
     push = &#039;LOOP\WHILE\UNTIL\FOR\THEN\ELSE\BEGIN\LOCKED\ON~ERROR&#039;&lt;br /&gt;
     pull = &#039;UNTIL\WHILE\REPEAT\NEXT\END&#039;&lt;br /&gt;
     convert &#039;\&#039; to am in push&lt;br /&gt;
     convert &#039;\&#039; to am in pull&lt;br /&gt;
     skip = &#039;;:&amp;quot; (&#039; : &amp;quot;&#039;&amp;quot;&lt;br /&gt;
     marx = &#039;\&amp;quot;&#039; : &amp;quot;&#039;&amp;quot;&lt;br /&gt;
     bang = false&lt;br /&gt;
     xxno = dcount(this,am)&lt;br /&gt;
     dim part(100)&lt;br /&gt;
     matparse part from this, am&lt;br /&gt;
     this = &#039;&#039;&lt;br /&gt;
     bite = &#039;&#039;&lt;br /&gt;
     first = true&lt;br /&gt;
     for xx = 1 to xxno&lt;br /&gt;
        there = rem(xx,100)&lt;br /&gt;
        if not(there) then&lt;br /&gt;
           if first then this = bite else this = this:am:bite&lt;br /&gt;
           first = false&lt;br /&gt;
           bite = &#039;&#039;&lt;br /&gt;
           thisline = part(100)&lt;br /&gt;
           temp = part(0)&lt;br /&gt;
           matparse part from temp, am&lt;br /&gt;
           if not(supp) then bang = true; crt &#039;!&#039;:&lt;br /&gt;
        end else thisline = part(there)&lt;br /&gt;
        if trim(thisline) eq &#039;&#039; then&lt;br /&gt;
           if first then bite&amp;lt;there&amp;gt; = &#039;&#039; else bite&amp;lt;there+1&amp;gt; = &#039;&#039;&lt;br /&gt;
           continue&lt;br /&gt;
        end&lt;br /&gt;
        note = false&lt;br /&gt;
        wcnt = 0; more = 0; less = 0&lt;br /&gt;
        mark = &#039;&#039;; tags = &#039;&#039;; lastword = &#039;&#039;&lt;br /&gt;
        zz = 1&lt;br /&gt;
        thisline = trimf(thisline)&lt;br /&gt;
        if thisline matches &#039;1N0N&amp;quot;*&amp;quot;0X&#039; then&lt;br /&gt;
           temp = field(thisline,&#039;*&#039;,1)&lt;br /&gt;
           thisline = temp:&#039; &#039;:thisline[col2(),len(thisline)]&lt;br /&gt;
        end&lt;br /&gt;
        thatline = upcase(thisline)&lt;br /&gt;
        thatline = change(thatline, &#039;ON ERROR&#039;, &#039;ON~ERROR&#039;)&lt;br /&gt;
        left = field(thatline,&#039; &#039;,1)&lt;br /&gt;
        if num(left) or left[len(left),1] eq &#039;:&#039; then&lt;br /&gt;
           if not(index(left,&#039;=&#039;,1)) then tags = thisline[1,len(left)]&lt;br /&gt;
        end&lt;br /&gt;
        if tags gt &#039;&#039; then&lt;br /&gt;
           thisline = trimf(thisline[col2()+1,len(thisline)])&lt;br /&gt;
           thatline = trimf(thatline[col2()+1,len(thatline)])&lt;br /&gt;
        end&lt;br /&gt;
        zzno = len(thisline)&lt;br /&gt;
        loop&lt;br /&gt;
        while zz lt zzno and not(note) do&lt;br /&gt;
           loop&lt;br /&gt;
              thisun = thatline[zz,1]&lt;br /&gt;
              begin case&lt;br /&gt;
                 case mark eq &#039;&#039; and index(marx,thisun,1)&lt;br /&gt;
                    mark = thisun&lt;br /&gt;
                 case mark ne &#039;&#039;&lt;br /&gt;
                    if thisun eq mark then mark = &#039;&#039;&lt;br /&gt;
                 case wcnt and thisun eq &#039;;&#039;&lt;br /&gt;
                    that = field(trim(thatline[zz+1,zzno]),&#039; &#039;,1)&lt;br /&gt;
                    if that[1,3] eq &#039;REM&#039; then that = &#039;&#039;&lt;br /&gt;
                    if that[1,1] eq &#039;*&#039; then that = &#039;&#039;&lt;br /&gt;
                    if that[1,1] eq &#039;!&#039; then that = &#039;&#039;&lt;br /&gt;
                    if that eq &#039;&#039; then zz = zzno&lt;br /&gt;
                 case wcnt&lt;br /&gt;
                 case thisun eq &#039;!&#039; or thisun eq &#039;$&#039;&lt;br /&gt;
                    note = true; zz = zzno&lt;br /&gt;
                 case thisun eq &#039;*&#039;&lt;br /&gt;
                    if astx then note = true&lt;br /&gt;
                    zz = zzno&lt;br /&gt;
                 case field(thatline,&#039; &#039;,1) eq &#039;REM&#039;&lt;br /&gt;
                    note = true; zz = zzno&lt;br /&gt;
              end case&lt;br /&gt;
           while (index(skip,thisun,1) or mark) and zz lt zzno do&lt;br /&gt;
              zz += 1&lt;br /&gt;
           repeat&lt;br /&gt;
           left = zz&lt;br /&gt;
           loop&lt;br /&gt;
              thisun = thatline[zz,1]&lt;br /&gt;
           until index(skip,thisun,1) or zz gt zzno do&lt;br /&gt;
              zz += 1&lt;br /&gt;
           repeat&lt;br /&gt;
           word = thatline[left,zz-left]&lt;br /&gt;
           wcnt += 1&lt;br /&gt;
           if wcnt ne 1 then&lt;br /&gt;
              if word eq &#039;WHILE&#039; or word eq &#039;UNTIL&#039; then word = &#039; &#039;&lt;br /&gt;
              if word eq &#039;NEXT&#039; or word eq &#039;REPEAT&#039; then&lt;br /&gt;
                 word = &#039; &#039;&lt;br /&gt;
                 more -= dent&lt;br /&gt;
              end&lt;br /&gt;
              if lastword eq &#039;LOCKED&#039; then more -= dent&lt;br /&gt;
           end else&lt;br /&gt;
              if word eq &#039;LOCKED&#039; or word eq &#039;THEN&#039; then&lt;br /&gt;
                 if word eq trim(thatline) then less += dent&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           if word eq &#039;CASE&#039; then&lt;br /&gt;
              if lastword ne &#039;BEGIN&#039; and lastword ne &#039;END&#039; then&lt;br /&gt;
                 more += dent&lt;br /&gt;
                 less += dent&lt;br /&gt;
              end&lt;br /&gt;
              if suit and lastword eq &#039;BEGIN&#039; then more += dent&lt;br /&gt;
              if suit and lastword eq &#039;END&#039; then less += dent&lt;br /&gt;
           end&lt;br /&gt;
           if not(index(dead,word[1,1],1)) then&lt;br /&gt;
              locate(word,pull;rubbish) then less += dent&lt;br /&gt;
              test = word ne &#039;THEN&#039; &amp;amp; word ne &#039;ELSE&#039; &amp;amp; word ne &#039;ON~ERROR&#039;&lt;br /&gt;
              that = trim(thisline[zz,zzno])&lt;br /&gt;
              if that[1,1] eq &#039;;&#039; then&lt;br /&gt;
                 that = trim(that[2,zzno])[1,3]&lt;br /&gt;
                 if that[1,3] eq &#039;REM&#039; then that = &#039;&#039;&lt;br /&gt;
                 if that[1,1] eq &#039;*&#039; then that = &#039;&#039;&lt;br /&gt;
                 if that[1,1] eq &#039;!&#039; then that = &#039;&#039;&lt;br /&gt;
              end&lt;br /&gt;
              if test or that eq &#039;&#039; then&lt;br /&gt;
                 locate(word,push;rubbish) then&lt;br /&gt;
                    more += dent&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
              if word eq &#039;THEN&#039; or word eq &#039;LOCKED&#039; then&lt;br /&gt;
                 if that eq &#039;&#039; and lastword eq &#039;&#039; then less -= dent&lt;br /&gt;
              end&lt;br /&gt;
              if that ne &#039;&#039; and lastword eq &#039;&#039; then&lt;br /&gt;
                 if word eq &#039;THEN&#039; or word eq &#039;ELSE&#039; then&lt;br /&gt;
                    more -= dent&lt;br /&gt;
                    less -= dent&lt;br /&gt;
                 end&lt;br /&gt;
                 if word eq &#039;LOCKED&#039; and trim(that)[1,1] ne &#039;=&#039;&lt;br /&gt;
                    then more -= dent ; less -= dent&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
           lastword = word&lt;br /&gt;
        repeat&lt;br /&gt;
        marg -= less&lt;br /&gt;
        if tags eq &#039;&#039; then pict = &#039;&#039; else pict = &#039;L#&#039;:(len(tags)+1)&lt;br /&gt;
        if marg gt len(tags) then pict = &#039;L#&#039;:marg&lt;br /&gt;
        if thisline eq &#039;!&#039; or thisline eq &#039;$&#039; then note = true&lt;br /&gt;
        if thatline eq &#039;REM&#039; then note = true&lt;br /&gt;
        if astx and thisline eq &#039;*&#039; then note = true&lt;br /&gt;
        if note then&lt;br /&gt;
           if tags eq &#039;&#039; then pict = &#039;&#039; else pict = &#039;L#&#039;:(len(tags)+1)&lt;br /&gt;
        end&lt;br /&gt;
        thisline = trimb(fmt(tags,pict):thisline)&lt;br /&gt;
        if first then&lt;br /&gt;
           bite&amp;lt;there&amp;gt; = thisline&lt;br /&gt;
        end else bite&amp;lt;there+1&amp;gt; = thisline&lt;br /&gt;
        marg += more&lt;br /&gt;
     next xx&lt;br /&gt;
     if bang then crt&lt;br /&gt;
     if bite ne &#039;&#039; then&lt;br /&gt;
        if first then this = bite else this = this:am:bite&lt;br /&gt;
     end&lt;br /&gt;
     that = &#039;&#039;&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
get.rope:&lt;br /&gt;
* If the terminal doesn&#039;t support screen addressing, do simple input&lt;br /&gt;
     if not(editpage) then&lt;br /&gt;
        crt begn:stub:&lt;br /&gt;
*&amp;gt;        input rope:&lt;br /&gt;
        if rlen then&lt;br /&gt;
           input rope,rlen:&lt;br /&gt;
           rlen = 0&lt;br /&gt;
        end else input rope:&lt;br /&gt;
*&amp;gt;&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
*&lt;br /&gt;
* The following variables are used&lt;br /&gt;
*&lt;br /&gt;
*    BARE - what you are going to reveal (the displayed part)&lt;br /&gt;
*    CRAM - insert mode on (vs overwrite mode)&lt;br /&gt;
*    PCOL - display position&lt;br /&gt;
*    STEM - the prefix part of the display line&lt;br /&gt;
*    ICON - a picture of what you last displayed&lt;br /&gt;
*    PANS - the PAN increment&lt;br /&gt;
*    PPOS - the PAN origin&lt;br /&gt;
*    WIDE - the PAN width&lt;br /&gt;
*    PULP - SEQ(COMI) - what you get from a key press&lt;br /&gt;
*    PURE - untouched, a virgin&lt;br /&gt;
*    POSN - the stack position&lt;br /&gt;
*    PCHR - text position&lt;br /&gt;
&lt;br /&gt;
     pans = int(span/2)&lt;br /&gt;
     posn = 0&lt;br /&gt;
     rope = pick; pick = &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
     loop&lt;br /&gt;
        if heap then&lt;br /&gt;
           stem = prmt:&#039;: &#039;&lt;br /&gt;
           if posn then stem = &#039;*&#039;:fmt(posn, &amp;quot;3&#039;0&#039;R&amp;quot;):stem[5,huge]&lt;br /&gt;
        end else stem = &#039;*&#039;:stub&lt;br /&gt;
        wide = span - len(stem) - 1&lt;br /&gt;
        pans = int(wide/2)&lt;br /&gt;
        ppos = 1&lt;br /&gt;
        pchr = 1&lt;br /&gt;
        cram = true&lt;br /&gt;
        icon = space(span)&lt;br /&gt;
        crt begn : ceol :&lt;br /&gt;
        pure = true&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
!   if nick and trim(rope) = &#039;&#039; then pchr = len(rope)+1 ; pure = false&lt;br /&gt;
!&amp;amp;&amp;amp;&amp;amp;&lt;br /&gt;
&lt;br /&gt;
        loop&lt;br /&gt;
&lt;br /&gt;
           begin case&lt;br /&gt;
*&amp;gt;            case pchr lt ppos ; ppos -= pans&lt;br /&gt;
              case pchr lt ppos&lt;br /&gt;
                 loop while pchr lt ppos ; ppos -= pans ; repeat&lt;br /&gt;
              case pchr ge (ppos+wide)&lt;br /&gt;
                 loop while pchr ge(ppos+wide) ; ppos += pans ; repeat&lt;br /&gt;
*&amp;gt;            case pchr ge (ppos+wide) ; ppos += pans&lt;br /&gt;
           end case&lt;br /&gt;
&lt;br /&gt;
           bare = stem : rope[ppos, wide]&lt;br /&gt;
           pcol = 0&lt;br /&gt;
           if icon ne bare then&lt;br /&gt;
              yyno = 0&lt;br /&gt;
              for yy = 1 to span until yyno&lt;br /&gt;
                 if bare[yy,1] ne icon[yy,1] then yyno = yy&lt;br /&gt;
              next yy&lt;br /&gt;
              crt @(yyno-1):bare[yyno,span-yyno]:ceol:@(pcol):&lt;br /&gt;
              icon = bare[1,span]&lt;br /&gt;
           end&lt;br /&gt;
&lt;br /&gt;
           pcol = len(stem) + pchr - ppos&lt;br /&gt;
           crt @(pcol) :&lt;br /&gt;
&lt;br /&gt;
           gosub get.keyc&lt;br /&gt;
           locate(keyc,keys;cpos) then cpos = acts&amp;lt;cpos&amp;gt; else cpos = 0&lt;br /&gt;
&lt;br /&gt;
           pulp = seq(keyc)&lt;br /&gt;
           if pulp lt 32 or pulp gt 128 then keyc = &#039;&#039;&lt;br /&gt;
           if pure then&lt;br /&gt;
              if cpos eq 0 and keyc ne &#039;&#039; then&lt;br /&gt;
                 rope = &#039;&#039;&lt;br /&gt;
                 pchr = 1&lt;br /&gt;
              end&lt;br /&gt;
              crt @(0):&lt;br /&gt;
              if cram then crt &#039;&amp;gt;&#039;: else crt &#039;#&#039;:&lt;br /&gt;
              crt @(pcol):&lt;br /&gt;
              pure = false&lt;br /&gt;
           end&lt;br /&gt;
&lt;br /&gt;
           begin case&lt;br /&gt;
&lt;br /&gt;
              case heap and (cpos = uarr or cpos = upag)&lt;br /&gt;
                 if posn lt dcount(stak, vm) then&lt;br /&gt;
                    posn += 1&lt;br /&gt;
                    rope = stak&amp;lt;1,posn&amp;gt;&lt;br /&gt;
                 end&lt;br /&gt;
                 exit&lt;br /&gt;
&lt;br /&gt;
              case heap and (cpos = darr or cpos = dpag)&lt;br /&gt;
                 if posn gt 1 then&lt;br /&gt;
                    posn -= 1&lt;br /&gt;
                    rope = stak&amp;lt;1,posn&amp;gt;&lt;br /&gt;
                 end else&lt;br /&gt;
                    posn = 0&lt;br /&gt;
                    rope = &#039;&#039;&lt;br /&gt;
                 end&lt;br /&gt;
                 exit&lt;br /&gt;
&lt;br /&gt;
              case heap and cpos = skey&lt;br /&gt;
                 if rope eq &#039;&#039; then&lt;br /&gt;
                    if look&amp;lt;1&amp;gt; eq &#039;&#039; then continue&lt;br /&gt;
                    comi = look&amp;lt;1,1&amp;gt;&lt;br /&gt;
                    gosub parse.command&lt;br /&gt;
                    rope = &#039;L&#039;:dlim:rest&lt;br /&gt;
                 end else rope = &#039;L/&#039;:rope&lt;br /&gt;
                 if rope eq look&amp;lt;1&amp;gt; then rope = &#039;L&#039;&lt;br /&gt;
                 return&lt;br /&gt;
&lt;br /&gt;
              case heap and cpos = rkey&lt;br /&gt;
                 if rope eq &#039;&#039; then&lt;br /&gt;
                    if look&amp;lt;1&amp;gt; eq &#039;&#039; then continue&lt;br /&gt;
                    comi = look&amp;lt;1,1&amp;gt;&lt;br /&gt;
                    gosub parse.command&lt;br /&gt;
                    rope = &#039;LA&#039;:dlim:rest&lt;br /&gt;
                 end else rope = &#039;LA/&#039;:rope&lt;br /&gt;
                 if rope eq look&amp;lt;1&amp;gt; then rope = &#039;L&#039;&lt;br /&gt;
                 return&lt;br /&gt;
&lt;br /&gt;
              case heap and cpos = writ and pulp ne 23&lt;br /&gt;
                 rope = &#039;PE&#039;&lt;br /&gt;
                 return&lt;br /&gt;
&lt;br /&gt;
              case heap and cpos = phlp&lt;br /&gt;
                 stub = &#039;&#039; ; heap = false ; rest = &#039;&#039;&lt;br /&gt;
                 gosub show.help&lt;br /&gt;
                 rope = &#039;D&#039;&lt;br /&gt;
                 return&lt;br /&gt;
&lt;br /&gt;
              case cpos = larr&lt;br /&gt;
                 if pchr gt 1 then pchr -= 1&lt;br /&gt;
&lt;br /&gt;
              case cpos = rarr&lt;br /&gt;
                 if pchr le len(rope) then pchr += 1&lt;br /&gt;
&lt;br /&gt;
              case cpos = lpag&lt;br /&gt;
                 pchr = 1&lt;br /&gt;
&lt;br /&gt;
              case cpos = rpag&lt;br /&gt;
                 pchr = len(rope) + 1&lt;br /&gt;
&lt;br /&gt;
              case cpos = escp&lt;br /&gt;
                 posn = 0&lt;br /&gt;
                 rope = &#039;&#039;&lt;br /&gt;
                 exit&lt;br /&gt;
&lt;br /&gt;
              case cpos = delc&lt;br /&gt;
                 rope = rope[1, pchr-1] : rope[pchr+1, huge]&lt;br /&gt;
&lt;br /&gt;
              case cpos = delr&lt;br /&gt;
                 rope = rope[1, pchr-1]&lt;br /&gt;
&lt;br /&gt;
              case cpos = back&lt;br /&gt;
                 if pchr gt 1 then&lt;br /&gt;
                    pchr -= 1&lt;br /&gt;
                    rope = rope[1, pchr-1] : rope[pchr+1, huge]&lt;br /&gt;
                 end&lt;br /&gt;
&lt;br /&gt;
              case cpos = carr&lt;br /&gt;
                 if heap then&lt;br /&gt;
                    crt begn : ceol : &#039;:&#039; : rope:&lt;br /&gt;
                    if posn then&lt;br /&gt;
                       if rope eq stak&amp;lt;1,posn&amp;gt; then del stak&amp;lt;1,posn&amp;gt;&lt;br /&gt;
                    end&lt;br /&gt;
                 end&lt;br /&gt;
                 return&lt;br /&gt;
&lt;br /&gt;
              case cpos = togg&lt;br /&gt;
                 cram = not(cram)&lt;br /&gt;
                 crt @(0):&lt;br /&gt;
                 if cram then crt &#039;&amp;gt;&#039;: else crt &#039;#&#039;:&lt;br /&gt;
                 crt @(pcol):&lt;br /&gt;
&lt;br /&gt;
              case pulp eq 23         ;* ctrl-w&lt;br /&gt;
                 dope = downcase(rope)&lt;br /&gt;
                 mope = upcase(rope)&lt;br /&gt;
                 tope = oconv(rope,&#039;MCT&#039;)&lt;br /&gt;
                 begin case&lt;br /&gt;
                    case rope eq tope and dope eq tope ; rope = mope&lt;br /&gt;
                    case rope eq tope ; rope = dope&lt;br /&gt;
                    case rope eq mope ; rope = tope&lt;br /&gt;
                    case 1 ; rope = mope&lt;br /&gt;
                 end case&lt;br /&gt;
&lt;br /&gt;
              case pulp ge 32 and pulp lt 128&lt;br /&gt;
                 if cram then&lt;br /&gt;
                    rope = rope[1, pchr-1] : keyc : rope[pchr, huge]&lt;br /&gt;
                 end else&lt;br /&gt;
                    if pchr le len(rope)&lt;br /&gt;
                       then rope[pchr, 1] = keyc&lt;br /&gt;
                       else rope := keyc&lt;br /&gt;
                 end&lt;br /&gt;
                 pchr += 1&lt;br /&gt;
&lt;br /&gt;
              case 1&lt;br /&gt;
                 crt bell:&lt;br /&gt;
           end case&lt;br /&gt;
           if rlen and len(rope) ge rlen then&lt;br /&gt;
              crt keyc:&lt;br /&gt;
              rlen = 0&lt;br /&gt;
              return&lt;br /&gt;
           end&lt;br /&gt;
        repeat&lt;br /&gt;
     repeat&lt;br /&gt;
&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
get.keyc:&lt;br /&gt;
$ifdef qm&lt;br /&gt;
     if not(index(upcase(system(7)),&#039;EEEPC&#039;,1)) then&lt;br /&gt;
        keyc = keycode()&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
$endif&lt;br /&gt;
     common /keys$krj/ termtype,eseq,keyd,base,full&lt;br /&gt;
     if not(assigned(termtype)) then termtype = &#039;&#039;&lt;br /&gt;
     if termtype ne oconv(system(7),&#039;MCU&#039;) then gosub setup.keys&lt;br /&gt;
&lt;br /&gt;
     keyc = &#039;&#039;&lt;br /&gt;
     loop&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
        mine = in()&lt;br /&gt;
$else&lt;br /&gt;
        mine = keyin()&lt;br /&gt;
$endif&lt;br /&gt;
        locate(mine,base;post) then gosub get.rest&lt;br /&gt;
        locate(mine,eseq;cmd)&lt;br /&gt;
           then keyc = char(keyd&amp;lt;cmd&amp;gt;)&lt;br /&gt;
           else if len(mine) eq 1 then keyc = mine&lt;br /&gt;
     while keyc eq &#039;&#039; do repeat&lt;br /&gt;
     return&lt;br /&gt;
get.rest:&lt;br /&gt;
     loop&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
        a = system(12)&lt;br /&gt;
        loop&lt;br /&gt;
        until system(12) ge (a+5) do&lt;br /&gt;
        repeat&lt;br /&gt;
$else&lt;br /&gt;
        nap 5&lt;br /&gt;
$endif&lt;br /&gt;
        input your,-1&lt;br /&gt;
     while your do&lt;br /&gt;
$ifdef unidata&lt;br /&gt;
        mine := in()&lt;br /&gt;
$else&lt;br /&gt;
        mine := upcase(keyin())&lt;br /&gt;
$endif&lt;br /&gt;
        locate(mine,full,post;your) then return&lt;br /&gt;
     repeat&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
setup.keys:&lt;br /&gt;
* Define the key numbers - these are based on QM keycode()&lt;br /&gt;
*======================================================================&lt;br /&gt;
* Arrow keys&lt;br /&gt;
     equ lark to 203, rark to 204, uark to 205, dark to 206&lt;br /&gt;
* Page up and down, home and end&lt;br /&gt;
     equ upak to 207, dpak to 208, homk to 209, endk to 210&lt;br /&gt;
* Insert, delete, backtab, delete line, backspace&lt;br /&gt;
     equ insk to 211, deck to 212, btbk to 213, delk to 127, bspk to 8&lt;br /&gt;
* Control - Page up and down, homk and end&lt;br /&gt;
     equ cupk to 214, cdpk to 215, chok to 216, cenk to 217&lt;br /&gt;
* Function, Control+Function, Alt+Function, Shift+Function&lt;br /&gt;
     equ f1   to 128, cf1  to 140, af1  to 152, sf1  to 164&lt;br /&gt;
     equ f2   to 129, cf2  to 141, af2  to 153, sf2  to 165&lt;br /&gt;
     equ f3   to 130, cf3  to 142, af3  to 154, sf3  to 166&lt;br /&gt;
     equ f4   to 131, cf4  to 143, af4  to 155, sf4  to 167&lt;br /&gt;
     equ f5   to 132, cf5  to 144, af5  to 156, sf5  to 168&lt;br /&gt;
     equ f6   to 133, cf6  to 145, af6  to 157, sf6  to 169&lt;br /&gt;
     equ f7   to 134, cf7  to 146, af7  to 158, sf7  to 170&lt;br /&gt;
     equ f8   to 135, cf8  to 147, af8  to 159, sf8  to 171&lt;br /&gt;
     equ f9   to 136, cf9  to 148, af9  to 160, sf9  to 172&lt;br /&gt;
     equ f10  to 137, cf10 to 149, af10 to 161, sf10 to 173&lt;br /&gt;
     equ f11  to 138, cf11 to 150, af11 to 162, sf11 to 174&lt;br /&gt;
     equ f12  to 139, cf12 to 151, af12 to 163, sf12 to 175&lt;br /&gt;
*======================================================================&lt;br /&gt;
* Stash the escape sequences and key codes in labelled common&lt;br /&gt;
     termtype = oconv(system(7),&#039;MCU&#039;)&lt;br /&gt;
* Set up keys good for many terminals and as defaults&lt;br /&gt;
     eseq = &#039;&#039; ; keyd = &#039;&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = lark; eseq&amp;lt;-1&amp;gt; = char(21)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = rark; eseq&amp;lt;-1&amp;gt; = char(6)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = uark; eseq&amp;lt;-1&amp;gt; = char(26)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = dark; eseq&amp;lt;-1&amp;gt; = char(10)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = homk; eseq&amp;lt;-1&amp;gt; = char(1)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = endk; eseq&amp;lt;-1&amp;gt; = char(5)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = deck; eseq&amp;lt;-1&amp;gt; = char(4)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = upak; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[5~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = dpak; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[6~&#039;&lt;br /&gt;
* Now do settings that don&#039;t interfere between terminals&lt;br /&gt;
* VT-type terminals - cater for alternative arrow sequences&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = rark; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[C&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = rark; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OC&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = uark; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[A&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = uark; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OA&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = dark; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[B&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = dark; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OB&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = insk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[1~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = deck; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[4~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = btbk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[Z&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f1  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OP&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f2  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OQ&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f3  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OR&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f4  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OS&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f5  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OT&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f6  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[17~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f7  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[18~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f8  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[19~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f9  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[20~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f10 ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[21~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f11 ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[23~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f12 ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[24~&#039;&lt;br /&gt;
* Wyse-type terminals&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = insk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;Q&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = deck; eseq&amp;lt;-1&amp;gt; = char(27):&#039;W&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = btbk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;I&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f1  ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;@&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f2  ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;A&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f3  ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;B&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f4  ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;C&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f5  ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;D&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f6  ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;E&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f7  ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;F&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f8  ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;G&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f9  ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;H&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f10 ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;I&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f11 ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;J&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f12 ; eseq&amp;lt;-1&amp;gt; = char(1):&#039;K&#039;:char(13)&lt;br /&gt;
* ADDS-type terminals&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f1  ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;1&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f2  ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;2&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f3  ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;3&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f4  ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;4&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f5  ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;5&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f6  ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;6&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f7  ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;7&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f8  ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;8&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f9  ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;9&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f10 ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;:&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f11 ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;;&#039;:char(13)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f12 ; eseq&amp;lt;-1&amp;gt; = char(2):&#039;&amp;lt;&#039;:char(13)&lt;br /&gt;
* xterm type - like my ASUS eeePC&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = bspk ; eseq&amp;lt;-1&amp;gt; = char(127)&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = delk ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[3;2~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = f5   ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[15~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf1  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;O2P&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf2  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;O2Q&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf3  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;O2R&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf4  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;O2S&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf5  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[15;2~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf6  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[17;2~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf7  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[18;2~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf8  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[19;2~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf9  ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[20;2~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf10 ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[21;2~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf11 ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[23;2~&#039;&lt;br /&gt;
     keyd&amp;lt;-1&amp;gt; = sf12 ; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[24;2~&#039;&lt;br /&gt;
* Now do terminal-specific settings&lt;br /&gt;
* VT-type terminals&lt;br /&gt;
     if termtype[1,2] eq &#039;VT&#039; or termtype[1,5] eq &#039;XTERM&#039; then&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = lark; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[D&#039;&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = lark; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OD&#039;&lt;br /&gt;
     end else&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = insk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[D&#039;&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = deck; eseq&amp;lt;-1&amp;gt; = char(27):&#039;OD&#039;&lt;br /&gt;
     end&lt;br /&gt;
* Wyse-type terminals&lt;br /&gt;
     if termtype[1,2] eq &#039;WY&#039; then&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = lark; eseq&amp;lt;-1&amp;gt; = char(8)&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = rark; eseq&amp;lt;-1&amp;gt; = char(12)&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = uark; eseq&amp;lt;-1&amp;gt; = char(11)&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = btbk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;O&#039; ;* !&lt;br /&gt;
     end&lt;br /&gt;
*  for my lttle ASUS eeePC &amp;amp; Linux - What a cool thing it is!&lt;br /&gt;
     if index(termtype,&#039;EEEPC&#039;,1) then&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = chok; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[2H&#039; ;* Shift-Home actually&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = homk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[H&#039;&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = endk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[F&#039;&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = insk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[2~&#039;&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = deck; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[3~&#039;&lt;br /&gt;
     end else&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = homk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[2~&#039;&lt;br /&gt;
        keyd&amp;lt;-1&amp;gt; = endk; eseq&amp;lt;-1&amp;gt; = char(27):&#039;[3~&#039;&lt;br /&gt;
     end&lt;br /&gt;
* Populate the escape sequence test variables&lt;br /&gt;
     base = &#039;&#039;; full = &#039;&#039;&lt;br /&gt;
     amax = dcount(eseq,am)&lt;br /&gt;
     for anum = 1 to amax&lt;br /&gt;
        temp = eseq&amp;lt;anum&amp;gt;&lt;br /&gt;
        if len(temp) le 1 then continue&lt;br /&gt;
        locate(temp[1,1],base;post) else&lt;br /&gt;
           post = dcount(base,am)+1&lt;br /&gt;
        end&lt;br /&gt;
        base&amp;lt;post&amp;gt; = temp[1,1]&lt;br /&gt;
        full&amp;lt;post,-1&amp;gt; = temp&lt;br /&gt;
     next anum&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
outline:&lt;br /&gt;
* to display logic simplisticly&lt;br /&gt;
     rest = oconv(rest,&#039;MCU&#039;)&lt;br /&gt;
     if index(rest,&#039;*&#039;,1) then rest = &#039;CEPS&#039;&lt;br /&gt;
     bot = here + 1&lt;br /&gt;
     if bot gt last then bot = 1&lt;br /&gt;
     if numb then msup = here + numb else msup = last&lt;br /&gt;
     if msup gt last then msup = last&lt;br /&gt;
     for here = bot to msup&lt;br /&gt;
        gosub get.line&lt;br /&gt;
        gosub find.label&lt;br /&gt;
        line = &#039; &#039;:upcase(line)&lt;br /&gt;
        begin case&lt;br /&gt;
           case chit eq &#039;*&#039; or chit eq &#039;!&#039; ; line = &#039;&#039;&lt;br /&gt;
           case index(line,&#039; GOTO &#039;,1)&lt;br /&gt;
           case index(line,&#039; GO &#039;,1)&lt;br /&gt;
           case index(line,&#039; GOSUB &#039;,1)&lt;br /&gt;
           case rest eq &#039;&#039; ; line = &#039;&#039;&lt;br /&gt;
           case index(rest,&#039;C&#039;,1) and index(line,&#039; &#039;:&#039;CALL&#039;,1)&lt;br /&gt;
           case index(rest,&#039;E&#039;,1) and index(line,&#039; &#039;:&#039;EXECUTE&#039;,1)&lt;br /&gt;
           case index(rest,&#039;P&#039;,1) and index(line,&#039; &#039;:&#039;PERFORM&#039;,1)&lt;br /&gt;
           case index(rest,&#039;S&#039;,1) and index(line,&#039; &#039;:&#039;CASE&#039;,1)&lt;br /&gt;
           case 1 ; line = &#039;&#039;&lt;br /&gt;
        end case&lt;br /&gt;
        if temp ne &#039;&#039; or line ne &#039;&#039; then gosub display.line&lt;br /&gt;
     next here&lt;br /&gt;
     return&lt;br /&gt;
&lt;br /&gt;
getshowline:&lt;br /&gt;
     if unassigned(puncs) then&lt;br /&gt;
&lt;br /&gt;
        puncs = &#039;, []()&amp;lt;&amp;gt;=+-/*:#!&#039;&lt;br /&gt;
&lt;br /&gt;
        funcs  = &#039;ABS\ABSS\ACOS\ADDS\ALPHA\ANDS\ASCII\ASIN\ASSIGNED\&#039;&lt;br /&gt;
        funcs := &#039;ATAN\BITAND\BITNOT\BITOR\BITRESET\BITSET\BITTEST\&#039;&lt;br /&gt;
        funcs := &#039;BITXOR\CATS\CHANGE\CHAR\CHARS\CHECKSUM\COL1\COL2\&#039;&lt;br /&gt;
        funcs := &#039;CONTINUE\CONVERT\COS\COSH\COUNT\COUNTS\DATE\DCOUNT\&#039;&lt;br /&gt;
        funcs := &#039;DELETE\DIV\DIVS\DOWNCASE\DQUOTE\DTX\EBCDIC\EQS\&#039;&lt;br /&gt;
        funcs := &#039;EREPLACE\EXCHANGE\EXP\EXTRACT\FADD\FDIV\FFIX\FFLT\&#039;&lt;br /&gt;
        funcs := &#039;FIELD\FIELDS\FIELDSTORE\FILEINFO\FIX\FMT\FMTDP\&#039;&lt;br /&gt;
        funcs := &#039;FMTS\FMTSDP\FMUL\FOLD\FOLDDP\FSUB\GES\GET\&#039;&lt;br /&gt;
        funcs := &#039;GETLOCALE\GETREM\GROUP\GTS\ICHECK\ICONV\ICONVS\&#039;&lt;br /&gt;
        funcs := &#039;IFS\ILPROMPT\INDEX\INDEXS\INDICES\INMAT\INSERT\INT\&#039;&lt;br /&gt;
        funcs := &#039;ISNULL\ISNULLS\ITYPE\KEYIN\LEFT\LEN\LENDP\LENS\&#039;&lt;br /&gt;
        funcs := &#039;LENSDP\LES\LN\LOWER\LTS\MATCHFIELD\MAXIMUM\MINIMUM\&#039;&lt;br /&gt;
        funcs := &#039;MOD\MODS\MULS\NEG\NEGS\NES\NOT\NOTS\NUM\NUMS\OCONV\&#039;&lt;br /&gt;
        funcs := &#039;OCONVS\ORS\PWR\QUOTE\RAISE\REAL\RECORDLOCKED\REM\&#039;&lt;br /&gt;
        funcs := &#039;REMOVE\REPLACE\REUSE\RIGHT\RND\RPC.CALL\RPC.CONNECT\&#039;&lt;br /&gt;
        funcs := &#039;RPC.DISCONNECT\SADD\SCMP\SDIV\SEEK\SELECTINFO\SEND\&#039;&lt;br /&gt;
        funcs := &#039;SENTENCE\SEQ\SEQS\SETLOCALE\SIN\SINH\SLEEP\SMUL\&#039;&lt;br /&gt;
        funcs := &#039;SOUNDEX\SPACE\SPACES\SPLICE\SQRT\SQUOTE\SSUB\STATUS\&#039;&lt;br /&gt;
        funcs := &#039;STR\STRS\SUBR\SUBS\SUBSTRINGS\SUM\SUMMATION\SYSTEM\&#039;&lt;br /&gt;
        funcs := &#039;TAN\TANH\TERMINFO\TIME\TIMEDATE\TPARM\TRANS\TRIM\&#039;&lt;br /&gt;
        funcs := &#039;TRIMB\TRIMBS\TRIMF\TRIMFS\TRIMS\UNASSIGNED\&#039;&lt;br /&gt;
        funcs := &#039;UNICHAR\UPCASE\XLATE\XTD&#039;&lt;br /&gt;
        convert &#039;\&#039; to @am in funcs&lt;br /&gt;
&lt;br /&gt;
        keywords  = &#039;ABORT\AUTHORIZATION\AUXMAP\BEGIN\BREAK\BSCAN\&#039;&lt;br /&gt;
        keywords := &#039;BYTE\BYTELEN\BYTETYPE\BYTEVAL\CALL\CASE\CHAIN\&#039;&lt;br /&gt;
        keywords := &#039;CLEAR\CLEARDATA\CLEARFILE\CLEARPROMPTS\CLEARSELECT\&#039;&lt;br /&gt;
        keywords := &#039;CLOSE\CLOSESEQ\COMMIT\COMMON\COMPARE\CONSTANTS\&#039;&lt;br /&gt;
        keywords := &#039;CONVERT\CREATE\CRT\DATA\DEBUG\DEFFUN\DEL\DELETE\&#039;&lt;br /&gt;
        keywords := &#039;DELETELIST\DELETEU\DIM\DIMENSION\DISPLAY\DO\ECHO\ELSE\&#039;&lt;br /&gt;
        keywords := &#039;END\ENTER\EQU\EQUATE\ERRMSG\EXECUTE\EXIT\FILELOCK\&#039;&lt;br /&gt;
        keywords := &#039;FILEUNLOCK\FIND\FINDSTR\FLUSH\FOOTING\FOR\FORMLIST\&#039;&lt;br /&gt;
        keywords := &#039;FUNCTION\GET\GETLIST\GETX\GO\GOSUB\GOTO\GROUPSTORE\&#039;&lt;br /&gt;
        keywords := &#039;HEADING\HUSH\IF\INCLUDE\INPUT\INPUTCLEAR\INPUTDISP\&#039;&lt;br /&gt;
        keywords := &#039;INPUTDP\INPUTERR\INPUTIF\INPUTNULL\INPUTTRAP\INS\&#039;&lt;br /&gt;
        keywords := &#039;KEYEDIT\KEYEXIT\KEYTRAP\LET\LOCALEINFO\LOCATE\LOCK\&#039;&lt;br /&gt;
        keywords := &#039;LOOP\MAT\MATBUILD\MATCH\MATCHES\MATPARSE\MATREAD\MATREADL\&#039;&lt;br /&gt;
        keywords := &#039;MATREADU\MATWRITE\MATWRITEU\NAP\NEXT\NOBUF\NULL\&#039;&lt;br /&gt;
        keywords := &#039;NUMERIC.DATA\ON\OPEN\OPENCHECK\OPENDEV\OPENPATH\&#039;&lt;br /&gt;
        keywords := &#039;OPENSEQ\PAGE\PERFORM\PRECISION\PRINT\PRINTER\&#039;&lt;br /&gt;
        keywords := &#039;PRINTERR\PROCREAD\PROCWRITE\PROGRAM\PROMPT\&#039;&lt;br /&gt;
        keywords := &#039;RANDOMIZE\READ\READBLK\READL\READLIST\READNEXT\&#039;&lt;br /&gt;
        keywords := &#039;READSEQ\READT\READU\READV\READVL\READVU\RECORDLOCK\&#039;&lt;br /&gt;
        keywords := &#039;RELEASE\REM\REMOVE\REPEAT\RETURN\REVREMOVE\REWIND\&#039;&lt;br /&gt;
        keywords := &#039;ROLLBACK\SEEK\SELECT\SELECTE\SELECTINDEX\SETREM\&#039;&lt;br /&gt;
        keywords := &#039;SSELECT\START\STATUS\STOP\STORAGE\SUBROUTINE\&#039;&lt;br /&gt;
        keywords := &#039;TABSTOP\THEN\TIMEOUT\TO\TPRINT\TRANSACTION\TTYCTL\&#039;&lt;br /&gt;
        keywords := &#039;TTYGET\TTYSET\UNICHARS\UNISEQ\UNISEQS\UNLOCK\UNTIL\&#039;&lt;br /&gt;
        keywords := &#039;UPRINT\WEOF\WEOFSEQ\WRITE\WRITEBLK\WRITELIST\&#039;&lt;br /&gt;
        keywords := &#039;WRITESEQ\WRITESEQF\WRITET\WRITEU\WRITEV\WRITEVU&#039;&lt;br /&gt;
        convert &#039;\&#039; to @am in keywords&lt;br /&gt;
&lt;br /&gt;
        si.label     = 1&lt;br /&gt;
        si.comment   = 2&lt;br /&gt;
        si.string    = 3&lt;br /&gt;
        si.key       = 4&lt;br /&gt;
        si.operator  = 5&lt;br /&gt;
        si.function  = 6&lt;br /&gt;
        si.directive = 7&lt;br /&gt;
        si.highlight = 8&lt;br /&gt;
        si.doc       = 9&lt;br /&gt;
        bi.hiword   = 10&lt;br /&gt;
&lt;br /&gt;
* Highlights for HostAccess&lt;br /&gt;
        bo = @(-58) ; bf = @(-59)&lt;br /&gt;
        wo = @(-5)  ; wf = @(-6)&lt;br /&gt;
        ro = @(-13) ; rf = @(-12)&lt;br /&gt;
        uo = @(-15) ; uf = @(-12)&lt;br /&gt;
        hi.commenton  = uo:bo&lt;br /&gt;
        hi.commentoff = uf:bf&lt;br /&gt;
        hi.labelon    = bo&lt;br /&gt;
        hi.labeloff   = bf&lt;br /&gt;
        hi.selecton   = ro:wo&lt;br /&gt;
        hi.selectoff  = wf:rf&lt;br /&gt;
        hi.stringon   = wo&lt;br /&gt;
        hi.stringoff  = wf&lt;br /&gt;
        hi.keyon      = uo&lt;br /&gt;
        hi.keyoff     = uf&lt;br /&gt;
        hi.opon       = &#039;&#039;&lt;br /&gt;
        hi.opoff      = &#039;&#039;&lt;br /&gt;
        hi.funcon     = bo&lt;br /&gt;
        hi.funcoff    = bf&lt;br /&gt;
        hi.diron      = wo&lt;br /&gt;
        hi.diroff     = wf&lt;br /&gt;
        hi.docon      = ro:bo&lt;br /&gt;
        hi.docoff     = rf:bf&lt;br /&gt;
&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
     l = len(line)&lt;br /&gt;
* If the line is too long, don&#039;t colourise it&lt;br /&gt;
     if l gt 2000 then&lt;br /&gt;
        showline = line[setoff,width]&lt;br /&gt;
        return&lt;br /&gt;
     end&lt;br /&gt;
     myline = line&lt;br /&gt;
     oldmyline = myline&lt;br /&gt;
     myline = trimf(myline)&lt;br /&gt;
     mask = space(l - len(myline))&lt;br /&gt;
&lt;br /&gt;
     word = myline[&#039; &#039;,1,1]&lt;br /&gt;
     if word[&#039; &#039;,1,1] match &#039;1N0N&#039; or word match &#039;1A0X&amp;quot;:&amp;quot;&#039; then&lt;br /&gt;
        mask := str(si.label,len(word)):&#039; &#039;&lt;br /&gt;
        myline = myline[&#039; &#039;,2,999]&lt;br /&gt;
        word = myline[&#039; &#039;,1,1]&lt;br /&gt;
     end&lt;br /&gt;
     begin case&lt;br /&gt;
        case word[1,1] eq &#039;*&#039; or word[1,1] eq &#039;!&#039;&lt;br /&gt;
           if count(myline,&#039;@@&#039;) then&lt;br /&gt;
              mask := str(si.doc, l)&lt;br /&gt;
           end else&lt;br /&gt;
              mask := str(si.comment, l)&lt;br /&gt;
           end&lt;br /&gt;
        case word[1,1] eq &#039;$&#039; or word[1,1] eq &#039;#&#039;&lt;br /&gt;
           mask := str(si.directive, l)&lt;br /&gt;
        case 1&lt;br /&gt;
           dc = count(myline,&#039;;&#039;)&lt;br /&gt;
           if not(dc) then&lt;br /&gt;
              mask := space(l)&lt;br /&gt;
           end else&lt;br /&gt;
              foundcomment = false&lt;br /&gt;
              for z = 1 to dc until foundcomment&lt;br /&gt;
                 word = trimf(myline[&#039;;&#039;,z+1,1])&lt;br /&gt;
                 if word[1,1] eq &#039;*&#039; or word[1,1] eq &#039;!&#039; then&lt;br /&gt;
                    foundcomment = z&lt;br /&gt;
                 end&lt;br /&gt;
              next&lt;br /&gt;
              if foundcomment then&lt;br /&gt;
                 mask := space(len(myline[&#039;;&#039;,1, foundcomment])):str(si.comment, l)&lt;br /&gt;
              end else&lt;br /&gt;
                 mask := space(l)&lt;br /&gt;
              end&lt;br /&gt;
           end&lt;br /&gt;
     end case&lt;br /&gt;
     lin = convert(puncs,str(@fm,len(puncs)), upcase(oldmyline))&lt;br /&gt;
     dc3 = dcount(lin,@fm)&lt;br /&gt;
     for q = 1 to dc3&lt;br /&gt;
        word = lin[@fm,q,1]&lt;br /&gt;
        st = col1()+ 1&lt;br /&gt;
        if st gt 1 then&lt;br /&gt;
           if mask[st-1,1] eq &#039; &#039; and oldmyline[st-1,1] ne &#039; &#039; then&lt;br /&gt;
              mask[st-1,1] = si.operator           ; * operators too&lt;br /&gt;
           end&lt;br /&gt;
        end&lt;br /&gt;
        begin case&lt;br /&gt;
           case word[1,1] eq &#039;&amp;quot;&#039;&lt;br /&gt;
              ix = index(lin[st+1,huge],&#039;&amp;quot;&#039;,1)&lt;br /&gt;
              if ix then&lt;br /&gt;
                 if mask[st,1] eq &#039; &#039; then&lt;br /&gt;
                    q = dcount(lin[1, ix+st],@fm)&lt;br /&gt;
                    mask[st, ix+1] = str(si.string, ix+1)&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
           case word[1,1] eq &amp;quot;&#039;&amp;quot;&lt;br /&gt;
              ix = index(lin[st+1,huge],&amp;quot;&#039;&amp;quot;,1)&lt;br /&gt;
              if ix then&lt;br /&gt;
                 if mask[st,1] eq &#039; &#039; then&lt;br /&gt;
                    q = dcount(lin[1, ix+st],@fm)&lt;br /&gt;
                    mask[st, ix+1] = str(si.string, ix+1)&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
           case 1&lt;br /&gt;
              locate(word,keywords;dpos;&#039;AL&#039;) then&lt;br /&gt;
                 if mask[st,1] eq &#039; &#039; then&lt;br /&gt;
                    mask[st, len(word)] = str(si.key, len(word))&lt;br /&gt;
                 end&lt;br /&gt;
              end else&lt;br /&gt;
                 locate(word,funcs;dpos;&#039;AL&#039;) then&lt;br /&gt;
* Functions are followed by a bracket&lt;br /&gt;
                    brak = &#039;&#039;&lt;br /&gt;
                    fpos = len(lin[@fm,1,q])+1&lt;br /&gt;
                    if fpos then brak = trim(oldmyline[fpos,999])[1,1]&lt;br /&gt;
                    if brak eq &#039;(&#039; and mask[st,1] eq &#039; &#039; then&lt;br /&gt;
                       mask[st,len(word)] = str(si.function, len(word))&lt;br /&gt;
                    end&lt;br /&gt;
                 end&lt;br /&gt;
              end&lt;br /&gt;
        end case&lt;br /&gt;
     next&lt;br /&gt;
&lt;br /&gt;
     word = lastfind&lt;br /&gt;
     if word ne &#039;&#039; then&lt;br /&gt;
        oc = 1&lt;br /&gt;
        loop&lt;br /&gt;
           if caseflag&lt;br /&gt;
              then ix = index(oldmyline,word,oc)&lt;br /&gt;
              else ix = index(upcase(oldmyline),upcase(word),oc)&lt;br /&gt;
        while ix do&lt;br /&gt;
           oc += 1&lt;br /&gt;
           mask[ix, len(word)] = str(si.highlight, len(word))&lt;br /&gt;
        repeat&lt;br /&gt;
     end&lt;br /&gt;
&lt;br /&gt;
     myline = oldmyline[setoff,width]&lt;br /&gt;
     mask = mask[setoff,width]&lt;br /&gt;
     showline = &#039;&#039;&lt;br /&gt;
     old = &#039;&#039;&lt;br /&gt;
     l = len(myline)&lt;br /&gt;
     for k = 1 to l&lt;br /&gt;
        c = mask[k,1]&lt;br /&gt;
        if c ne old then&lt;br /&gt;
           begin case&lt;br /&gt;
              case old eq si.label&lt;br /&gt;
                 showline := hi.labeloff&lt;br /&gt;
              case old eq si.comment&lt;br /&gt;
                 showline := hi.commentoff&lt;br /&gt;
              case old eq si.key&lt;br /&gt;
                 showline := hi.keyoff&lt;br /&gt;
              case old eq si.string&lt;br /&gt;
                 showline := hi.stringoff&lt;br /&gt;
              case old eq si.key&lt;br /&gt;
                 showline := hi.keyoff&lt;br /&gt;
              case old eq si.operator&lt;br /&gt;
                 showline := hi.opoff&lt;br /&gt;
              case old eq si.function&lt;br /&gt;
                 showline := hi.funcoff&lt;br /&gt;
              case old eq si.directive&lt;br /&gt;
                 showline := hi.diroff&lt;br /&gt;
              case old eq si.highlight&lt;br /&gt;
                 showline := hi.selectoff&lt;br /&gt;
           end case&lt;br /&gt;
           begin case&lt;br /&gt;
              case c eq si.label&lt;br /&gt;
                 showline := hi.labelon&lt;br /&gt;
              case c eq si.comment&lt;br /&gt;
                 showline := hi.commenton&lt;br /&gt;
              case c eq si.key&lt;br /&gt;
                 showline := hi.keyon&lt;br /&gt;
              case c eq si.string&lt;br /&gt;
                 showline := hi.stringon&lt;br /&gt;
              case c eq si.operator&lt;br /&gt;
                 showline := hi.opon&lt;br /&gt;
              case c eq si.function&lt;br /&gt;
                 showline := hi.funcon&lt;br /&gt;
              case c eq si.directive&lt;br /&gt;
                 showline := hi.diron&lt;br /&gt;
              case c eq si.highlight&lt;br /&gt;
                 showline := hi.selecton&lt;br /&gt;
              case c eq si.doc&lt;br /&gt;
                 showline := hi.docon&lt;br /&gt;
           end case&lt;br /&gt;
           old = mask[k,1]&lt;br /&gt;
        end&lt;br /&gt;
        showline := myline[k,1]&lt;br /&gt;
     next&lt;br /&gt;
     begin case&lt;br /&gt;
        case old eq si.label&lt;br /&gt;
           showline := hi.labeloff&lt;br /&gt;
        case old eq si.comment&lt;br /&gt;
           showline := hi.commentoff&lt;br /&gt;
        case old eq si.key&lt;br /&gt;
           showline := hi.keyoff&lt;br /&gt;
        case old eq si.string&lt;br /&gt;
           showline := hi.stringoff&lt;br /&gt;
        case old eq si.function&lt;br /&gt;
           showline := hi.funcoff&lt;br /&gt;
        case old eq si.operator&lt;br /&gt;
           showline := hi.opoff&lt;br /&gt;
        case old eq si.directive&lt;br /&gt;
           showline := hi.diroff&lt;br /&gt;
        case old eq si.highlight&lt;br /&gt;
           showline := hi.selectoff&lt;br /&gt;
        case old eq si.doc&lt;br /&gt;
           showline := hi.docoff&lt;br /&gt;
     end case&lt;br /&gt;
     return&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2679</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2679"/>
		<updated>2024-10-09T22:23:13Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to [[Pickwiki.org]]&lt;br /&gt;
* [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* Resources for learning more about MV available at: [https://www.pickmultivalue.com/ www.pickmultivalue.com]&lt;br /&gt;
* Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree]&lt;br /&gt;
* Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by Zumasys and community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2678</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2678"/>
		<updated>2024-10-09T22:21:56Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* Following the Rocket acquisition of Zumasys, Pickwiki.com has been migrated to Pickwiki.org&lt;br /&gt;
* [https://www.rocketsoftware.com/news/rocket-software-acquires-database-and-tools-products-zumasys-inc-companies-partner-drive/ Rocket acquires jBASE, Accuterm, and MultiValue Tools from Zumasys]&lt;br /&gt;
* [https://www.facebook.com/multivaluegroup/ Pick MultiValue Facebook Community]&lt;br /&gt;
* Resources for learning more about MV available at: [https://www.pickmultivalue.com/ www.pickmultivalue.com]&lt;br /&gt;
* Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree]&lt;br /&gt;
* Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* [http://www.zumasys.com/admin/zumasys-acquires-jBASE-database/ Zumasys acquires jBASE!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by Zumasys and community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Talk:How-To_Improve_Large_String_Performance_Using_Buffers&amp;diff=2672</id>
		<title>Talk:How-To Improve Large String Performance Using Buffers</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Talk:How-To_Improve_Large_String_Performance_Using_Buffers&amp;diff=2672"/>
		<updated>2020-10-01T17:30:57Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add nowiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If the final destination for the data (BUFFER in this example) is a file, I tend to use WRITESEQ APPEND to directly send the data there.  In my application it would be unusual to store a 12MB record in a hashed file..&lt;br /&gt;
&lt;br /&gt;
The opposite problem is having a large string that you need to process. I convert any delimiters to @AM or @VM, then use the REMOVE trick to make stepping through the string orders of magnitude faster.  E.g.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;READ BUFFER FROM ..&lt;br /&gt;
LOOP&lt;br /&gt;
  REMOVE NEXT.VAL FROM BUFFER SETTING MORE&lt;br /&gt;
WHILE MORE DO&lt;br /&gt;
  GOSUB PROCESS.NEXT.VAL&lt;br /&gt;
REPEAT&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instead of&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;READ BUFFER FROM ..&lt;br /&gt;
MAX=DCOUNT(BUFFER,@AM)&lt;br /&gt;
FOR I=1 TO MAX&lt;br /&gt;
  NEXT.VAL=BUFFER&amp;lt;I&amp;gt;&lt;br /&gt;
  GOSUB PROCESS.NEXT.VAL&lt;br /&gt;
NEXT I&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Talk:How-To_Improve_Large_String_Performance_Using_Buffers&amp;diff=2671</id>
		<title>Talk:How-To Improve Large String Performance Using Buffers</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Talk:How-To_Improve_Large_String_Performance_Using_Buffers&amp;diff=2671"/>
		<updated>2020-10-01T17:28:58Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Created page with &amp;quot;If the final destination for the data (BUFFER in this example) is a file, I tend to use WRITESEQ APPEND to directly send the data there.  In my application it would be unusual...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If the final destination for the data (BUFFER in this example) is a file, I tend to use WRITESEQ APPEND to directly send the data there.  In my application it would be unusual to store a 12MB record in a hashed file..&lt;br /&gt;
&lt;br /&gt;
The opposite problem is having a large string that you need to process. I convert any delimiters to @AM or @VM, then use the REMOVE trick to make stepping through the string orders of magnitude faster.  E.g.&lt;br /&gt;
&lt;br /&gt;
READ BUFFER FROM ..&lt;br /&gt;
LOOP&lt;br /&gt;
  REMOVE NEXT.VAL FROM BUFFER SETTING MORE&lt;br /&gt;
WHILE MORE DO&lt;br /&gt;
  GOSUB PROCESS.NEXT.VAL&lt;br /&gt;
REPEAT&lt;br /&gt;
&lt;br /&gt;
instead of&lt;br /&gt;
&lt;br /&gt;
READ BUFFER FROM ..&lt;br /&gt;
MAX=DCOUNT(BUFFER,@AM)&lt;br /&gt;
FOR I=1 TO MAX&lt;br /&gt;
  NEXT.VAL=BUFFER&amp;lt;I&amp;gt;&lt;br /&gt;
  GOSUB PROCESS.NEXT.VAL&lt;br /&gt;
NEXT I&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Talk:Main_Page&amp;diff=2666</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Talk:Main_Page&amp;diff=2666"/>
		<updated>2020-07-03T20:19:02Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: /* How many edits before account moderation is removed? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Pickwiki TODO ideas ==&lt;br /&gt;
&lt;br /&gt;
* Stop bot registrations&lt;br /&gt;
** This appears to be under control?&lt;br /&gt;
* Cleanup mass bot registrations&lt;br /&gt;
** This is going to be a chore to do manually - a mass update to the mysql db appears to be best practice&lt;br /&gt;
* Smoother enrollment process for &amp;quot;real&amp;quot; users&lt;br /&gt;
** This seems to be working fine, apart from confusion around the moderation process&lt;br /&gt;
* Clearer roles and responsibilities:&lt;br /&gt;
** Bureaucrats (aka Security Admins)&lt;br /&gt;
** Editors&lt;br /&gt;
** Moderators&lt;br /&gt;
** Approving new users&lt;br /&gt;
** Other roles?&lt;br /&gt;
&lt;br /&gt;
== How many edits before account moderation is removed? ==&lt;br /&gt;
&lt;br /&gt;
Hi. How many edits do I have to make to the wiki before the moderation is removed from my account? I hope people can see my edits are trying to be useful as opposed to spam/vandalism/whatever. [[User:SJK|SJK]] ([[User talk:SJK|talk]]) 11:26, 20 June 2020 (UTC)&lt;br /&gt;
&lt;br /&gt;
Hey, just one, it&#039;s a manual process to remove someone from the moderated list. Sadly there is far more spam than useful edits, but yours are definitely in that category and you are no longer moderated.  Thanks for your contributions, and sorry for the delay -- Ian&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Talk:CodingStandards&amp;diff=2663</id>
		<title>Talk:CodingStandards</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Talk:CodingStandards&amp;diff=2663"/>
		<updated>2020-06-18T23:56:48Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Using a code formatter ==&lt;br /&gt;
&lt;br /&gt;
One general statement - it&#039;s one thing to write a document that all programmers on your system *should* follow. To make sure all these great ideas *are* followed, I&#039;d encourage creating a formatter/linter/pre-compiler specific to your needs and embedding that in your pipeline for moving code from dev-&amp;gt;test-&amp;gt;prod. Not everything can be enforced, but hard and fast rules can and should be automatically applied.&lt;br /&gt;
&lt;br /&gt;
== Ternary assignment preferred ==&lt;br /&gt;
&lt;br /&gt;
Regarding 2.10 &amp;quot;Avoid using obscure and unfamiliar coding styles&amp;quot;, the example shows ternary assignment as &amp;quot;BAD&amp;quot;; that is, obscure and unfamiliar to most PICK programmers. I actually prefer to use ternary assignment instead of multi-line IF-THEN-ELSE logic. Ternary assignment helps to avoid the error where the variable name is mis-typed in the ELSE clause.&lt;br /&gt;
&lt;br /&gt;
== Passing an argument by value ==&lt;br /&gt;
&lt;br /&gt;
Regarding 5.7 &amp;quot;Variables passed to subroutines can be passed by value&amp;quot;, scalar variables can be wrapped in parentheses to pass by value, but an array element cannot. Calling &amp;lt;code&amp;gt;FMTPHONE((CM.REC(CM$PHONE)))&amp;lt;/code&amp;gt; will pass a pointer reference to the array element, not a copy of its value, so the array element&#039;s value may be changed by the subroutine/function.&lt;br /&gt;
&lt;br /&gt;
A better way to ensure an argument is passed by value is to prepend or append an empty string.&lt;br /&gt;
&lt;br /&gt;
  CALL FMTPHONE(&amp;quot;&amp;quot;:CM.REC(CM$PHONE))&lt;br /&gt;
&lt;br /&gt;
This can be made more explicit with an equate:&lt;br /&gt;
&lt;br /&gt;
  EQU BYVAL LIT \ &amp;quot;&amp;quot;: \&lt;br /&gt;
  CALL FMTPHONE(BYVAL CM.REC(CM$PHONE))&lt;br /&gt;
&lt;br /&gt;
This EQU BYVAL is too magical for my taste - it looks very much like a built-in language feature. The idea of passing-by-value is really good, I&#039;ve had many bugs caused by not doing this.&lt;br /&gt;
&lt;br /&gt;
== 3.1. Generous use of whitespace makes programs easier to read, and makes blocks of code stand out. Use extra blank lines instead of *&#039;s, which clutter up programs.==&lt;br /&gt;
&lt;br /&gt;
I used to agree with this when I was an IT&#039;er who spent years at one job. Now I&#039;m consulting, hopping from machine to machine like a gadfly, it&#039;s really handy to be able to ED BP PROGNAME and paste the entire program in quickly. Blank lines prevent that. It&#039;s a matter of taste, but there are good reasons for eschewing blanks. I changed my code formatter to enforce that: https://github.com/ianmcgowan/SCI.BP/blob/master/BFORMAT&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Talk:CodingStandards&amp;diff=2662</id>
		<title>Talk:CodingStandards</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Talk:CodingStandards&amp;diff=2662"/>
		<updated>2020-06-17T23:04:30Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Using a code formatter ==&lt;br /&gt;
&lt;br /&gt;
One general statement - it&#039;s one thing to write a document that all programmers on your system *should* follow. To make sure all these great ideas *are* followed, I&#039;d encourage creating a formatter/linter/pre-compiler specific to your needs and embedding that in your pipeline for moving code from dev-&amp;gt;test-&amp;gt;prod. Not everything can be enforced, but hard and fast rules can and should be automatically applied.&lt;br /&gt;
&lt;br /&gt;
== Ternary assignment preferred ==&lt;br /&gt;
&lt;br /&gt;
Regarding 2.10 &amp;quot;Avoid using obscure and unfamiliar coding styles&amp;quot;, the example shows ternary assignment as &amp;quot;BAD&amp;quot;; that is, obscure and unfamiliar to most PICK programmers. I actually prefer to use ternary assignment instead of multi-line IF-THEN-ELSE logic. Ternary assignment helps to avoid the error where the variable name is mis-typed in the ELSE clause.&lt;br /&gt;
&lt;br /&gt;
== Passing an argument by value ==&lt;br /&gt;
&lt;br /&gt;
Regarding 5.7 &amp;quot;Variables passed to subroutines can be passed by value&amp;quot;, scalar variables can be wrapped in parentheses to pass by value, but an array element cannot. Calling &amp;lt;code&amp;gt;FMTPHONE((CM.REC(CM$PHONE)))&amp;lt;/code&amp;gt; will pass a pointer reference to the array element, not a copy of its value, so the array element&#039;s value may be changed by the subroutine/function.&lt;br /&gt;
&lt;br /&gt;
A better way to ensure an argument is passed by value is to prepend or append an empty string.&lt;br /&gt;
&lt;br /&gt;
  CALL FMTPHONE(&amp;quot;&amp;quot;:CM.REC(CM$PHONE))&lt;br /&gt;
&lt;br /&gt;
This can be made more explicit with an equate:&lt;br /&gt;
&lt;br /&gt;
  EQU BYVAL LIT \ &amp;quot;&amp;quot;: \&lt;br /&gt;
  CALL FMTPHONE(BYVAL CM.REC(CM$PHONE))&lt;br /&gt;
&lt;br /&gt;
This EQU BYVAL is too magical for my taste - it looks very much like a built-in language feature. The idea of passing-by-value is really good, I&#039;ve had many bugs caused by not doing this.&lt;br /&gt;
&lt;br /&gt;
== 3.1. Generous use of whitespace makes programs easier to read, and makes blocks of code stand out. Use extra blank lines instead of *&#039;s, which clutter up programs.==&lt;br /&gt;
&lt;br /&gt;
I used to agree with this when I was an IT&#039;er who spent years at one job. Now I&#039;m consulting, hopping from machine to machine like a gadfly, it&#039;s really handy to be able to ED BP PROGNAME and paste the entire program in quickly. Blank lines prevent that. It&#039;s a matter of test, but there are good reasons for eschewing blanks. I changed my code formatter to enforce that: https://github.com/ianmcgowan/SCI.BP/blob/master/BFORMAT&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Talk:CodingStandards&amp;diff=2661</id>
		<title>Talk:CodingStandards</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Talk:CodingStandards&amp;diff=2661"/>
		<updated>2020-06-17T23:03:10Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Using a code formatter ==&lt;br /&gt;
&lt;br /&gt;
One general statement - it&#039;s one thing to write a document that all programmers on your system *should* follow. To make sure all these great ideas *are* followed, I&#039;d encourage creating a formatter/linter/pre-compiler specific to your needs and embedding that in your pipeline for moving code from dev-&amp;gt;test-&amp;gt;prod. Not everything can be enforced, but hard and fast rules can and should be automatically applied.&lt;br /&gt;
&lt;br /&gt;
== Ternary assignment preferred ==&lt;br /&gt;
&lt;br /&gt;
Regarding 2.10 &amp;quot;Avoid using obscure and unfamiliar coding styles&amp;quot;, the example shows ternary assignment as &amp;quot;BAD&amp;quot;; that is, obscure and unfamiliar to most PICK programmers. I actually prefer to use ternary assignment instead of multi-line IF-THEN-ELSE logic. Ternary assignment helps to avoid the error where the variable name is mis-typed in the ELSE clause.&lt;br /&gt;
&lt;br /&gt;
== Passing an argument by value ==&lt;br /&gt;
&lt;br /&gt;
Regarding 5.7 &amp;quot;Variables passed to subroutines can be passed by value&amp;quot;, scalar variables can be wrapped in parentheses to pass by value, but an array element cannot. Calling &amp;lt;code&amp;gt;FMTPHONE((CM.REC(CM$PHONE)))&amp;lt;/code&amp;gt; will pass a pointer reference to the array element, not a copy of its value, so the array element&#039;s value may be changed by the subroutine/function.&lt;br /&gt;
&lt;br /&gt;
A better way to ensure an argument is passed by value is to prepend or append an empty string.&lt;br /&gt;
&lt;br /&gt;
  CALL FMTPHONE(&amp;quot;&amp;quot;:CM.REC(CM$PHONE))&lt;br /&gt;
&lt;br /&gt;
This can be made more explicit with an equate:&lt;br /&gt;
&lt;br /&gt;
  EQU BYVAL LIT \ &amp;quot;&amp;quot;: \&lt;br /&gt;
  CALL FMTPHONE(BYVAL CM.REC(CM$PHONE))&lt;br /&gt;
&lt;br /&gt;
This EQU BYVAL is too magical for my taste - it looks very much like a built-in language feature. The idea of passing-by-value is really good, I&#039;ve had many bugs caused by not doing this.&lt;br /&gt;
&lt;br /&gt;
== 3.1. Generous use of whitespace makes programs easier to read, and makes blocks of code stand out. Use extra blank lines instead of *&#039;s, which clutter up programs.==&lt;br /&gt;
&lt;br /&gt;
I used to agree with this when I was an IT&#039;er who spent years at one job. Now I&#039;m consulting, hopping from machine to machine like a gadfly, it&#039;s really handy to be able to ED BP PROGNAME and paste the entire program in quickly. Blank lines prevent that. I changed my code formatter to enforce that: https://github.com/ianmcgowan/SCI.BP/blob/master/BFORMAT&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Talk:CodingStandards&amp;diff=2660</id>
		<title>Talk:CodingStandards</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Talk:CodingStandards&amp;diff=2660"/>
		<updated>2020-06-17T22:55:08Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ternary assignment preferred ==&lt;br /&gt;
&lt;br /&gt;
Regarding 2.10 &amp;quot;Avoid using obscure and unfamiliar coding styles&amp;quot;, the example shows ternary assignment as &amp;quot;BAD&amp;quot;; that is, obscure and unfamiliar to most PICK programmers. I actually prefer to use ternary assignment instead of multi-line IF-THEN-ELSE logic. Ternary assignment helps to avoid the error where the variable name is mis-typed in the ELSE clause.&lt;br /&gt;
&lt;br /&gt;
== Passing an argument by value ==&lt;br /&gt;
&lt;br /&gt;
Regarding 5.7 &amp;quot;Variables passed to subroutines can be passed by value&amp;quot;, scalar variables can be wrapped in parentheses to pass by value, but an array element cannot. Calling &amp;lt;code&amp;gt;FMTPHONE((CM.REC(CM$PHONE)))&amp;lt;/code&amp;gt; will pass a pointer reference to the array element, not a copy of its value, so the array element&#039;s value may be changed by the subroutine/function.&lt;br /&gt;
&lt;br /&gt;
A better way to ensure an argument is passed by value is to prepend or append an empty string.&lt;br /&gt;
&lt;br /&gt;
  CALL FMTPHONE(&amp;quot;&amp;quot;:CM.REC(CM$PHONE))&lt;br /&gt;
&lt;br /&gt;
This can be made more explicit with an equate:&lt;br /&gt;
&lt;br /&gt;
  EQU BYVAL LIT \ &amp;quot;&amp;quot;: \&lt;br /&gt;
  CALL FMTPHONE(BYVAL CM.REC(CM$PHONE))&lt;br /&gt;
&lt;br /&gt;
This EQU BYVAL is too magical for my taste - it looks very much like a built-in language feature. The idea of passing-by-value is really good, I&#039;ve had many bugs caused by not doing this.&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=User:IanMcGowan&amp;diff=2652</id>
		<title>User:IanMcGowan</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=User:IanMcGowan&amp;diff=2652"/>
		<updated>2020-01-23T21:29:16Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Just Another Pick Hacker...&lt;br /&gt;
&lt;br /&gt;
Currently consulting for finance companies, specializing in Infolease integration, reporting and data-extracts.&lt;br /&gt;
&lt;br /&gt;
More info at http://simbian.org or ian@simbian.org&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=User:IanMcGowan&amp;diff=2651</id>
		<title>User:IanMcGowan</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=User:IanMcGowan&amp;diff=2651"/>
		<updated>2020-01-23T21:28:57Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Just Another Pick Hacker...&lt;br /&gt;
&lt;br /&gt;
Currently consulting for finance companies, specializing in Infolease integration, reporting and data-extracts.&lt;br /&gt;
&lt;br /&gt;
More info at http://simbian.org or ian@simbian.org&lt;br /&gt;
&lt;br /&gt;
[[File:IanMcGowanAvatar.jpg]]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=User:IanMcGowan&amp;diff=2649</id>
		<title>User:IanMcGowan</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=User:IanMcGowan&amp;diff=2649"/>
		<updated>2020-01-03T02:41:36Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Just Another Pick Hacker...&lt;br /&gt;
&lt;br /&gt;
Currently consulting for finance companies, specializing in Infolease integration, reporting and data-extracts.&lt;br /&gt;
&lt;br /&gt;
More info at http://simbian.org or ian@simbian.org&lt;br /&gt;
&lt;br /&gt;
[[File:IanMcGowanAvatar.jpg|200px]]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=User:IanMcGowan&amp;diff=2645</id>
		<title>User:IanMcGowan</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=User:IanMcGowan&amp;diff=2645"/>
		<updated>2019-12-31T19:01:10Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Just Another Pick Hacker...&lt;br /&gt;
&lt;br /&gt;
Currently consulting for finance companies, specializing in Infolease integration, reporting and data-extracts.&lt;br /&gt;
&lt;br /&gt;
More info at http://simbian.org or ian@simbian.org&lt;br /&gt;
&lt;br /&gt;
[[File:IanMcGowanAvatar.jpg]]&lt;br /&gt;
&lt;br /&gt;
[[https://www.pickwiki.com/images/6/68/IanMcGowanAvatar.jpg]]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=File:IanMcGowanAvatar.jpg&amp;diff=2644</id>
		<title>File:IanMcGowanAvatar.jpg</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=File:IanMcGowanAvatar.jpg&amp;diff=2644"/>
		<updated>2019-12-31T18:51:40Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Testing file upload process&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Testing file upload process&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=TclStack&amp;diff=2643</id>
		<title>TclStack</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=TclStack&amp;diff=2643"/>
		<updated>2019-09-13T22:54:12Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Updated with tab completion for commands, file names and dictionaries&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[HomePage]] &amp;gt;&amp;gt; [[BasicSource]] &amp;gt;&amp;gt; [https://github.com/ianmcgowan/SCI.BP/blob/master/STACK Github:]&lt;br /&gt;
&lt;br /&gt;
This program is an attempt to make TCL a more productive place for programmers.  You can edit&lt;br /&gt;
the command stack using standard bash/emacs key-bindings.  There is also a stack of program&lt;br /&gt;
files being worked on and shortcuts for the common operations of editing, compiling, running&lt;br /&gt;
and interacting with version control.&lt;br /&gt;
&lt;br /&gt;
Planned new features include tab-completion on commands, file&lt;br /&gt;
and dictionary names (how to make it quick with thousands of entries is a problem).&lt;br /&gt;
&lt;br /&gt;
The help information gives a good overview of what is currently there (though aliases,&lt;br /&gt;
program token expansion and setting the prompt are extras not mentioned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
            PRINT &#039;Ctrl-A     Start of line     Ctrl-R      Toggle insert mode&#039;&lt;br /&gt;
            PRINT &#039;Ctrl-B     Back one char     Ctrl-W      Delete word&#039;&lt;br /&gt;
            PRINT &#039;Ctrl-D     Delete char       Ctrl-X      Forward word&#039;&lt;br /&gt;
            PRINT &#039;Ctrl-E     End of line       Ctrl-Z      Back word&#039;&lt;br /&gt;
            PRINT &#039;Ctrl-F     Forward char      &#039;&lt;br /&gt;
            PRINT &#039;Ctrl-G     Cancel line       &#039;&lt;br /&gt;
            PRINT &#039;Ctrl-I     Forward word      ~xxx        Search for xxx&#039;&lt;br /&gt;
            PRINT &#039;Ctrl-J     Delete to end     .Lm,n       List entry m thru n&#039;&lt;br /&gt;
            PRINT &#039;Ctrl-M     Accept line       .Rn         Restore entry n, edit&#039;&lt;br /&gt;
            PRINT &#039;Ctrl-N     Next line         .Dm,n       Delete entry m thru n&#039;&lt;br /&gt;
            PRINT &#039;Ctrl-P     Previous line     Q           Quit back to TCL&#039;&lt;br /&gt;
            PRINT&lt;br /&gt;
            PRINT &#039;/   List the program stack   //  List the stack with cvs status&#039;&lt;br /&gt;
            PRINT &#039;[[/Nx]] Add a New program,&#039;&lt;br /&gt;
            PRINT &#039;[[/Ex]] Edit the x`th program    [[/WW]] Edit the program list&#039;&lt;br /&gt;
            PRINT &#039;[[/Wx]] VI the x`th program      [[/S]]  Sort the program stack&#039;&lt;br /&gt;
            PRINT &#039;[[/Bx]] Compile the x`th program [[/BR]] Compile and run&#039;&lt;br /&gt;
            PRINT &#039;[[/CI]] Checkin a program to cvs [[/D]]  Show diff with cvs version&#039;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
:[[GetLineStack]] - a subroutine to allow cursor editing in wy50, vt100&lt;br /&gt;
&lt;br /&gt;
CVS Integration &amp;quot;helpers&amp;quot;&lt;br /&gt;
:[[CvsCheckout]]&lt;br /&gt;
:[[CvsCheckin]]&lt;br /&gt;
:[[CvsLog]]&lt;br /&gt;
:[[CvsList]]&lt;br /&gt;
:[[CvsDiff]]&lt;br /&gt;
:[[CvsStatus]]&lt;br /&gt;
:[[CvsGetDir]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
***************************************************************************&lt;br /&gt;
* Program: STACK&lt;br /&gt;
* Author : Ian McGowan&lt;br /&gt;
* Created: 1989-06-13&lt;br /&gt;
* Updated: 2019-09-13&lt;br /&gt;
* License: (c) 1989-2019 Ian McGowan, released under MIT license&lt;br /&gt;
* Comment: Stacks TCL commands, utilities for programmers&lt;br /&gt;
***************************************************************************&lt;br /&gt;
* https://github.com/ianmcgowan/SCI.BP/blob/master/STACK&lt;br /&gt;
CRT &#039;Version 2019-09 Autocomplete&#039;&lt;br /&gt;
EQUATE INSERT TO &#039;1&#039;,REPLACE TO &#039;-1&#039;,BEEP TO CHAR(7)&lt;br /&gt;
EQUATE RET TO 13, ESC TO 27, UP.KEY TO 1, DOWN.KEY TO 2&lt;br /&gt;
EQUATE PG.UP.KEY TO 21, PG.DOWN.KEY TO 22&lt;br /&gt;
EQUATE NUL TO &#039;&#039;,SPC TO &#039; &#039;,TRUE TO 1, FALSE TO 0&lt;br /&gt;
EQUATE SEARCH TO &#039;~&#039;, UNIX TO &#039;!&#039;&lt;br /&gt;
EQUATE BELL TO CHAR(7), OTHERWISE TO 1&lt;br /&gt;
TERM=UPCASE(GETENV(&amp;quot;TERM&amp;quot;))&lt;br /&gt;
CS=@(-1);EOL=@(-4);EOS=@(-3);UP=@(-10);BON=@(-81);BOFF=@(-82)&lt;br /&gt;
PROMPT NUL&lt;br /&gt;
*&lt;br /&gt;
LONG.LINE = 9999;LIST.DET.FLAG=0;TIME.COMMAND=0&lt;br /&gt;
EXECUTING = FALSE;SL.ACTIVE = FALSE&lt;br /&gt;
*&lt;br /&gt;
PWD=GETENV(&amp;quot;PWD&amp;quot;)&lt;br /&gt;
I=LEN(PWD) ; ACC=NUL&lt;br /&gt;
FOR F=I TO 1 STEP -1&lt;br /&gt;
  IF PWD[F,1] = &#039;/&#039; THEN EXIT&lt;br /&gt;
  ACC=PWD[F,1]:ACC&lt;br /&gt;
NEXT F&lt;br /&gt;
*&lt;br /&gt;
USERNAME=UPCASE(@LOGNAME)&lt;br /&gt;
HOME.DIR=GETENV(&amp;quot;HOME&amp;quot;)&lt;br /&gt;
STACK.ITEM=&#039;.STACK_&#039;:USERNAME&lt;br /&gt;
ALIAS.ITEM=&#039;.STACK.ALIAS_&#039;:USERNAME&lt;br /&gt;
PROGRAM.ITEM=&#039;.STACK.PROGRAM_&#039;:USERNAME&lt;br /&gt;
SETTING.ITEM=&#039;.STACK.SETTING_&#039;:USERNAME&lt;br /&gt;
HOME.FILE=&#039;HOME.&#039;:UPCASE(USERNAME)&lt;br /&gt;
OPEN &#039;VOC&#039; TO VOC ELSE STOP 201,&#039;VOC&#039;&lt;br /&gt;
OPEN &#039;_HOLD_&#039; TO HOLD ELSE STOP 201,&#039;_HOLD_&#039; ;* Exists in every Unidata account&lt;br /&gt;
R=&#039;DIR&#039; ; R&amp;lt;2&amp;gt;=HOME.DIR ; R&amp;lt;3&amp;gt;=&#039;D_VOC&#039;&lt;br /&gt;
WRITE R ON VOC, HOME.FILE&lt;br /&gt;
OPEN HOME.FILE TO HOME.F ELSE STOP 201, HOME.FILE&lt;br /&gt;
OPEN &#039;CTLGTB&#039; TO CTLGTB ELSE STOP 201,&#039;CTLGTB&#039;&lt;br /&gt;
OPEN &#039;CTLG&#039;   TO CTLG   ELSE STOP 201,&#039;CTLG&#039;&lt;br /&gt;
OPEN &#039;STACK.AC&#039; TO AC ELSE&lt;br /&gt;
  EXECUTE \CREATE.FILE STACK.AC 967,8192\&lt;br /&gt;
  OPEN &#039;STACK.AC&#039; TO AC ELSE ABORT&lt;br /&gt;
END&lt;br /&gt;
*&lt;br /&gt;
SETTINGS      = &#039;;&#039;        ;* DEFAULT COMMAND SEPERATOR&lt;br /&gt;
SETTINGS&amp;lt;2&amp;gt;   = &#039;.&#039;        ;* DEFAULT STACK CHAR&lt;br /&gt;
SETTINGS&amp;lt;3&amp;gt;   = &#039;/&#039;        ;* DEFAULT PROG CHAR&lt;br /&gt;
SETTINGS&amp;lt;4&amp;gt;   = 9999       ;* DEFAULT MAX # LINES IN STACK&lt;br /&gt;
SETTINGS&amp;lt;5&amp;gt;   = &#039;!vi&#039;      ;* DEFAULT SCREEN EDITOR (try !joe :)&lt;br /&gt;
SETTINGS&amp;lt;6&amp;gt;   = &#039;AE&#039;       ;* DEFAULT LINE EDITOR&lt;br /&gt;
SETTINGS&amp;lt;7&amp;gt;   =&#039;* Edited :&#039;;* DEFAULT HEADER STRING&lt;br /&gt;
SETTINGS&amp;lt;8&amp;gt;   = TRUE       ;* DEFAULT USE GET.LINE SUBR&lt;br /&gt;
SETTINGS&amp;lt;9&amp;gt;   = &#039;BP.DEV&#039;   ;* DEFAULT WORK FILE&lt;br /&gt;
SETTINGS&amp;lt;10&amp;gt;  = FALSE      ;* DEFAULT = CONVERT TO UCASE&lt;br /&gt;
SETTINGS&amp;lt;11&amp;gt;  = &amp;quot;&amp;quot;         ;* DEFAULT STARTUP COMMAND&lt;br /&gt;
SETTINGS&amp;lt;12&amp;gt;  = &amp;quot;#R#A&amp;gt;&amp;quot;    ;* DEFAULT PROMPT&lt;br /&gt;
SETTINGS&amp;lt;13&amp;gt;  = -2         ;* DEFAULT X DISPLACEMENT FOR PROMPT&lt;br /&gt;
SETTINGS&amp;lt;14&amp;gt;  = &amp;quot;bash&amp;quot;     ;* DEFAULT SHELL FOR UNIX COMMANDS&lt;br /&gt;
SETTINGS&amp;lt;15&amp;gt;  = &amp;quot;&amp;quot;         ;* DEFAULT PROGRAM STACK TO USE&lt;br /&gt;
*&lt;br /&gt;
READ R FROM HOME.F, SETTING.ITEM ELSE R=NUL&lt;br /&gt;
I=DCOUNT(SETTINGS,@AM)&lt;br /&gt;
FOR F=1 TO I&lt;br /&gt;
  IF R&amp;lt;F&amp;gt; # NUL THEN SETTINGS&amp;lt;F&amp;gt; = R&amp;lt;F&amp;gt;&lt;br /&gt;
NEXT F&lt;br /&gt;
COMMAND.SEPERATOR = SETTINGS&amp;lt;1&amp;gt;&lt;br /&gt;
STACK.CHAR   = SETTINGS&amp;lt;2&amp;gt;&lt;br /&gt;
PROG.CHAR    = SETTINGS&amp;lt;3&amp;gt;&lt;br /&gt;
MAX.STACK    = SETTINGS&amp;lt;4&amp;gt;&lt;br /&gt;
WP.VERB      = SETTINGS&amp;lt;5&amp;gt;&lt;br /&gt;
ED.VERB      = SETTINGS&amp;lt;6&amp;gt;&lt;br /&gt;
STAMP.STRING = SETTINGS&amp;lt;7&amp;gt;&lt;br /&gt;
GET.LINE.FLAG= SETTINGS&amp;lt;8&amp;gt;&lt;br /&gt;
WORK.FILE    = SETTINGS&amp;lt;9&amp;gt;&lt;br /&gt;
MCU.ON       = SETTINGS&amp;lt;10&amp;gt;&lt;br /&gt;
STARTUP      = SETTINGS&amp;lt;11&amp;gt;&lt;br /&gt;
PROMT        = SETTINGS&amp;lt;12&amp;gt;&lt;br /&gt;
X.DISP       = SETTINGS&amp;lt;13&amp;gt;&lt;br /&gt;
DEF.SHELL    = SETTINGS&amp;lt;14&amp;gt;&lt;br /&gt;
STACK.NAME   = SETTINGS&amp;lt;15&amp;gt;&lt;br /&gt;
WRITE SETTINGS ON HOME.F, SETTING.ITEM&lt;br /&gt;
*&lt;br /&gt;
IF STACK.NAME = &#039;&#039; THEN&lt;br /&gt;
  PROGRAM.ITEM=&#039;.STACK.PROGRAM_&#039;:USERNAME&lt;br /&gt;
END ELSE&lt;br /&gt;
  PROGRAM.ITEM=&#039;.STACK.PROGRAM_&#039;:USERNAME:&#039;_&#039;:STACK.NAME&lt;br /&gt;
END&lt;br /&gt;
READ PROGRAMS FROM HOME.F, PROGRAM.ITEM ELSE PROGRAMS = NUL&lt;br /&gt;
*&lt;br /&gt;
EXEC.LINE=&amp;quot;!hostname&amp;quot; ; CAP.ACTIVE=TRUE ; GOSUB EXEC.SUB&lt;br /&gt;
HOST.NAME=EXEC.CAP&amp;lt;1&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
READ STACK FROM HOME.F, STACK.ITEM ELSE STACK = NUL&lt;br /&gt;
PRINT DCOUNT(STACK,@AM):&#039; commands in stack &#039;:HOME.DIR:&#039;/&#039;:HOME.FILE&lt;br /&gt;
READ ALIASES FROM HOME.F, ALIAS.ITEM ELSE ALIASES = NUL&lt;br /&gt;
* Override with my favorites for now.  It&#039;s a pain to manage per system.&lt;br /&gt;
ALIASES&amp;lt;1&amp;gt;=&#039;ACTIVE&#039;&lt;br /&gt;
ALIASES&amp;lt;1,2&amp;gt;=&#039;CS&#039;&lt;br /&gt;
ALIASES&amp;lt;1,3&amp;gt;=&#039;L&#039;&lt;br /&gt;
ALIASES&amp;lt;2&amp;gt;=&#039;SELECT LS.MASTER WITH NUM.OF.ASSETS &amp;gt; &amp;quot;0&amp;quot;&#039;&lt;br /&gt;
ALIASES&amp;lt;2,2&amp;gt;=&#039;CLEARSELECT&#039;&lt;br /&gt;
ALIASES&amp;lt;2,3&amp;gt;=&#039;LIST LS.MASTER&#039;&lt;br /&gt;
OLD.X.DISP=X.DISP&lt;br /&gt;
RTN=NUL&lt;br /&gt;
* IL9/IL10 Check&lt;br /&gt;
IL.VER=&#039;&#039;&lt;br /&gt;
OPEN &#039;ACCOUNT.PARAMS&#039; TO ACCOUNT.PARAMS THEN&lt;br /&gt;
  READ R FROM ACCOUNT.PARAMS, &#039;VERSION&#039; ELSE R=&#039;&#039;&lt;br /&gt;
  IL.DB=PWD&lt;br /&gt;
  IL.VER=R&amp;lt;4&amp;gt;:&#039;/&#039;:R&amp;lt;8&amp;gt;:&#039;.&#039;:R&amp;lt;26&amp;gt;&lt;br /&gt;
END ELSE&lt;br /&gt;
  EXECUTE \!cat DBConfig.xml | grep DataSource | awk -F &#039;[&amp;lt;&amp;gt;]&#039; &#039;{print $3}&#039;\ CAPTURING JDBC&lt;br /&gt;
  JDBC=JDBC&amp;lt;1&amp;gt;&lt;br /&gt;
  EXECUTE \!grep \:JDBC:\ ../../jdbc-bridge/bin/jdbc.properties | grep -v &amp;quot;^#&amp;quot; | grep url\ CAPTURING IL.DB&lt;br /&gt;
  IL.DB=IL.DB&amp;lt;1&amp;gt;&lt;br /&gt;
  OSREAD VER FROM &#039;version.properties&#039; ELSE VER=&#039;il.version=10&#039;&lt;br /&gt;
  CONVERT CHAR(10) TO @AM IN VER&lt;br /&gt;
  FOR F=1 TO DCOUNT(VER,@AM)&lt;br /&gt;
    IF FIELD(VER&amp;lt;F&amp;gt;,&#039;=&#039;,2) # &#039;&#039; THEN IL.VER=FIELD(VER&amp;lt;F&amp;gt;,&#039;=&#039;,2) ; EXIT&lt;br /&gt;
  NEXT F&lt;br /&gt;
END&lt;br /&gt;
CRT IL.VER:&#039; &#039;:IL.DB&lt;br /&gt;
IF STARTUP # NUL THEN ANS=STARTUP ; GOSUB COMMAND ; STARTUP=NUL&lt;br /&gt;
ANS=NUL&lt;br /&gt;
*&lt;br /&gt;
LOOP&lt;br /&gt;
  GOSUB GET.TERM.WIDTH ;* In case terminal font or window size changes&lt;br /&gt;
  GOSUB EXPAND.PROMPT&lt;br /&gt;
  PRINT BON:PROMPT.DISP:BOFF:&lt;br /&gt;
  X = LEN(PROMPT.DISP) + X.DISP&lt;br /&gt;
  ENTRY = NUL;LEN = LONG.LINE;DISP.LEN=TERM.WIDTH-1-X&lt;br /&gt;
  GOSUB GET.INPUT&lt;br /&gt;
  ANS=ENTRY&lt;br /&gt;
  * Reread the program and command stack, since they may be modified&lt;br /&gt;
  * in another session&lt;br /&gt;
  READ PROGRAMS FROM HOME.F, PROGRAM.ITEM ELSE PROGRAMS = NUL&lt;br /&gt;
  READ STACK FROM HOME.F, STACK.ITEM ELSE STACK = NUL&lt;br /&gt;
  READ ALIASES FROM HOME.F, ALIAS.ITEM ELSE ALIASES = NUL&lt;br /&gt;
  IF RTN # ESC THEN GOSUB COMMAND&lt;br /&gt;
REPEAT&lt;br /&gt;
*&lt;br /&gt;
GET.INPUT:&lt;br /&gt;
  IF GET.LINE.FLAG THEN&lt;br /&gt;
    *CALL GET.LINE.STACK(X,LEN,DISP.LEN,ENTRY,RTN)&lt;br /&gt;
    GOSUB GET.LINE&lt;br /&gt;
  END ELSE&lt;br /&gt;
    PRINT @(X):;INPUT ENTRY&lt;br /&gt;
    RTN = RET&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
COMMAND:&lt;br /&gt;
  MAX.STACK=DCOUNT(STACK,@AM)&lt;br /&gt;
  BEGIN CASE&lt;br /&gt;
      * Map up and down arrows to .R1 and .Rn&lt;br /&gt;
    CASE RTN = UP.KEY&lt;br /&gt;
      ANS = &#039;.R1&#039;&lt;br /&gt;
    CASE RTN = PG.UP.KEY&lt;br /&gt;
      IF UNASSIGNED(P2) THEN P2 = 20&lt;br /&gt;
      IF UNASSIGNED(P1) THEN P1 = 1&lt;br /&gt;
      P2 = P2 + 20&lt;br /&gt;
      P1 = P1 + 20&lt;br /&gt;
      IF P2 &amp;gt; MAX.STACK THEN P2 = MAX.STACK&lt;br /&gt;
      IF P1 &amp;gt; MAX.STACK-20 THEN P1 = MAX.STACK-20&lt;br /&gt;
      ANS = &#039;.L&#039;:P1:&#039;,&#039;:P2&lt;br /&gt;
    CASE RTN = PG.DOWN.KEY&lt;br /&gt;
      IF UNASSIGNED(P2) THEN P2 = 20&lt;br /&gt;
      IF UNASSIGNED(P1) THEN P1 = 1&lt;br /&gt;
      P2 = P2 - 20&lt;br /&gt;
      P1 = P1 - 20&lt;br /&gt;
      IF P2 &amp;lt; 20 THEN P2=20&lt;br /&gt;
      IF P1 &amp;lt; 1 THEN P1=1&lt;br /&gt;
      ANS = &#039;.L&#039;:P1:&#039;,&#039;:P2&lt;br /&gt;
    CASE ANS=&#039;?&#039;&lt;br /&gt;
      ANS=&#039;.H&#039;&lt;br /&gt;
  END CASE&lt;br /&gt;
  IF ANS = NUL THEN RETURN&lt;br /&gt;
  UNIX.COMMAND=FALSE&lt;br /&gt;
  IF ANS[1,1] = UNIX THEN UNIX.COMMAND=TRUE&lt;br /&gt;
  OLD.STACK = STACK&lt;br /&gt;
  START.WORD.SEARCH = 1&lt;br /&gt;
  COMMAND.LIST = ANS&lt;br /&gt;
  COMMAND.COUNT = 1&lt;br /&gt;
  IF STARTUP#NUL THEN EXECUTING=TRUE ELSE EXECUTING=FALSE&lt;br /&gt;
  IF UNIX.COMMAND THEN&lt;br /&gt;
    * Don&#039;t look for ; for unix commands&lt;br /&gt;
    GOSUB DO.COMMAND&lt;br /&gt;
  END ELSE&lt;br /&gt;
    LOOP&lt;br /&gt;
      ANS = FIELD(COMMAND.LIST,COMMAND.SEPERATOR,COMMAND.COUNT)&lt;br /&gt;
    UNTIL ANS = NUL DO&lt;br /&gt;
      GOSUB DO.COMMAND&lt;br /&gt;
      COMMAND.COUNT = COMMAND.COUNT + 1&lt;br /&gt;
    REPEAT&lt;br /&gt;
  END&lt;br /&gt;
  WRITE ALIASES ON HOME.F, ALIAS.ITEM&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
DO.COMMAND:&lt;br /&gt;
  IF NOT(UNIX.COMMAND) THEN&lt;br /&gt;
    IF MCU.ON THEN ANS = TRIM(UPCASE(ANS))&lt;br /&gt;
    IF ANS[1,5] # &#039;ALIAS&#039; THEN GOSUB EXPAND.ALIASES&lt;br /&gt;
    GOSUB EXPAND.PROG.CHARS&lt;br /&gt;
  END&lt;br /&gt;
  IF ANS=&#039;!&#039; THEN ANS=&#039;!&#039;:DEF.SHELL&lt;br /&gt;
  LEN.ANS = LEN(ANS)&lt;br /&gt;
  SEARCH.FOR=NUL&lt;br /&gt;
  CAP.ACTIVE=FALSE&lt;br /&gt;
  FIRST.WORD=FIELD(ANS,&#039; &#039;,1)&lt;br /&gt;
  UPDATE.STACK.FLAG=TRUE&lt;br /&gt;
  BEGIN CASE&lt;br /&gt;
    CASE ANS[1,1] = STACK.CHAR&lt;br /&gt;
      ANS = TRIM(UPCASE(ANS))&lt;br /&gt;
      GOSUB STACK.COMMAND&lt;br /&gt;
      UPDATE.STACK.FLAG=FALSE&lt;br /&gt;
    CASE ANS[1,1] = PROG.CHAR&lt;br /&gt;
      ANS = TRIM(UPCASE(ANS))&lt;br /&gt;
      GOSUB PROG.COMMAND&lt;br /&gt;
      UPDATE.STACK.FLAG=FALSE&lt;br /&gt;
    CASE ANS[1,1] = SEARCH&lt;br /&gt;
      GOSUB SEARCH.COMMAND&lt;br /&gt;
      UPDATE.STACK.FLAG=FALSE&lt;br /&gt;
    CASE UPCASE(ANS) = &#039;OFF&#039; OR UPCASE(ANS) = &#039;Q&#039;&lt;br /&gt;
      GOSUB WRITE.INFO&lt;br /&gt;
      STOP&lt;br /&gt;
    CASE FIRST.WORD=&#039;AC&#039;&lt;br /&gt;
      GOSUB BUILD.AC&lt;br /&gt;
    CASE FIRST.WORD = &#039;ALIAS&#039;&lt;br /&gt;
      GOSUB DO.ALIAS&lt;br /&gt;
    CASE FIRST.WORD = &#039;SE&#039;&lt;br /&gt;
      FILE=FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
      ID=FIELD(ANS,&#039; &#039;,3)&lt;br /&gt;
      GOSUB SEARCH.BY.EXAMPLE&lt;br /&gt;
    CASE FIRST.WORD = &#039;CI&#039;&lt;br /&gt;
      * CONTRACT INQUIRY&lt;br /&gt;
      CONTRACT=FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
      DATA 0&lt;br /&gt;
      DATA 0&lt;br /&gt;
      DATA 0&lt;br /&gt;
      DATA 0&lt;br /&gt;
      IF CONTRACT # &#039;&#039; THEN&lt;br /&gt;
        CONVERT &#039;.&#039; TO &#039;-&#039; IN CONTRACT&lt;br /&gt;
        DATA FIELD(CONTRACT,&#039;-&#039;,1)&lt;br /&gt;
        DATA FIELD(CONTRACT,&#039;-&#039;,2,2)&lt;br /&gt;
      END&lt;br /&gt;
      EXEC.LINE=\CMAINT.00\ ; GOSUB EXEC.SUB&lt;br /&gt;
    CASE FIRST.WORD = &#039;CM&#039;&lt;br /&gt;
      * CONTRACT MAINTENANCE&lt;br /&gt;
      CONTRACT=FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
      DATA 1&lt;br /&gt;
      DATA 0&lt;br /&gt;
      DATA 0&lt;br /&gt;
      DATA 0&lt;br /&gt;
      IF CONTRACT # &#039;&#039; THEN&lt;br /&gt;
        CONVERT &#039;.&#039; TO &#039;-&#039; IN CONTRACT&lt;br /&gt;
        DATA FIELD(CONTRACT,&#039;-&#039;,1)&lt;br /&gt;
        DATA FIELD(CONTRACT,&#039;-&#039;,2,2)&lt;br /&gt;
      END&lt;br /&gt;
      EXEC.LINE=\CMAINT.00\ ; GOSUB EXEC.SUB&lt;br /&gt;
    CASE FIRST.WORD = &#039;CCI&#039;&lt;br /&gt;
      * CUSTOMER INQUIRY&lt;br /&gt;
      DATA 0&lt;br /&gt;
      DATA 0&lt;br /&gt;
      DATA 0&lt;br /&gt;
      IF FIELD(ANS,&#039; &#039;,2) # &#039;&#039; THEN&lt;br /&gt;
        DATA FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
      END&lt;br /&gt;
      EXEC.LINE=\CDMAINT.00\ ; GOSUB EXEC.SUB&lt;br /&gt;
    CASE FIRST.WORD = &#039;CCM&#039;&lt;br /&gt;
      * CUSTOMER MAINTENANCE&lt;br /&gt;
      DATA 1&lt;br /&gt;
      DATA 0&lt;br /&gt;
      DATA 0&lt;br /&gt;
      IF FIELD(ANS,&#039; &#039;,2) # &#039;&#039; THEN&lt;br /&gt;
        DATA FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
      END&lt;br /&gt;
      EXEC.LINE=\CDMAINT.00\ ; GOSUB EXEC.SUB&lt;br /&gt;
    CASE ANS = &#039;TM&#039;&lt;br /&gt;
      DATA 1&lt;br /&gt;
      DATA 0&lt;br /&gt;
      EXEC.LINE=\TMAINT.00\ ; GOSUB EXEC.SUB&lt;br /&gt;
    CASE FIRST.WORD = &#039;CHECK.FILE&#039;&lt;br /&gt;
      GOSUB CHECK.FILE&lt;br /&gt;
    CASE ANS = &#039;ICONV&#039;&lt;br /&gt;
      CONV=&#039;I&#039;&lt;br /&gt;
      GOSUB CONV&lt;br /&gt;
    CASE ANS = &#039;OCONV&#039;&lt;br /&gt;
      CONV=&#039;O&#039;&lt;br /&gt;
      GOSUB CONV&lt;br /&gt;
    CASE ANS = &#039;RULER&#039;&lt;br /&gt;
      GOSUB GET.TERM.WIDTH&lt;br /&gt;
      GOSUB RULER&lt;br /&gt;
    CASE FIRST.WORD = &#039;PIVOT&#039;&lt;br /&gt;
      GOSUB PIVOT&lt;br /&gt;
    CASE FIRST.WORD = &#039;PROF&#039;&lt;br /&gt;
      GOSUB PROFILE&lt;br /&gt;
    CASE FIRST.WORD = &#039;DDD&#039;&lt;br /&gt;
      GOSUB DDD&lt;br /&gt;
    CASE FIRST.WORD = &#039;BPI&#039;&lt;br /&gt;
      GOSUB BPI&lt;br /&gt;
    CASE FIRST.WORD = &#039;SF&#039;&lt;br /&gt;
      GOSUB SEARCH.FILE&lt;br /&gt;
    CASE FIRST.WORD = &#039;AF&#039;&lt;br /&gt;
      GOSUB ATB.FIND&lt;br /&gt;
    CASE ANS=&#039;PARAM&#039;&lt;br /&gt;
      GOSUB LIST.PARAM&lt;br /&gt;
    CASE FIRST.WORD = &#039;PICKLE&#039;&lt;br /&gt;
      GOSUB PICKLE&lt;br /&gt;
    CASE ANS=&#039;SETTINGS&#039;&lt;br /&gt;
      GOSUB SETTINGS&lt;br /&gt;
    CASE FIRST.WORD=&#039;RS&#039;&lt;br /&gt;
      GOSUB RECALL.SHELL&lt;br /&gt;
    CASE FIRST.WORD=&#039;FIND.MENU&#039;&lt;br /&gt;
      GOSUB FIND.MENU&lt;br /&gt;
    CASE ANS=&#039;LISTA&#039;&lt;br /&gt;
      GOSUB LISTA&lt;br /&gt;
    CASE FIRST.WORD = &#039;DESC&#039;&lt;br /&gt;
      GOSUB IL10.DESC&lt;br /&gt;
    CASE FIRST.WORD = &#039;XREF&#039;&lt;br /&gt;
      GOSUB IL10.XREF&lt;br /&gt;
    CASE FIRST.WORD = &#039;FIELD&#039;&lt;br /&gt;
      GOSUB IL10.AF&lt;br /&gt;
    CASE FIRST.WORD = &#039;NED&#039;&lt;br /&gt;
      GOSUB IL10.NED&lt;br /&gt;
    CASE FIRST.WORD = &#039;NSEL&#039;&lt;br /&gt;
      GOSUB IL10.NSEL&lt;br /&gt;
    CASE FIRST.WORD = &#039;SQL&#039;&lt;br /&gt;
      GOSUB SQL.SEL&lt;br /&gt;
    CASE FIRST.WORD = &#039;SQLF&#039;&lt;br /&gt;
      GOSUB SQL.FILE&lt;br /&gt;
    CASE FIRST.WORD = &#039;SQL-LIST&#039;&lt;br /&gt;
      GOSUB SQL.SEL.LIST&lt;br /&gt;
    CASE OTHERWISE&lt;br /&gt;
      EXEC.LINE = ANS&lt;br /&gt;
      T1=SYSTEM(12)&lt;br /&gt;
      GOSUB EXEC.SUB&lt;br /&gt;
      IF TIME.COMMAND THEN PRINT SYSTEM(12)-T1:&#039; ms&#039;&lt;br /&gt;
  END CASE&lt;br /&gt;
  IF UPDATE.STACK.FLAG THEN GOSUB UPDATE.STACK&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
DO.ALIAS:&lt;br /&gt;
  AL = FIELD(ANS,SPC,2)&lt;br /&gt;
  STRING = NUL;I = 3&lt;br /&gt;
  LOOP&lt;br /&gt;
    F = FIELD(ANS,SPC,I)&lt;br /&gt;
  UNTIL F = NUL DO&lt;br /&gt;
    STRING = STRING:SPC:F&lt;br /&gt;
    I = I + 1&lt;br /&gt;
  REPEAT&lt;br /&gt;
  BEGIN CASE&lt;br /&gt;
    CASE AL = NUL AND STRING = NUL&lt;br /&gt;
      GOSUB LIST.ALIAS&lt;br /&gt;
    CASE STRING = NUL&lt;br /&gt;
      GOSUB LIST.ONE.ALIAS&lt;br /&gt;
    CASE 1&lt;br /&gt;
      GOSUB SET.ALIAS&lt;br /&gt;
  END CASE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SET.ALIAS:&lt;br /&gt;
  STRING=STRING[2,LONG.LINE]&lt;br /&gt;
  PRINT AL:&#039;=&#039;:STRING&lt;br /&gt;
  LOCATE AL IN ALIASES&amp;lt;1&amp;gt; BY &#039;AL&#039; SETTING P THEN&lt;br /&gt;
    ALIASES&amp;lt;2,P&amp;gt; = STRING&lt;br /&gt;
  END ELSE&lt;br /&gt;
    INS AL BEFORE ALIASES&amp;lt;1,P&amp;gt;;INS STRING BEFORE ALIASES&amp;lt;2,P&amp;gt;&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
LIST.ALIAS:&lt;br /&gt;
  I = DCOUNT(ALIASES&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
  FOR F = 1 TO I&lt;br /&gt;
    PRINT ALIASES&amp;lt;1,F&amp;gt;,ALIASES&amp;lt;2,F&amp;gt;&lt;br /&gt;
  NEXT F&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
LIST.ONE.ALIAS:&lt;br /&gt;
  LOCATE AL IN ALIASES&amp;lt;1&amp;gt; BY &#039;AL&#039; SETTING P ELSE PRINT AL:&#039; not found&#039;;RETURN&lt;br /&gt;
  X=0;LEN=99;DISP.LEN=30;ENTRY=ALIASES&amp;lt;2,P&amp;gt;&lt;br /&gt;
  GOSUB GET.INPUT&lt;br /&gt;
  IF RTN = 27 THEN RETURN&lt;br /&gt;
  ALIASES&amp;lt;2,P&amp;gt; = ENTRY&lt;br /&gt;
  IF ENTRY = NUL THEN DEL ALIASES&amp;lt;1,P&amp;gt;;DEL ALIASES&amp;lt;2,P&amp;gt;&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
EXEC.SUB:&lt;br /&gt;
  IF EXEC.LINE = NUL THEN RETURN&lt;br /&gt;
  IF EXEC.LINE = &#039;CLEARSELECT&#039; THEN CLEARSELECT&lt;br /&gt;
  IF CAP.ACTIVE THEN&lt;br /&gt;
    EXECUTE EXEC.LINE CAPTURING EXEC.CAP&lt;br /&gt;
  END ELSE&lt;br /&gt;
    EXECUTE EXEC.LINE&lt;br /&gt;
  END&lt;br /&gt;
  IF SYSTEM(11) &amp;gt; 0 THEN SL.ACTIVE = TRUE ELSE SL.ACTIVE = FALSE&lt;br /&gt;
  CAP.ACTIVE=FALSE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
EXPAND.PROG.CHARS:&lt;br /&gt;
  * expand //10 to be IV.BP IV.EQP.MNT for example&lt;br /&gt;
  POS = 1&lt;br /&gt;
  LOOP&lt;br /&gt;
    I = INDEX(ANS,PROG.CHAR:PROG.CHAR,POS)&lt;br /&gt;
  UNTIL I = 0 DO&lt;br /&gt;
    VAR = NUL;IDX = I+2&lt;br /&gt;
    LOOP&lt;br /&gt;
      C = ANS[IDX,1]&lt;br /&gt;
    UNTIL NOT(NUM(C)) OR C = NUL DO&lt;br /&gt;
      VAR = VAR:C&lt;br /&gt;
      IDX = IDX+1&lt;br /&gt;
    REPEAT&lt;br /&gt;
    IF NUM(VAR) AND VAR &amp;gt; 0 THEN&lt;br /&gt;
      ANS = ANS[1,I-1]:PROGRAMS&amp;lt;VAR&amp;gt;:ANS[IDX,LONG.LINE]&lt;br /&gt;
    END ELSE&lt;br /&gt;
      POS = POS + 1&lt;br /&gt;
    END&lt;br /&gt;
  REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
EXPAND.ALIASES:&lt;br /&gt;
  SWAP SPC WITH @VM IN ANS ; POS = 1&lt;br /&gt;
  LOOP&lt;br /&gt;
    R = ANS&amp;lt;1,POS&amp;gt;&lt;br /&gt;
  UNTIL R = NUL DO&lt;br /&gt;
    LOCATE R IN ALIASES&amp;lt;1&amp;gt; BY &#039;AL&#039; SETTING P THEN ANS&amp;lt;1,POS&amp;gt; = ALIASES&amp;lt;2,P&amp;gt;&lt;br /&gt;
    POS = POS + 1&lt;br /&gt;
  REPEAT&lt;br /&gt;
  SWAP @VM WITH SPC IN ANS&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
EXPAND.PROMPT:&lt;br /&gt;
  IF SL.ACTIVE THEN&lt;br /&gt;
    PROMPT.DISP=&#039;#R&#039;:SYSTEM(11):&#039;-SEL&amp;gt;&#039;&lt;br /&gt;
    OLD.X.DISP=X.DISP&lt;br /&gt;
    X.DISP=-2&lt;br /&gt;
  END ELSE&lt;br /&gt;
    PROMPT.DISP = PROMT&lt;br /&gt;
    X.DISP=OLD.X.DISP&lt;br /&gt;
  END&lt;br /&gt;
  CTR = 1&lt;br /&gt;
  LOOP&lt;br /&gt;
    I = INDEX(PROMPT.DISP,&#039;#&#039;,CTR)&lt;br /&gt;
  UNTIL I = 0 DO&lt;br /&gt;
    F = PROMPT.DISP[I+1,1]&lt;br /&gt;
    L = PROMPT.DISP[1,I-1];R = TRIM(PROMPT.DISP[I+2,LONG.LINE])&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
      CASE F = &#039;B&#039;&lt;br /&gt;
        PROMPT.DISP = L:CHAR(7):R&lt;br /&gt;
      CASE F = &#039;A&#039;&lt;br /&gt;
        PROMPT.DISP = L:ACC:R&lt;br /&gt;
      CASE F = &#039;T&#039;&lt;br /&gt;
        PROMPT.DISP = L:OCONV(TIME(),&#039;MTS&#039;):R&lt;br /&gt;
      CASE F = &#039;D&#039;&lt;br /&gt;
        PROMPT.DISP = L:OCONV(DATE(),&#039;D&#039;):R&lt;br /&gt;
      CASE F = &#039;E&#039;&lt;br /&gt;
        PROMPT.DISP = L:CHAR(ESC):R&lt;br /&gt;
      CASE F = &#039;R&#039;&lt;br /&gt;
        PROMPT.DISP = L:CHAR(13):CHAR(10):R&lt;br /&gt;
      CASE F = &#039;#&#039;&lt;br /&gt;
        PROMPT.DISP = L:&#039;#&#039;:R&lt;br /&gt;
        CTR = CTR + 1&lt;br /&gt;
      CASE F = &#039;U&#039;&lt;br /&gt;
        PROMPT.DISP = L:USERNAME:R&lt;br /&gt;
      CASE F = &#039;H&#039;&lt;br /&gt;
        PROMPT.DISP=L:FIELD(HOST.NAME,&amp;quot;.&amp;quot;,1):R&lt;br /&gt;
      CASE OTHERWISE&lt;br /&gt;
        CTR = CTR + 1&lt;br /&gt;
    END CASE&lt;br /&gt;
  REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
STACK.COMMAND:&lt;br /&gt;
  BEGIN CASE&lt;br /&gt;
    CASE ANS=&#039;.D&#039;&lt;br /&gt;
      LIST.DET.FLAG=NOT(LIST.DET.FLAG)&lt;br /&gt;
    CASE ANS[1,2] = &#039;.L&#039;&lt;br /&gt;
      IF ANS = &#039;.L&#039; THEN ANS = &#039;.L,20&#039;&lt;br /&gt;
      GOSUB GET.PARAMS&lt;br /&gt;
      IF RANGE.ERROR THEN RETURN&lt;br /&gt;
      I = DCOUNT(STACK,@AM)&lt;br /&gt;
      IF I = 0 THEN PRINT &#039;No items present&#039;;RETURN&lt;br /&gt;
      IF P2 &amp;gt; I THEN P2 = I&lt;br /&gt;
      PRINT&lt;br /&gt;
      FOR F = P2 TO P1 STEP -1&lt;br /&gt;
        IF LIST.DET.FLAG THEN&lt;br /&gt;
          PRINT SPC:F&#039;R#3&#039;:&amp;quot; &amp;quot;:STACK&amp;lt;F,1&amp;gt;&#039;L#20&#039;:&#039; &#039;:OCONV(STACK&amp;lt;F,2&amp;gt;,&#039;D-YMD&#039;):&#039; &#039;:OCONV(STACK&amp;lt;F,3&amp;gt;,&#039;MTS&#039;):&#039; &#039;:STACK&amp;lt;F,4&amp;gt;&lt;br /&gt;
        END ELSE&lt;br /&gt;
          PRINT SPC:F&#039;R#3&#039;:&amp;quot; &amp;quot;:STACK&amp;lt;F,4&amp;gt;&lt;br /&gt;
        END&lt;br /&gt;
      NEXT F&lt;br /&gt;
    CASE ANS[1,2] = &#039;.R&#039; OR ANS[1,2] = &#039;.X&#039;&lt;br /&gt;
      IF STACK = NUL THEN PRINT BELL ELSE GO EDIT&lt;br /&gt;
    CASE ANS = &#039;.P&#039;&lt;br /&gt;
      PRINT &#039;#R - Return  #A - Account  #D - Date  #T - Time #P - Port&#039;&lt;br /&gt;
      PRINT &#039;#E - Escape  #L - Level    #U - User  #H - Host&#039;&lt;br /&gt;
      PRINT &#039;Prompt&#039;:&lt;br /&gt;
      X = 7;DISP.LEN = 60;ENTRY = PROMT;LEN = 99;GOSUB GET.INPUT&lt;br /&gt;
      PROMT = ENTRY&lt;br /&gt;
      PRINT &#039;Enter the X displacement for input :&#039;:&lt;br /&gt;
      ENTRY = NUL;LEN = 5;DISP.LEN = 5;X = 37;GOSUB GET.INPUT&lt;br /&gt;
      X.DISP = ENTRY&lt;br /&gt;
      IF NOT(NUM(X.DISP)) THEN X.DISP = 0&lt;br /&gt;
      SETTINGS&amp;lt;12&amp;gt; = PROMT&lt;br /&gt;
      SETTINGS&amp;lt;13&amp;gt; = X.DISP&lt;br /&gt;
      OLD.X.DISP=X.DISP&lt;br /&gt;
    CASE ANS = &#039;.H&#039;&lt;br /&gt;
      CRT &#039;--------------------------- TCL STACK COMMANDS --------------------------------&#039;&lt;br /&gt;
      CRT &#039;Ctrl-A      Start of line              Ctrl-R           Toggle insert mode&#039;&lt;br /&gt;
      CRT &#039;Ctrl-B      Back one char              Ctrl-U           Page Up&#039;&lt;br /&gt;
      CRT &#039;Ctrl-D      Delete char                Ctrl-V           Page Down&#039;&lt;br /&gt;
      CRT &#039;Ctrl-E      End of line                Ctrl-W           Delete word&#039;&lt;br /&gt;
      CRT &#039;Ctrl-F      Forward char               Ctrl-X           Forward word&#039;&lt;br /&gt;
      CRT &#039;Ctrl-G      Cancel line                Ctrl-Z           Back word&#039;&lt;br /&gt;
      CRT &#039;Ctrl-I      Forward word               ~xyz             Search for xyz&#039;&lt;br /&gt;
      CRT &#039;Ctrl-J      Delete to end              .D               Toggle detail off/on&#039;&lt;br /&gt;
      CRT &#039;Ctrl-L      Clear screen               .Lm,n            List entry m thru n&#039;&lt;br /&gt;
      CRT &#039;Ctrl-M      Accept line                .Rn              Restore entry n, edit&#039;&lt;br /&gt;
      CRT &#039;Ctrl-N      Next line                  .H               Help&#039;&lt;br /&gt;
      CRT &#039;Ctrl-P      Previous line              Q/INFO           Quit back to TCL&#039;&lt;br /&gt;
      CRT &#039;---------------------- PROGRAM STACK COMMANDS ---------------------------------&#039;&lt;br /&gt;
      CRT &#039;/           List the active prog stack&#039;&lt;br /&gt;
      CRT &#039;/LL         List available prog stacks /L BLAH          Switch stack to BLAH&#039;&lt;br /&gt;
      CRT &#039;/Nx         Add a New program          /Fx              Format the x`th program&#039;&lt;br /&gt;
      CRT &#039;/Ex         Edit the x`th program      /WW              Edit the program list&#039;&lt;br /&gt;
      CRT &#039;/Wx         VI the x`th program        /S               Sort the program stack&#039;&lt;br /&gt;
      CRT &#039;/Bx         Compile the x`th program   /BR              Compile and run&#039;&lt;br /&gt;
      CRT &#039;---------------------------- UTILITIES ----------------------------------------&#039;&lt;br /&gt;
      CRT &#039;                         ----------IL9---------&#039;&lt;br /&gt;
      CRT &#039;AF          ATB Finder, search definitions                          - AF MRKTNG&#039;&lt;br /&gt;
      CRT &#039;DDD         Search dictionary definitions                 - DDD LS.MASTER EQUIP&#039;&lt;br /&gt;
      CRT &#039;LISTA       Show users logged in, as well as locks&#039;&lt;br /&gt;
      CRT &#039;                         ----------IL10--------&#039;&lt;br /&gt;
      CRT &#039;FIELD       Show IL10 attribute/field metadata            - FIELD LS.NET.INVEST&#039;&lt;br /&gt;
      CRT &#039;NED         Edit an IL10 record                 - NED LS.MASTER 123-1234567-000&#039;&lt;br /&gt;
      CRT &#039;NSEL        Run a simple UD command - NSEL LS.INV.NUM N.CONTRACT.KEY N.DATE.DUE&#039;&lt;br /&gt;
      CRT &#039;DESC        Describe columns in a table                - DESC LS_OI_CTD_INVOICE&#039;&lt;br /&gt;
      CRT &#039;SQL         Run a SQL command -SQL SELECT TOP 10 ALTERNATE_ID FROM LS_MASTER_NF&#039;&lt;br /&gt;
      CRT &#039;SQLF        Run a SQL command from a file        - SQLF /tmp/queries/Query1.sql&#039;&lt;br /&gt;
      CRT &#039;SQL-LIST    SQL to L1 -SQL-LIST L1 SELECT TOP 10 ALTERNATE_ID FROM LS_MASTER_NF&#039;&lt;br /&gt;
      CRT &#039;XREF        Show IL10 file/table metadata                      - XREF LS.MASTER&#039;&lt;br /&gt;
      CRT &#039;                              ---INFOLEASE---&#039;&lt;br /&gt;
      CRT &#039;BPI         List table definitions                        - BPI LS.CTD.PYMTHIST&#039;&lt;br /&gt;
      CRT &#039;CHECK.FILE  Show strings in a compiled program /P|/S    - CHECK.FILE DISP.00 /P&#039;&lt;br /&gt;
      CRT &#039;{C}CI/CM/TM {Customer}Contract Inquiry/Maintenance/Table Maintenance&#039;&lt;br /&gt;
      CRT &#039;FIND.MENU   Search the menus                                   - FIND.MENU VOID&#039;&lt;br /&gt;
      CRT &#039;PARAM       Show parameter file mapping&#039;&lt;br /&gt;
      CRT &#039;RS          Edit a recall                                       RS DK.AUDIT.RPT&#039;&lt;br /&gt;
      CRT &#039;                             -----GENERAL-----&#039;&lt;br /&gt;
      CRT &#039;ICONV/OCONV Test format masks/Convert Data&#039;&lt;br /&gt;
      CRT &#039;PICKLE      Store data records in prog     - PICKLE DICT LS.MASTER UATB.BIG.ATB&#039;&lt;br /&gt;
      CRT &#039;PIVOT       Summary data                - PIVOT LS.MASTER LESSOR GROSS.CONTRACT&#039;&lt;br /&gt;
      CRT &#039;PROF        Profile data     - PROF LS.MASTER BRANCH NUM.OF.ASSETS BOOKING.DATE&#039;&lt;br /&gt;
      CRT &#039;RULER       Reset term width, show ruler&#039;&lt;br /&gt;
      CRT &#039;SETTINGS    Change settings&#039;&lt;br /&gt;
      CRT &#039;SF          Search files and dictionaries            - SF DICT LS.MASTER ASSETS&#039;&lt;br /&gt;
    CASE ANS = &#039;.T&#039;&lt;br /&gt;
      TIME.COMMAND=NOT(TIME.COMMAND)&lt;br /&gt;
    CASE ANS = &#039;.U&#039;&lt;br /&gt;
      IF MCU.ON THEN MCU.ON = FALSE;PRINT &#039;upper case off&#039; ELSE MCU.ON = TRUE;PRINT &#039;UPPER CASE ON&#039;&lt;br /&gt;
    CASE OTHERWISE&lt;br /&gt;
      PRINT &#039;There is no such STACK command&#039;:BELL&lt;br /&gt;
      PRINT &#039;? for help&#039;&lt;br /&gt;
  END CASE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
GET.PARAMS:&lt;br /&gt;
  I = INDEX(ANS,&#039;,&#039;,1)&lt;br /&gt;
  IF I # 0 THEN&lt;br /&gt;
    L = I-1;P1 = NUL&lt;br /&gt;
    LOOP&lt;br /&gt;
      IF NUM(ANS[L,1]) THEN P1 = ANS[L,1]:P1;L=L-1 ELSE EXIT&lt;br /&gt;
    REPEAT&lt;br /&gt;
    P2 = ANS[I + 1, LEN.ANS]&lt;br /&gt;
  END ELSE&lt;br /&gt;
    P1 = NUL&lt;br /&gt;
    LOOP&lt;br /&gt;
      IF NUM(ANS[LEN.ANS,1]) THEN P1 = ANS[LEN.ANS,1]:P1;LEN.ANS=LEN.ANS-1 ELSE EXIT&lt;br /&gt;
    REPEAT&lt;br /&gt;
    IF P1 = NUL THEN P1 = 1&lt;br /&gt;
    P2 = P1&lt;br /&gt;
  END&lt;br /&gt;
  IF P1 = NUL THEN P1 = 1&lt;br /&gt;
  IF P2 = NUL THEN P2 = MAX.STACK&lt;br /&gt;
  IF NUM(P1) &amp;amp; NUM(P2) &amp;amp; P1 &amp;gt; 0 THEN&lt;br /&gt;
    RANGE.ERROR = FALSE&lt;br /&gt;
  END ELSE&lt;br /&gt;
    RANGE.ERROR = TRUE&lt;br /&gt;
    PRINT &#039;Range Error&#039;:BELL&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
EDIT:&lt;br /&gt;
  * Some of the stuff in here is redundant, repeating COMMAND&lt;br /&gt;
  * but to gosub command introduces re-entrancy problems&lt;br /&gt;
  * That&#039;s why we use the dreaded GOTO command&lt;br /&gt;
  N = ANS[3,LEN.ANS]&lt;br /&gt;
  IF NOT(NUM(N)) THEN PRINT &#039;No such line number - &#039;:N:BELL;RETURN&lt;br /&gt;
  IF N = NUL THEN N = 1&lt;br /&gt;
  LOOP WHILE N # NUL AND STACK&amp;lt;N&amp;gt; # NUL DO&lt;br /&gt;
    PRINT UP:N &#039;R%3&#039;:&#039;:&#039;:EOL:&lt;br /&gt;
    ENTRY = STACK&amp;lt;N,4&amp;gt;&lt;br /&gt;
    IF ENTRY = &amp;quot;&amp;quot; THEN ENTRY = STACK&amp;lt;N&amp;gt; ;* Legacy stack commands, no timestamp&lt;br /&gt;
    X = 5;DISP.LEN = TERM.WIDTH-1-X;LEN = LONG.LINE&lt;br /&gt;
    IF ENTRY # NUL THEN&lt;br /&gt;
      OLD.ENTRY = ENTRY&lt;br /&gt;
      GOSUB GET.INPUT&lt;br /&gt;
      ANS = ENTRY&lt;br /&gt;
    END&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
      CASE RTN = UP.KEY&lt;br /&gt;
        IF SEARCH.FOR # NUL THEN&lt;br /&gt;
          GO SEARCH.COMMAND&lt;br /&gt;
        END ELSE&lt;br /&gt;
          N = N + 1&lt;br /&gt;
          IF STACK&amp;lt;N&amp;gt; = NUL THEN N = 1&lt;br /&gt;
        END&lt;br /&gt;
      CASE RTN = DOWN.KEY&lt;br /&gt;
        N = N - 1&lt;br /&gt;
        IF N = 0 THEN&lt;br /&gt;
          N=1; PRINT BELL:&lt;br /&gt;
        END&lt;br /&gt;
      CASE RTN = RET&lt;br /&gt;
        UNIX.COMMAND=FALSE&lt;br /&gt;
        IF ANS[1,1] = UNIX THEN UNIX.COMMAND=TRUE&lt;br /&gt;
        IF UNIX.COMMAND THEN&lt;br /&gt;
          EXECUTING = FALSE&lt;br /&gt;
          IF N = 1 AND ENTRY = OLD.ENTRY THEN EXECUTING = TRUE&lt;br /&gt;
          GOSUB DO.COMMAND&lt;br /&gt;
          N=NUL&lt;br /&gt;
        END ELSE&lt;br /&gt;
          C.LIST = ANS&lt;br /&gt;
          C.COUNT = 1&lt;br /&gt;
          LOOP&lt;br /&gt;
            ANS = FIELD(C.LIST,COMMAND.SEPERATOR,C.COUNT)&lt;br /&gt;
          UNTIL ANS = NUL DO&lt;br /&gt;
            EXECUTING = FALSE&lt;br /&gt;
            IF N = 1 AND ENTRY = OLD.ENTRY THEN EXECUTING = TRUE&lt;br /&gt;
            GOSUB DO.COMMAND&lt;br /&gt;
            C.COUNT = C.COUNT + 1&lt;br /&gt;
          REPEAT&lt;br /&gt;
          N = NUL&lt;br /&gt;
        END&lt;br /&gt;
      CASE RTN = ESC&lt;br /&gt;
        N = NUL&lt;br /&gt;
    END CASE&lt;br /&gt;
  REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SEARCH.COMMAND:&lt;br /&gt;
  * Search the stack for a string&lt;br /&gt;
  IF SEARCH.FOR = NUL THEN SEARCH.FOR = ANS[2,LONG.LINE]&lt;br /&gt;
  FOUND = FALSE&lt;br /&gt;
  FOR F = START.WORD.SEARCH TO MAX.STACK UNTIL FOUND OR STACK&amp;lt;F&amp;gt; = NUL&lt;br /&gt;
    IF INDEX(STACK&amp;lt;F,4&amp;gt;,SEARCH.FOR,1) # 0 THEN FOUND = TRUE&lt;br /&gt;
  NEXT F&lt;br /&gt;
  IF FOUND THEN&lt;br /&gt;
    START.WORD.SEARCH = F&lt;br /&gt;
    ANS = &#039;.R&#039;:F-1&lt;br /&gt;
    GO EDIT&lt;br /&gt;
  END&lt;br /&gt;
  PRINT BELL:SEARCH.FOR:&#039; event not found&#039;&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
PROG.COMMAND:&lt;br /&gt;
  IF ANS = PROG.CHAR OR ANS=PROG.CHAR:PROG.CHAR THEN GO PRINT.PROG.INFO&lt;br /&gt;
  GOSUB PARSE.PROG.COM&lt;br /&gt;
  ANS=PROG.COM:SPC:B.FILE:SPC:B.ITEM&lt;br /&gt;
  *GOSUB UPDATE.STACK&lt;br /&gt;
  BEGIN CASE&lt;br /&gt;
    CASE PROG.COM = &#039;/WW&#039;&lt;br /&gt;
      WRITE PROGRAMS ON HOME.F, PROGRAM.ITEM&lt;br /&gt;
      WP.FILE=HOME.FILE&lt;br /&gt;
      WP.ITEM=PROGRAM.ITEM&lt;br /&gt;
      GOSUB WP.EDIT&lt;br /&gt;
      READ PROGRAMS FROM HOME.F, PROGRAM.ITEM ELSE PROGRAMS = NUL&lt;br /&gt;
    CASE PROG.COM = &#039;/N&#039;&lt;br /&gt;
      GOSUB GET.PROG.NAME&lt;br /&gt;
      IF RTN=13 THEN&lt;br /&gt;
        PROGRAMS&amp;lt;PROG.NUM&amp;gt; = PROG&lt;br /&gt;
        WRITE PROGRAMS ON HOME.F, PROGRAM.ITEM&lt;br /&gt;
      END&lt;br /&gt;
      IF B.FILE # &#039;&#039; THEN&lt;br /&gt;
        OPEN B.FILE TO F THEN&lt;br /&gt;
          OPTIONS=&#039;&#039;&lt;br /&gt;
          READ DUMMY FROM F, B.ITEM ELSE&lt;br /&gt;
            PRINT B.ITEM:&#039; not found.  Use standard header? &#039;:&lt;br /&gt;
            INPUT YORN&lt;br /&gt;
            IF YORN = &#039;Y&#039; THEN&lt;br /&gt;
              HEADER=STR(&#039;*&#039;,80)&lt;br /&gt;
              HEADER&amp;lt;2&amp;gt;=&#039;* Program: &#039;:B.ITEM&lt;br /&gt;
              HEADER&amp;lt;3&amp;gt;=&#039;* Author : &#039;:USERNAME&lt;br /&gt;
              HEADER&amp;lt;4&amp;gt;=&#039;* Date   : &#039;:OCONV(DATE(),&amp;quot;D-YMD&amp;quot;) ;* E.g. 2017-04-20&lt;br /&gt;
              HEADER&amp;lt;5&amp;gt;=&#039;* Version: 1.0&#039;&lt;br /&gt;
              HEADER&amp;lt;6&amp;gt;=&#039;* Comment: Do NOT skip the description&#039;&lt;br /&gt;
              HEADER&amp;lt;7&amp;gt;=STR(&#039;*&#039;,80)&lt;br /&gt;
              WRITE HEADER ON F, B.ITEM&lt;br /&gt;
            END&lt;br /&gt;
          END&lt;br /&gt;
          CLOSE F&lt;br /&gt;
          WP.FILE=B.FILE&lt;br /&gt;
          WP.ITEM=B.ITEM&lt;br /&gt;
          GOSUB WP.EDIT&lt;br /&gt;
        END ELSE&lt;br /&gt;
          PRINT B.FILE:&#039; is not a file in this account&#039;&lt;br /&gt;
        END&lt;br /&gt;
      END&lt;br /&gt;
    CASE PROG.COM = &#039;/H&#039;&lt;br /&gt;
      OPTIONS=&#039;LESS&#039;&lt;br /&gt;
      *CALL CVS.LOG(RTN, B.FILE, B.ITEM, OPTIONS)&lt;br /&gt;
    CASE PROG.COM = &#039;/L&#039;&lt;br /&gt;
      * Load a new program stack&lt;br /&gt;
      STACK.NAME=TRIM(OPTIONS)&lt;br /&gt;
      IF STACK.NAME = &#039;&#039; THEN&lt;br /&gt;
        PROGRAM.ITEM=&#039;.STACK.PROGRAM_&#039;:USERNAME&lt;br /&gt;
      END ELSE&lt;br /&gt;
        PROGRAM.ITEM=&#039;.STACK.PROGRAM_&#039;:USERNAME:&#039;_&#039;:STACK.NAME&lt;br /&gt;
      END&lt;br /&gt;
      READ PROGRAMS FROM HOME.F, PROGRAM.ITEM ELSE PROGRAMS = NUL&lt;br /&gt;
      SETTINGS&amp;lt;15&amp;gt;=STACK.NAME&lt;br /&gt;
      GOSUB WRITE.INFO&lt;br /&gt;
    CASE PROG.COM = &#039;/LL&#039;&lt;br /&gt;
      * List the different program stacks&lt;br /&gt;
      EXEC.LINE=\SSELECT \:HOME.FILE:\ WITH @ID = &amp;quot;.STACK.PROGRAM]&amp;quot;\&lt;br /&gt;
      GOSUB EXEC.SUB&lt;br /&gt;
      LOOP&lt;br /&gt;
        READNEXT ID ELSE EXIT&lt;br /&gt;
        PRINT ID&lt;br /&gt;
      REPEAT&lt;br /&gt;
    CASE PROG.COM = &#039;/CI&#039;&lt;br /&gt;
      * Check it in&lt;br /&gt;
      OPTIONS=&#039;&#039;&lt;br /&gt;
      *CALL CVS.CHECKIN(RTN, B.FILE, B.ITEM, OPTIONS)&lt;br /&gt;
    CASE PROG.COM = &#039;/D&#039;&lt;br /&gt;
      * CVS Diff&lt;br /&gt;
      OPTIONS=&#039;SHOW&#039;&lt;br /&gt;
      *CALL CVS.DIFF(RTN, B.FILE, B.ITEM, OPTIONS)&lt;br /&gt;
    CASE B.FILE[1,1] = &#039;*&#039; OR B.FILE=&#039;&#039;&lt;br /&gt;
      NULL ;* Don&#039;t do anything with &#039;comment&#039; or blank entries&lt;br /&gt;
    CASE PROG.COM = &#039;/BR&#039;&lt;br /&gt;
      GOSUB COMPILE&lt;br /&gt;
      EXEC.LINE = B.ITEM&lt;br /&gt;
      GOSUB EXEC.SUB&lt;br /&gt;
    CASE PROG.COM = &#039;/B&#039;&lt;br /&gt;
      GOSUB COMPILE&lt;br /&gt;
    CASE PROG.COM = &#039;/E&#039; OR PROG.COM = &#039;/W&#039;&lt;br /&gt;
      OPEN B.FILE TO F ELSE PRINT &#039;Cannot open &#039;:B.FILE:BELL;RETURN&lt;br /&gt;
      READ R1 FROM F, B.ITEM ELSE R1=NUL&lt;br /&gt;
      IF PROG.COM = &#039;/E&#039; THEN&lt;br /&gt;
        EXEC.LINE = ED.VERB:SPC:PROG:OPTIONS&lt;br /&gt;
        GOSUB EXEC.SUB&lt;br /&gt;
      END ELSE&lt;br /&gt;
        WP.FILE=B.FILE&lt;br /&gt;
        WP.ITEM=B.ITEM&lt;br /&gt;
        GOSUB WP.EDIT&lt;br /&gt;
      END&lt;br /&gt;
      CLOSE F&lt;br /&gt;
    CASE PROG.COM = &#039;/F&#039;&lt;br /&gt;
      GOSUB BFORMAT&lt;br /&gt;
    CASE PROG.COM = &#039;/R&#039;&lt;br /&gt;
      OPEN B.FILE TO F ELSE PRINT &#039;Cannot open &#039;:B.FILE:BELL;RETURN&lt;br /&gt;
      READV R FROM F, B.ITEM, 1 ELSE R=NUL&lt;br /&gt;
      CLOSE F&lt;br /&gt;
      EXEC.LINE = B.ITEM:OPTIONS&lt;br /&gt;
      GOSUB EXEC.SUB&lt;br /&gt;
    CASE PROG.COM = &#039;/S&#039;&lt;br /&gt;
      * A slow sort of the program stack&lt;br /&gt;
      READ REC FROM HOME.F, PROGRAM.ITEM ELSE PRINT &#039;CANNOT READ &#039;:HOME.FILE:&#039; &#039;:PROGRAM.ITEM ; RETURN&lt;br /&gt;
      SORT=&#039;AL&#039; ; NEW.REC=&#039;&#039;&lt;br /&gt;
      I=DCOUNT(REC,@AM)&lt;br /&gt;
      FOR F=1 TO I&lt;br /&gt;
        L=REC&amp;lt;F&amp;gt;&lt;br /&gt;
        LOCATE L IN NEW.REC BY SORT SETTING POS ELSE NULL&lt;br /&gt;
        INS L BEFORE NEW.REC&amp;lt;POS&amp;gt;&lt;br /&gt;
      NEXT F&lt;br /&gt;
      WRITE NEW.REC ON HOME.F, PROGRAM.ITEM&lt;br /&gt;
    CASE OTHERWISE&lt;br /&gt;
      PRINT &#039;There is no such PROGRAM command&#039;:BELL&lt;br /&gt;
      PRINT &#039;? for help&#039;&lt;br /&gt;
  END CASE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
COMPILE:&lt;br /&gt;
  OPTIONS=&#039;&#039;&lt;br /&gt;
  * Check for global catalog&lt;br /&gt;
  READ DUMMY FROM CTLGTB, B.ITEM THEN&lt;br /&gt;
    PRINT B.ITEM:&#039; is cataloged globally&#039;&lt;br /&gt;
    OPTIONS=&#039;G&#039;&lt;br /&gt;
  END&lt;br /&gt;
  *&lt;br /&gt;
  * Check for local catalog&lt;br /&gt;
  READ DUMMY FROM CTLG, B.ITEM THEN&lt;br /&gt;
    PRINT B.ITEM:&#039; is cataloged locally&#039;&lt;br /&gt;
    OPTIONS :=&#039;L&#039;&lt;br /&gt;
  END&lt;br /&gt;
  *&lt;br /&gt;
  * Check for direct catalog&lt;br /&gt;
  READ DUMMY FROM VOC, B.ITEM THEN&lt;br /&gt;
    IF INDEX(DUMMY&amp;lt;2&amp;gt;,&#039;/CTLG/&#039;,1)=0 THEN&lt;br /&gt;
      PRINT B.ITEM:&#039; is cataloged direct to &#039;:DUMMY&amp;lt;2&amp;gt;&lt;br /&gt;
      OPTIONS :=&#039;D&#039;&lt;br /&gt;
    END&lt;br /&gt;
  END&lt;br /&gt;
  *&lt;br /&gt;
  IF LEN(OPTIONS) &amp;gt; 1 THEN&lt;br /&gt;
    PRINT &amp;quot;OPTIONS=&amp;quot;:OPTIONS&lt;br /&gt;
    PRINT &amp;quot;I do not like green eggs and ham, nor do I like&amp;quot;&lt;br /&gt;
    PRINT &amp;quot;programs cataloged twice.  You must fix, Sam&amp;quot;&lt;br /&gt;
    RETURN&lt;br /&gt;
  END&lt;br /&gt;
  *&lt;br /&gt;
  LOOP&lt;br /&gt;
  UNTIL OPTIONS#&#039;&#039; DO&lt;br /&gt;
    PRINT &#039;Catalog &#039;:B.ITEM:&#039; -- D)irect, L)ocal or G)lobal :&#039;:&lt;br /&gt;
    INPUT OPTIONS&lt;br /&gt;
    OPTIONS=UPCASE(OPTIONS)&lt;br /&gt;
    IF OPTIONS = &#039;/&#039; OR OPTIONS=&#039;&#039; THEN RETURN&lt;br /&gt;
    * Have to enter D, L or G&lt;br /&gt;
    IF OPTIONS # &#039;L&#039; AND OPTIONS # &#039;G&#039; AND OPTIONS # &#039;D&#039; THEN OPTIONS=&#039;&#039;&lt;br /&gt;
  REPEAT&lt;br /&gt;
  *&lt;br /&gt;
  EXEC.LINE = &#039;BASIC &#039;:B.FILE:&#039; &#039;:B.ITEM:&#039; -D&#039; ;* -D includes symbol table&lt;br /&gt;
  PRINT EXEC.LINE&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
  *&lt;br /&gt;
  BEGIN CASE&lt;br /&gt;
    CASE OPTIONS=&#039;G&#039;&lt;br /&gt;
      EXEC.LINE = &#039;CATALOG &#039;:B.FILE:&#039; &#039;:B.ITEM:&#039; FORCE&#039;&lt;br /&gt;
      PRINT EXEC.LINE&lt;br /&gt;
      GOSUB EXEC.SUB&lt;br /&gt;
      * Global, so remove direct or local pointers&lt;br /&gt;
      READ R FROM VOC, B.ITEM THEN DELETE VOC, B.ITEM&lt;br /&gt;
    CASE OPTIONS=&#039;L&#039;&lt;br /&gt;
      EXEC.LINE = &#039;CATALOG &#039;:PROG:&#039; LOCAL FORCE&#039;&lt;br /&gt;
      PRINT EXEC.LINE&lt;br /&gt;
      GOSUB EXEC.SUB&lt;br /&gt;
      * Object is in CTLG file, so remove from SOURCE file&lt;br /&gt;
      OPEN B.FILE TO F ELSE PRINT &#039;Cannot open &#039;:B.FILE:BELL;RETURN&lt;br /&gt;
      DELETE F, &#039;_&#039;:B.ITEM&lt;br /&gt;
      CLOSE F&lt;br /&gt;
    CASE OPTIONS=&#039;D&#039;&lt;br /&gt;
      EXEC.LINE = &#039;CATALOG &#039;:B.FILE:&#039; &#039;:B.ITEM:&#039; DIRECT FORCE&#039;&lt;br /&gt;
      PRINT EXEC.LINE&lt;br /&gt;
      GOSUB EXEC.SUB&lt;br /&gt;
  END CASE&lt;br /&gt;
  *&lt;br /&gt;
  EXEC.LINE = &#039;NEWPCODE&#039; ;* This loads a new version of globally cataloged programs&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
PARSE.PROG.COM:&lt;br /&gt;
  PROG.NUM = NUL&lt;br /&gt;
  F = FIELD(ANS,SPC,1);L = LEN(F);I = L&lt;br /&gt;
  LOOP&lt;br /&gt;
    IF NUM(F[I,1]) THEN PROG.NUM = F[I,1]:PROG.NUM ELSE EXIT&lt;br /&gt;
    I = I - 1&lt;br /&gt;
  REPEAT&lt;br /&gt;
  IF PROG.NUM = NUL THEN PROG.NUM = 1&lt;br /&gt;
  OPTIONS = ANS[L+1,LONG.LINE]&lt;br /&gt;
  PROG.COM = ANS[1,I]&lt;br /&gt;
  PROG = PROGRAMS&amp;lt;PROG.NUM&amp;gt;&lt;br /&gt;
  B.FILE = FIELD(PROG,SPC,1)&lt;br /&gt;
  B.ITEM = FIELD(PROG,SPC,2)&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
GET.PROG.NAME:&lt;br /&gt;
  X = 15;DISP.LEN = 50;LEN = LONG.LINE;ENTRY = PROG&lt;br /&gt;
  PRINT &#039;Program Name :&#039;:&lt;br /&gt;
  GOSUB GET.INPUT&lt;br /&gt;
  ANS = UPCASE(ENTRY)&lt;br /&gt;
  IF RTN # 13 THEN RETURN&lt;br /&gt;
  GOSUB EXPAND.ALIASES&lt;br /&gt;
  IF INDEX(ANS,SPC,1) THEN&lt;br /&gt;
    B.FILE = FIELD(ANS,SPC,1)&lt;br /&gt;
    B.ITEM = FIELD(ANS,SPC,2)&lt;br /&gt;
    PROG=ANS&lt;br /&gt;
  END ELSE&lt;br /&gt;
    IF ANS = NUL THEN&lt;br /&gt;
      B.FILE = NUL ; B.ITEM = NUL ;PROG = NUL&lt;br /&gt;
    END ELSE&lt;br /&gt;
      B.FILE = WORK.FILE ; B.ITEM = ANS ; PROG = B.FILE:SPC:B.ITEM&lt;br /&gt;
    END&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
PRINT.PROG.INFO:&lt;br /&gt;
  I = DCOUNT(PROGRAMS,@AM)&lt;br /&gt;
  PRINT STACK.NAME&lt;br /&gt;
  FOR F = 1 TO I&lt;br /&gt;
    IF PROGRAMS&amp;lt;F&amp;gt; # NUL THEN&lt;br /&gt;
      CH=&#039; &#039;&lt;br /&gt;
      IF ANS=PROG.CHAR:PROG.CHAR THEN&lt;br /&gt;
        * We want cvs status as well&lt;br /&gt;
        FILE=FIELD(PROGRAMS&amp;lt;F&amp;gt;,&#039; &#039;,1)&lt;br /&gt;
        ITEM=FIELD(PROGRAMS&amp;lt;F&amp;gt;,&#039; &#039;,2)&lt;br /&gt;
        R=&#039;&#039;&lt;br /&gt;
        *CALL CVS.STATUS(R,FILE,ITEM,&#039;&#039;)&lt;br /&gt;
        STATUS=R&amp;lt;1&amp;gt;&lt;br /&gt;
        WORK.VER=R&amp;lt;2&amp;gt;&lt;br /&gt;
        CVS.VER=R&amp;lt;3&amp;gt;&lt;br /&gt;
        BEGIN CASE&lt;br /&gt;
          CASE STATUS=&#039;UPTODATE&#039;&lt;br /&gt;
            CH=&#039;  &#039;:WORK.VER&#039;L#9&#039;&lt;br /&gt;
          CASE STATUS=&#039;MODIFIED&#039;&lt;br /&gt;
            CH=&#039;&amp;gt; &#039;:WORK.VER&#039;L#4&#039;:&#039; &#039;:CVS.VER&#039;L#4&#039;&lt;br /&gt;
          CASE 1&lt;br /&gt;
            CH=&#039;! &#039;:SPACE(9)&lt;br /&gt;
        END CASE&lt;br /&gt;
      END&lt;br /&gt;
      PRINT F &#039;L#5&#039;:CH:&#039; &#039;:PROGRAMS&amp;lt;F&amp;gt;&lt;br /&gt;
    END&lt;br /&gt;
  NEXT F&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
WRITE.INFO:&lt;br /&gt;
  WRITE STACK ON HOME.F, STACK.ITEM&lt;br /&gt;
  WRITE ALIASES ON HOME.F, ALIAS.ITEM&lt;br /&gt;
  WRITE PROGRAMS ON HOME.F, PROGRAM.ITEM&lt;br /&gt;
  WRITE SETTINGS ON HOME.F, SETTING.ITEM&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
UPDATE.STACK:&lt;br /&gt;
  INS ACC:@VM:DATE():@VM:TIME():@VM:ANS BEFORE STACK&amp;lt;1&amp;gt;&lt;br /&gt;
  WRITE STACK ON HOME.F, STACK.ITEM&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
WP.EDIT:&lt;br /&gt;
  * Edit a record using a visual editor (e.g. vi, joe or emacs)&lt;br /&gt;
  DICT=0&lt;br /&gt;
  IF FIELD(WP.FILE,&#039; &#039;,1)=&#039;DICT&#039; THEN WP.FILE=FIELD(WP.FILE,&#039; &#039;,2) ; DICT=1&lt;br /&gt;
  READ REC FROM VOC, WP.FILE ELSE PRINT WP.FILE:&#039; - no VOC item&#039; ; RETURN&lt;br /&gt;
  IF (REC&amp;lt;1&amp;gt;#&#039;DIR&#039; AND REC&amp;lt;1&amp;gt;#&#039;LD&#039;) OR DICT THEN&lt;br /&gt;
    * Copy to a temp DIR type and edit there, ignore the race conditions!&lt;br /&gt;
    IF DICT THEN WP.FILE=&#039;DICT &#039;:WP.FILE&lt;br /&gt;
    OPEN WP.FILE TO T ELSE PRINT WP.FILE:&#039; - cannot OPEN&#039; ; RETURN&lt;br /&gt;
    READ R FROM T, WP.ITEM ELSE PRINT WP.ITEM:&#039; - not found&#039; ; RETURN&lt;br /&gt;
    WRITE R ON HOLD, WP.ITEM&lt;br /&gt;
    WP.PATH=&#039;_HOLD_&#039;&lt;br /&gt;
    DIR.TYPE=0&lt;br /&gt;
  END ELSE&lt;br /&gt;
    WP.PATH=REC&amp;lt;2&amp;gt;&lt;br /&gt;
    IF REC&amp;lt;1&amp;gt;=&#039;LD&#039; THEN&lt;br /&gt;
      IF INDEX(FILE,&#039;,&#039;,1) THEN&lt;br /&gt;
        WP.PATH=REC&amp;lt;2&amp;gt;:FIELD(FILE,&#039;,&#039;,2)&lt;br /&gt;
      END ELSE&lt;br /&gt;
        WP.PATH=REC&amp;lt;2&amp;gt;:&#039;/&#039;:FIELD(REC&amp;lt;2&amp;gt;,&#039;/&#039;,DCOUNT(REC&amp;lt;2&amp;gt;,&#039;/&#039;))&lt;br /&gt;
      END&lt;br /&gt;
    END&lt;br /&gt;
    DIR.TYPE=1&lt;br /&gt;
  END&lt;br /&gt;
  EXEC.LINE=WP.VERB:&#039; &#039;:WP.PATH:&#039;/&#039;:WP.ITEM&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
  IF NOT(DIR.TYPE) THEN&lt;br /&gt;
    * Copy back to original location&lt;br /&gt;
    READ R FROM HOLD, WP.ITEM ELSE R=&#039;&#039;&lt;br /&gt;
    WRITE R ON T, WP.ITEM&lt;br /&gt;
    CLOSE T&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
CHECK.FILE:&lt;br /&gt;
  PARAM.CTR=1 ; PROG.FLAG=0 ; FILE.FLAG=0 ; ALL.FLAG=0&lt;br /&gt;
  LOOP&lt;br /&gt;
    P=FIELD(ANS,&#039; &#039;,PARAM.CTR)&lt;br /&gt;
  UNTIL P=&#039;&#039; DO&lt;br /&gt;
    IF P[1,1] = &#039;/&#039; THEN&lt;br /&gt;
      P=P[2,1]&lt;br /&gt;
      BEGIN CASE&lt;br /&gt;
        CASE P=&#039;P&#039;&lt;br /&gt;
          PROG.FLAG=1&lt;br /&gt;
        CASE P=&#039;F&#039;&lt;br /&gt;
          FILE.FLAG=1&lt;br /&gt;
        CASE P=&#039;A&#039;&lt;br /&gt;
          ALL.FLAG=1&lt;br /&gt;
      END CASE&lt;br /&gt;
    END ELSE&lt;br /&gt;
      PROG=P&lt;br /&gt;
    END&lt;br /&gt;
    PARAM.CTR += 1&lt;br /&gt;
  REPEAT&lt;br /&gt;
  IF PROG.FLAG=0 AND FILE.FLAG=0 THEN ALL.FLAG=1&lt;br /&gt;
  *&lt;br /&gt;
  IF PROG # &#039;&#039; THEN&lt;br /&gt;
    READ CAT.PTR FROM VOC, PROG ELSE PRINT &#039;Cannot read VOC &#039;:PROG ; RETURN&lt;br /&gt;
  END ELSE&lt;br /&gt;
    LOOP&lt;br /&gt;
      PRINT &#039;Enter the program to scan &#039;:&lt;br /&gt;
      INPUT PROG&lt;br /&gt;
      IF PROG = &#039;&#039; OR PROG = &#039;/&#039; THEN RETURN&lt;br /&gt;
      READ CAT.PTR FROM VOC, PROG THEN EXIT&lt;br /&gt;
      PRINT &#039;Cannot read VOC &#039;:PROG&lt;br /&gt;
    REPEAT&lt;br /&gt;
  END&lt;br /&gt;
  *&lt;br /&gt;
  EXECUTE &amp;quot;!strings &amp;quot;:CAT.PTR&amp;lt;2&amp;gt;:&amp;quot; &amp;gt; $HOME/FILE.LIST&amp;quot;&lt;br /&gt;
  *&lt;br /&gt;
  FILE.LIST=&#039;&#039;&lt;br /&gt;
  READ R FROM HOME.F, &#039;FILE.LIST&#039; THEN&lt;br /&gt;
    I=DCOUNT(R,@AM)&lt;br /&gt;
    FOR F=1 TO I&lt;br /&gt;
      TEST.FILE=R&amp;lt;F&amp;gt;&lt;br /&gt;
      IF FILE.FLAG THEN&lt;br /&gt;
        OPEN TEST.FILE TO DUMMY THEN&lt;br /&gt;
          LOCATE TEST.FILE IN FILE.LIST BY &#039;AL&#039; SETTING POS ELSE&lt;br /&gt;
            INS TEST.FILE BEFORE FILE.LIST&amp;lt;POS&amp;gt;&lt;br /&gt;
            PRINT &#039;FILE:&#039;:TEST.FILE&lt;br /&gt;
          END&lt;br /&gt;
          CLOSE DUMMY&lt;br /&gt;
        END&lt;br /&gt;
      END&lt;br /&gt;
      IF PROG.FLAG THEN&lt;br /&gt;
        READ DUMMY FROM VOC, TEST.FILE THEN&lt;br /&gt;
          *IF DUMMY = &#039;C&#039; THEN PRINT &#039;PROG: &#039;:TEST.FILE&lt;br /&gt;
          IF DUMMY&amp;lt;1&amp;gt;=&#039;C&#039; THEN PRINT &#039;PROG: &#039;:TEST.FILE&#039;L#25&#039;:&#039; &#039;:DUMMY&amp;lt;2&amp;gt;&lt;br /&gt;
        END&lt;br /&gt;
      END&lt;br /&gt;
      IF ALL.FLAG THEN&lt;br /&gt;
        PRINT TEST.FILE&lt;br /&gt;
      END&lt;br /&gt;
    NEXT F&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
CONV:&lt;br /&gt;
  * Handy way to check ICONV/OCONV data&lt;br /&gt;
  LOOP&lt;br /&gt;
    PRINT &#039;Enter mask:&#039;:&lt;br /&gt;
    INPUT MASK&lt;br /&gt;
    IF MASK=&#039;&#039; OR MASK=&#039;/&#039; THEN RETURN&lt;br /&gt;
    PRINT &#039;Enter data:&#039;:&lt;br /&gt;
    INPUT DTA&lt;br /&gt;
    PRINT &#039;Result:&#039;:&lt;br /&gt;
    IF CONV=&#039;I&#039; THEN PRINT ICONV(DTA,MASK) ELSE PRINT OCONV(DTA,MASK)&lt;br /&gt;
  REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
RULER:&lt;br /&gt;
  CRT &#039;Term width=&#039;:TERM.WIDTH&lt;br /&gt;
  FOR F=1 TO TERM.WIDTH&lt;br /&gt;
    C=SEQ(0)+MOD(F,10)&lt;br /&gt;
    IF MOD(F,10) THEN PRINT CHAR(C): ELSE PRINT &#039; &#039;:&lt;br /&gt;
  NEXT F&lt;br /&gt;
  PRINT&lt;br /&gt;
  SUP.NEXT=0&lt;br /&gt;
  FOR F=1 TO TERM.WIDTH&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
      CASE MOD(F+1,10)=0 AND (F+1)/10 &amp;gt; 9&lt;br /&gt;
        PRINT (F+1)/10:&lt;br /&gt;
        SUP.NEXT=1&lt;br /&gt;
      CASE MOD(F,10)=0 AND F/10 &amp;lt;= 9&lt;br /&gt;
        PRINT F/10:&lt;br /&gt;
        SUP.NEXT=0&lt;br /&gt;
      CASE MOD(F,5)=0 AND NOT(SUP.NEXT)&lt;br /&gt;
        PRINT &#039;+&#039;:&lt;br /&gt;
      CASE 1&lt;br /&gt;
        IF NOT(SUP.NEXT) THEN PRINT &#039; &#039;:&lt;br /&gt;
        SUP.NEXT=0&lt;br /&gt;
    END CASE&lt;br /&gt;
  NEXT F&lt;br /&gt;
  PRINT&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
PIVOT:&lt;br /&gt;
  * Summarize a field, e.g. PIVOT LS.MASTER LESSOR GROSS.CONTRACT EQUIPMENT.COST&lt;br /&gt;
  FILE=FIELD(ANS,&amp;quot; &amp;quot;,2) ; ATB =FIELD(ANS,&amp;quot; &amp;quot;,3) ; ATB2=FIELD(ANS,&amp;quot; &amp;quot;,4) ; ATB3=FIELD(ANS,&amp;quot; &amp;quot;,5) ; ATB4=FIELD(ANS,&amp;quot; &amp;quot;,6)&lt;br /&gt;
  OPEN &amp;quot;DICT &amp;quot;:FILE TO DICT ELSE PRINT &amp;quot;DICT &amp;quot;:FILE:&#039; not a filename&#039; ; RETURN&lt;br /&gt;
  READ UREC FROM DICT,&amp;quot;UATB.COUNTER&amp;quot; ELSE&lt;br /&gt;
    UREC=\I\;UREC&amp;lt;2&amp;gt;=\&amp;quot;1&amp;quot;\;UREC&amp;lt;4&amp;gt;=\CNTR\;UREC&amp;lt;5&amp;gt;=\8R\;UREC&amp;lt;6&amp;gt;=\S\&lt;br /&gt;
    WRITE UREC ON DICT,&amp;quot;UATB.COUNTER&amp;quot;&lt;br /&gt;
  END&lt;br /&gt;
  CLOSE DICT&lt;br /&gt;
  EXEC.LINE = \SORT \:FILE:\ BY \:ATB:\ BREAK-ON \:ATB:\ TOTAL UATB.COUNTER \&lt;br /&gt;
  IF ATB2 # &amp;quot;&amp;quot; THEN EXEC.LINE := \ TOTAL \:ATB2&lt;br /&gt;
  IF ATB3 # &amp;quot;&amp;quot; THEN EXEC.LINE := \ TOTAL \:ATB3&lt;br /&gt;
  IF ATB4 # &amp;quot;&amp;quot; THEN EXEC.LINE := \ TOTAL \:ATB4&lt;br /&gt;
  EXEC.LINE := \ (IDH \&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
PROFILE:&lt;br /&gt;
  * Profile a field, e.g. PROFILE LS.MASTER REQ.SIGNATURE.PHONE&lt;br /&gt;
  FILE=FIELD(ANS,&amp;quot; &amp;quot;,2) ; ATB =FIELD(ANS,&amp;quot; &amp;quot;,3) ; ATBS=FIELD(ANS,&amp;quot; &amp;quot;,4,99)&lt;br /&gt;
  EXEC.LINE = \SORT \:FILE:\ WITH \:ATB:\ \:ATB:\ \:ATBS&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
DDD:&lt;br /&gt;
  * Tweak DICT VOC with some pickle juice&lt;br /&gt;
  R    =\DICT VOC#AM#@ID#AM#D#AM#0#AM##AM#VOC#AM#30L#AM#S#AM#\&lt;br /&gt;
  R&amp;lt;-1&amp;gt;=\DICT VOC#AM#F1#AM#D#AM#1#AM##AM##AM#5L#AM#S#AM#\&lt;br /&gt;
  R&amp;lt;-1&amp;gt;=\DICT VOC#AM#F2#AM#D#AM#2#AM##AM##AM#50L#AM#S#AM#\&lt;br /&gt;
  OPEN &#039;DICT VOC&#039; TO FVAR ELSE RETURN&lt;br /&gt;
  FOR F=1 TO DCOUNT(R,@AM)&lt;br /&gt;
    REC=R&amp;lt;F&amp;gt;&lt;br /&gt;
    SWAP &amp;quot;#AM#&amp;quot; WITH @AM IN REC&lt;br /&gt;
    FILE=REC&amp;lt;1&amp;gt; ; DEL REC&amp;lt;1&amp;gt;&lt;br /&gt;
    ITEM=REC&amp;lt;1&amp;gt; ; DEL REC&amp;lt;1&amp;gt;&lt;br /&gt;
    WRITE REC ON FVAR,ITEM&lt;br /&gt;
  NEXT F&lt;br /&gt;
  CLOSE FVAR&lt;br /&gt;
  *&lt;br /&gt;
  * List the DICT, e.g DDD AS.MASTER EQUIP&lt;br /&gt;
  FILE = FIELD(ANS,&amp;quot; &amp;quot;,2)&lt;br /&gt;
  SSTR = FIELD(ANS,&amp;quot; &amp;quot;,3)&lt;br /&gt;
  FIND.STR=&amp;quot;&amp;quot;&lt;br /&gt;
  IF SSTR # &amp;quot;&amp;quot; THEN FIND.STR = \WITH @ID = &amp;quot;[\:SSTR:\]&amp;quot; \&lt;br /&gt;
  EXEC.LINE=\SORT DICT \:FILE:\ @ID F1 F2 BY F1 BY F2 \:FIND.STR:\ USING DICT VOC (I \&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SEARCH.FILE:&lt;br /&gt;
  FILE = FIELD(ANS,&amp;quot; &amp;quot;,2)&lt;br /&gt;
  ICTR=3&lt;br /&gt;
  IF FILE=&#039;DICT&#039; THEN ICTR+=1 ; FILE=&#039;DICT &#039;:FIELD(ANS,&amp;quot; &amp;quot;,3)&lt;br /&gt;
  OPEN FILE TO FVAR ELSE PRINT FILE:&#039; - not found&#039; ; RETURN&lt;br /&gt;
  SSTR = FIELD(ANS,&amp;quot; &amp;quot;,ICTR)&lt;br /&gt;
  IF SSTR=&#039;&#039; THEN PRINT &#039;Search for:&#039;: ; INPUT SSTR&lt;br /&gt;
  IF SSTR=&#039;&#039; THEN RETURN&lt;br /&gt;
  *&lt;br /&gt;
  SSTR1=UPCASE(SSTR)&lt;br /&gt;
  SSTR2=DOWNCASE(SSTR)&lt;br /&gt;
  SSTR3=OCONV(SSTR,&amp;quot;MCT&amp;quot;)&lt;br /&gt;
  *&lt;br /&gt;
  DATA SSTR&lt;br /&gt;
  DATA SSTR1&lt;br /&gt;
  DATA SSTR2&lt;br /&gt;
  DATA SSTR3&lt;br /&gt;
  DATA &amp;quot;&amp;quot;&lt;br /&gt;
  EXEC.LINE=\ESEARCH \:FILE:\ WITH @ID # &amp;quot;_]&amp;quot; USING DICT VOC\ ; CAP.ACTIVE=TRUE&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
  *&lt;br /&gt;
  CTR=0 ; FOUND.RECS=&#039;&#039;&lt;br /&gt;
  LOOP&lt;br /&gt;
    READNEXT ID ELSE EXIT&lt;br /&gt;
    READ REC FROM FVAR, ID THEN&lt;br /&gt;
      IDX = INDEX(UPCASE(REC),SSTR1,1)&lt;br /&gt;
      IF IDX OR INDEX(UPCASE(ID),SSTR1,1) THEN&lt;br /&gt;
        CTR+=1&lt;br /&gt;
        FOUND.RECS&amp;lt;1,CTR&amp;gt;=ID&lt;br /&gt;
        IDX -= 10 ; IF IDX &amp;lt; 1 THEN IDX=1&lt;br /&gt;
        LINE=REC[IDX,45]&lt;br /&gt;
        CONVERT @VM TO &amp;quot;]&amp;quot; IN LINE&lt;br /&gt;
        CONVERT @AM TO &amp;quot;~&amp;quot; IN LINE&lt;br /&gt;
        LINE=OCONV(LINE,&amp;quot;MCP&amp;quot;)&lt;br /&gt;
        FOUND.RECS&amp;lt;2,CTR&amp;gt;=LINE&lt;br /&gt;
      END&lt;br /&gt;
    END&lt;br /&gt;
  REPEAT&lt;br /&gt;
  CLOSE FVAR&lt;br /&gt;
  *&lt;br /&gt;
  QUIT = 0 ; CTR=1 ; MAX.ITEMS=DCOUNT(FOUND.RECS&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
  IF MAX.ITEMS=0 THEN PRINT SSTR:&#039; Not found&#039; ; RETURN&lt;br /&gt;
  HDR=@(-1):\SEARCHING FOR &amp;quot;\:SSTR1:\,\:SSTR2:\,\:SSTR3:\&amp;quot; IN \:FILE&lt;br /&gt;
  PRINT HDR&lt;br /&gt;
  LOOP&lt;br /&gt;
    PRINT CTR&#039;R#4&#039;:&#039; &#039;:FOUND.RECS&amp;lt;1,CTR&amp;gt;&#039;L#25&#039;:FOUND.RECS&amp;lt;2,CTR&amp;gt;&#039;L#65&#039;&lt;br /&gt;
    CTR+=1&lt;br /&gt;
    IF CTR/20=INT(CTR/20) THEN GOSUB SEARCH.FILE.PROMPT&lt;br /&gt;
    IF QUIT THEN RETURN&lt;br /&gt;
  REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SEARCH.FILE.PROMPT:&lt;br /&gt;
  PRINT ; PRINT &#039;B)ack, E)dit #, V)iew #, W)P#, /:&#039;:&lt;br /&gt;
  INPUT OPTION&lt;br /&gt;
  BEGIN CASE&lt;br /&gt;
    CASE OPTION=&#039;B&#039;&lt;br /&gt;
      CTR-=40&lt;br /&gt;
      IF CTR&amp;lt;1 THEN CTR=1&lt;br /&gt;
    CASE OPTION[1,1]=&#039;E&#039;&lt;br /&gt;
      EXEC.LINE=ED.VERB:\ \:FILE:\ \:FOUND.RECS&amp;lt;1,OPTION[2,99]&amp;gt;&lt;br /&gt;
      GOSUB EXEC.SUB&lt;br /&gt;
      CTR-=20&lt;br /&gt;
      IF CTR&amp;lt;1 THEN CTR=1&lt;br /&gt;
    CASE OPTION[1,1]=&#039;W&#039;&lt;br /&gt;
      WP.FILE=FILE&lt;br /&gt;
      WP.ITEM=FOUND.RECS&amp;lt;1,OPTION[2,99]&amp;gt;&lt;br /&gt;
      GOSUB WP.EDIT&lt;br /&gt;
      CTR-=20&lt;br /&gt;
      IF CTR&amp;lt;1 THEN CTR=1&lt;br /&gt;
    CASE OPTION[1,1]=&#039;V&#039;&lt;br /&gt;
      PRINT CS:&lt;br /&gt;
      EXEC.LINE=\CT \:FILE:\ \:FOUND.RECS&amp;lt;1,OPTION[2,99]&amp;gt;&lt;br /&gt;
      GOSUB EXEC.SUB&lt;br /&gt;
      CTR-=20&lt;br /&gt;
      IF CTR&amp;lt;1 THEN CTR=1&lt;br /&gt;
      PRINT &#039;Press ENTER:&#039;:&lt;br /&gt;
      INPUT AAA&lt;br /&gt;
    CASE OPTION # &#039;&#039;&lt;br /&gt;
      * ENTER to keep moving forward&lt;br /&gt;
      QUIT=1&lt;br /&gt;
  END CASE&lt;br /&gt;
  PRINT HDR&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
IL10.NED:&lt;br /&gt;
  OPEN &#039;_HOLD_&#039; TO F.HOLD ELSE STOP 201,&#039;_HOLD_&#039;&lt;br /&gt;
  FILE.NAME=FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
  K.FILE=FIELD(ANS,&#039; &#039;,3)&lt;br /&gt;
  CALL FILE.OPEN(PROGRAM.NAME, FILE.NAME, F.FILE, &#039;STOP&#039;)&lt;br /&gt;
  CALL IDS.READ(R.FILE, F.FILE,  K.FILE, 0, 0, BCI.ERROR)&lt;br /&gt;
  IF BCI.ERROR # &#039;&#039; THEN PRINT BCI.ERROR ; R.FILE=&#039;&#039;&lt;br /&gt;
  R.ORIG=R.FILE&lt;br /&gt;
  *&lt;br /&gt;
  LOOP&lt;br /&gt;
    PRINT DCOUNT(R.FILE,@AM):&#039; fields in record&#039;&lt;br /&gt;
    PRINT &#039;Enter E)dit, L)ist, S)ave or Q)uit:&#039;:&lt;br /&gt;
    INPUT OPT&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
      CASE OPT=&#039;L&#039;&lt;br /&gt;
        SHOW.BPI=0 ; BPI.XREF=&#039;&#039;&lt;br /&gt;
        OPEN &#039;DATABASE.FILES,IL&#039; TO IL ELSE PRINT 201,&#039;DATABASE.FILES,IL&#039; ; RETURN&lt;br /&gt;
        OPEN &#039;IL.BPI&#039; TO IL.BPI ELSE PRINT 201,&#039;IL.BPI&#039; ; RETURN&lt;br /&gt;
        READV BPI FROM IL, FILE.NAME, 14 THEN&lt;br /&gt;
          * Sample: Attached to FLOAT.INCOME bpi.&lt;br /&gt;
          N=DCOUNT(BPI,&#039; &#039;)&lt;br /&gt;
          BPI=FIELD(BPI,&#039; &#039;,N-1)&lt;br /&gt;
          READ BPI.LAYOUT FROM IL.BPI, BPI THEN&lt;br /&gt;
            * Sample: EQUATE GROSS.FINANCE               TO MASTER(1)&lt;br /&gt;
            SHOW.BPI=1&lt;br /&gt;
            FOR R=1 TO DCOUNT(BPI.LAYOUT,@AM)&lt;br /&gt;
              L=TRIM(BPI.LAYOUT&amp;lt;R&amp;gt;)&lt;br /&gt;
              IF FIELD(L,&#039; &#039;,1)=&#039;EQUATE&#039; THEN&lt;br /&gt;
                FLD.NAME=FIELD(L,&#039; &#039;,2)&lt;br /&gt;
                FLD.POS=FIELD(FIELD(L,&#039; &#039;,4),&#039;(&#039;,2)&lt;br /&gt;
                FLD.POS=FIELD(FLD.POS,&#039;)&#039;,1)&lt;br /&gt;
                BPI.XREF&amp;lt;FLD.POS&amp;gt;=FLD.NAME&lt;br /&gt;
              END&lt;br /&gt;
            NEXT R&lt;br /&gt;
          END ELSE&lt;br /&gt;
            PRINT &#039;Cannot read BPI:&#039;:BPI&lt;br /&gt;
          END&lt;br /&gt;
        END ELSE&lt;br /&gt;
          PRINT &#039;Cannot get BPI name for:&#039;:FILE.NAME&lt;br /&gt;
        END&lt;br /&gt;
        *&lt;br /&gt;
        PRINT @(-1):&#039;FILE:&#039;:FILE.NAME:&#039; ITEM:&#039;:K.FILE&lt;br /&gt;
        FOR F=1 TO DCOUNT(R.FILE,@AM)&lt;br /&gt;
          R=R.FILE&amp;lt;F&amp;gt;&lt;br /&gt;
          CONVERT @VM TO &amp;quot;|&amp;quot; IN R&lt;br /&gt;
          CONVERT @SVM TO &amp;quot;\&amp;quot; IN R&lt;br /&gt;
          IF SHOW.BPI THEN&lt;br /&gt;
            PRINT F&#039;R#3&#039;:&#039; &#039;:BPI.XREF&amp;lt;F&amp;gt;&#039;L#25&#039;:&#039;=&#039;:R[1,80]&lt;br /&gt;
          END ELSE&lt;br /&gt;
            PRINT F&#039;R#3&#039;:&#039; &#039;:R&lt;br /&gt;
          END&lt;br /&gt;
        NEXT F&lt;br /&gt;
        PRINT &#039;PRESS ENTER:&#039;:&lt;br /&gt;
        INPUT AAA&lt;br /&gt;
      CASE OPT=&#039;S&#039;&lt;br /&gt;
        CALL IDS.WRITE(R.FILE, F.FILE, K.FILE, 0, 0)&lt;br /&gt;
        PRINT &#039;Saved.  Press ENTER to continue:&#039;:&lt;br /&gt;
        R.ORIG=R.FILE&lt;br /&gt;
        INPUT AAA&lt;br /&gt;
      CASE OPT=&#039;E&#039;&lt;br /&gt;
        R=R.FILE&lt;br /&gt;
        SWAP CHAR(13):CHAR(10) WITH &#039;||&#039; IN R&lt;br /&gt;
        WRITE R ON F.HOLD, K.FILE&lt;br /&gt;
        EXECUTE \ED _HOLD_ \:K.FILE&lt;br /&gt;
        READ R FROM F.HOLD, K.FILE ELSE R=&#039;&#039;&lt;br /&gt;
        SWAP &#039;||&#039; WITH CHAR(13):CHAR(10) IN R&lt;br /&gt;
        IF R # R.FILE THEN&lt;br /&gt;
          PRINT &#039;Record changed, use S to save&#039;&lt;br /&gt;
          R.FILE=R&lt;br /&gt;
        END&lt;br /&gt;
        DELETE F.HOLD, K.FILE&lt;br /&gt;
      CASE OPT=&#039;Q&#039;&lt;br /&gt;
        IF R.FILE#R.ORIG THEN&lt;br /&gt;
          PRINT &#039;Record changed, are you sure (Y/N):&#039;:&lt;br /&gt;
          INPUT YORN&lt;br /&gt;
          IF YORN # &#039;Y&#039; THEN OPT=&#039;&#039;&lt;br /&gt;
        END&lt;br /&gt;
    END CASE&lt;br /&gt;
  UNTIL OPT=&#039;Q&#039; DO&lt;br /&gt;
  REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
BPI:&lt;br /&gt;
  OPEN &#039;DATABASE.FILES,IL&#039; TO IL ELSE STOP 201,&#039;DATABASE.FILES,IL&#039;&lt;br /&gt;
  OPEN &#039;IL.BPI&#039; TO IL.BPI ELSE STOP 201,&#039;IL.BPI&#039;&lt;br /&gt;
  BPI=FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
  IF BPI=&#039;&#039; THEN PRINT &#039;Usage: BPI &amp;lt;name of infolease file|name of BPI&amp;gt;&#039; ; RETURN&lt;br /&gt;
  * Param 2 can be a BPI or a FILENAME&lt;br /&gt;
  READ DUMMY FROM IL.BPI, BPI ELSE&lt;br /&gt;
    READV BPI FROM IL, BPI, 14 ELSE PRINT &#039;Cannot read DATABASE.FILES,IL&#039;,BPI ; RETURN&lt;br /&gt;
    * Sample: Attached to FLOAT.INCOME bpi.&lt;br /&gt;
    N=DCOUNT(BPI,&#039; &#039;)&lt;br /&gt;
    BPI=FIELD(BPI,&#039; &#039;,N-1)&lt;br /&gt;
    READ DUMMY FROM IL.BPI, BPI ELSE PRINT &#039;Cannot get BPI name&#039; ; RETURN&lt;br /&gt;
  END&lt;br /&gt;
  EXEC.LINE=\AE IL.BPI \:BPI&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
  CLOSE IL&lt;br /&gt;
  CLOSE IL.BPI&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
RECALL.SHELL:&lt;br /&gt;
  DATA 1&lt;br /&gt;
  DATA 1&lt;br /&gt;
  RECALL=FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
  IF RECALL # &#039;&#039; THEN DATA RECALL&lt;br /&gt;
  EXECUTE \RECALL.00\&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
FIND.MENU:&lt;br /&gt;
  OPEN &amp;quot;DB.MENUS&amp;quot; TO MENU.F ELSE STOP 201,&amp;quot;DB.MENUS&amp;quot;&lt;br /&gt;
  STR=FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
  IF STR=&#039;&#039; THEN&lt;br /&gt;
    PRINT &amp;quot;Enter menu or program to search for : &amp;quot;: ; INPUT STR&lt;br /&gt;
    IF STR=&amp;quot;&amp;quot; OR STR=&amp;quot;/&amp;quot; THEN RETURN&lt;br /&gt;
  END&lt;br /&gt;
  STR = OCONV(STR,&amp;quot;MCU&amp;quot;)&lt;br /&gt;
  MENU.LIST=&#039;&#039;&lt;br /&gt;
  MENU.LIST&amp;lt;1&amp;gt;=1&lt;br /&gt;
  MENU.LIST&amp;lt;2&amp;gt;=0&lt;br /&gt;
  MENU.CTR=1&lt;br /&gt;
  LOOP&lt;br /&gt;
    MENU=MENU.LIST&amp;lt;1,MENU.CTR&amp;gt;&lt;br /&gt;
    PATH=MENU.LIST&amp;lt;2,MENU.CTR&amp;gt;&lt;br /&gt;
    IF MENU=&#039;&#039; THEN EXIT&lt;br /&gt;
    GOSUB SEARCH.MENU&lt;br /&gt;
    MENU.CTR+=1&lt;br /&gt;
  REPEAT&lt;br /&gt;
  CLOSE MENU.F&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SEARCH.MENU:&lt;br /&gt;
  READ R FROM MENU.F, MENU THEN&lt;br /&gt;
    TITLES = OCONVS(R&amp;lt;2&amp;gt;,&amp;quot;MCU&amp;quot;) ; PROGS  = OCONVS(R&amp;lt;3&amp;gt;,&amp;quot;MCU&amp;quot;) ; FLAGS = R&amp;lt;4&amp;gt; ; TYPES = R&amp;lt;5&amp;gt;&lt;br /&gt;
    I = DCOUNT(PROGS,@VM)&lt;br /&gt;
    FOR F = 1 TO I&lt;br /&gt;
      IF INDEX(PROGS&amp;lt;1,F&amp;gt;,STR,1) # 0 OR INDEX(TITLES&amp;lt;1,F&amp;gt;,STR,1) # 0 THEN&lt;br /&gt;
        PRINT MENU&amp;quot;R#5&amp;quot;:&amp;quot; &amp;quot;:TITLES&amp;lt;1,F&amp;gt;&amp;quot;L#27&amp;quot;:&amp;quot;  &amp;quot;:TYPES&amp;lt;1,F&amp;gt;&#039;L#1&#039;:&amp;quot; &amp;quot;:PROGS&amp;lt;1,F&amp;gt;&amp;quot;L#50&amp;quot;:&amp;quot; &amp;quot;:PATH:&#039;,&#039;:F&lt;br /&gt;
      END&lt;br /&gt;
      IF FLAGS&amp;lt;1,F&amp;gt;=&#039;M&#039; THEN MENU.LIST&amp;lt;1,-1&amp;gt;=PROGS&amp;lt;1,F&amp;gt; ; MENU.LIST&amp;lt;2,-1&amp;gt;=PATH:&#039;,&#039;:F&lt;br /&gt;
    NEXT F&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
BFORMAT:&lt;br /&gt;
  STAR  = &#039;*&#039; ; COLON = &#039;:&#039; ; TAB=CHAR(9)&lt;br /&gt;
  IND = 0&lt;br /&gt;
  *&lt;br /&gt;
  * These are all commands that may have ELSE or THEN statements&lt;br /&gt;
  * (or blocks) following them&lt;br /&gt;
  SPECIAL.CASES = &amp;quot;GET&amp;quot;:@AM:&amp;quot;INPUT&amp;quot;:@AM:&amp;quot;LOCATE&amp;quot;:@AM:&amp;quot;LOCK&amp;quot;:@AM:&amp;quot;MATREAD&amp;quot;:@AM:&amp;quot;MATREADU&amp;quot;:@AM&lt;br /&gt;
  SPECIAL.CASES := &amp;quot;MATWRITE&amp;quot;:@AM:&amp;quot;MATWRITEU&amp;quot;:@AM:&amp;quot;OPEN&amp;quot;:@AM:&amp;quot;PROCREAD&amp;quot;:@AM&lt;br /&gt;
  SPECIAL.CASES := &amp;quot;PROCWRITE&amp;quot;:@AM:&amp;quot;READ&amp;quot;:@AM:&amp;quot;READNEXT&amp;quot;:@AM:&amp;quot;READSEQ&amp;quot;:@AM:&amp;quot;READT&amp;quot;:@AM:&amp;quot;READU&amp;quot;:@AM:&amp;quot;READV&amp;quot;:@AM&lt;br /&gt;
  SPECIAL.CASES := &amp;quot;READVU&amp;quot;:@AM:&amp;quot;REWIND&amp;quot;:@AM:&amp;quot;SEEK&amp;quot;:@AM:&amp;quot;WEOF&amp;quot;:@AM:&amp;quot;WRITESEQ&amp;quot;:@AM&lt;br /&gt;
  SPECIAL.CASES := &amp;quot;WRITET&amp;quot;&lt;br /&gt;
  *&lt;br /&gt;
  DEF.INDENT=2&lt;br /&gt;
  FORMATS=&amp;quot;:&amp;quot;:@VM:&amp;quot;BEGIN&amp;quot;:@VM:&amp;quot;CASE&amp;quot;:@VM:&amp;quot;ELSE&amp;quot;:@VM:&amp;quot;END&amp;quot;:@VM:&amp;quot;FOR&amp;quot;:@VM&lt;br /&gt;
  FORMATS :=&amp;quot;IF&amp;quot;:@VM:&amp;quot;LOOP&amp;quot;:@VM:&amp;quot;NEXT&amp;quot;:@VM:&amp;quot;REPEAT&amp;quot;:@VM:&amp;quot;RETURN&amp;quot;:@VM&lt;br /&gt;
  FORMATS :=&amp;quot;THEN&amp;quot;:@VM:&amp;quot;UNTIL&amp;quot;:@VM:&amp;quot;WHILE&amp;quot;&lt;br /&gt;
  * THIS.IND is the amount this line will be in or outdented&lt;br /&gt;
  FORMATS&amp;lt;2&amp;gt;=0:@VM:0:@VM:-1:@VM:0:@VM:-1:@VM:0:@VM:0:@VM&lt;br /&gt;
  FORMATS&amp;lt;2&amp;gt; :=0:@VM:-1:@VM:-1:@VM:-1:@VM:0:@VM:-1:@VM:-1&lt;br /&gt;
  * NEXT.IND is the amount that all following lines will be indented&lt;br /&gt;
  FORMATS&amp;lt;3&amp;gt;=1:@VM:2:@VM:0:@VM:1:@VM:-1:@VM:1:@VM:1:@VM&lt;br /&gt;
  FORMATS&amp;lt;3&amp;gt; :=1:@VM:-1:@VM:-1:@VM:-1:@VM:1:@VM:0:@VM:0&lt;br /&gt;
  FORMATS&amp;lt;4&amp;gt;=DEF.INDENT&lt;br /&gt;
  *&lt;br /&gt;
  OPEN B.FILE TO FI ELSE PRINT &#039;Cannot open &#039;:B.FILE ; RETURN&lt;br /&gt;
  READ REC FROM FI,B.ITEM ELSE PRINT &amp;quot;CANNOT READ &amp;quot;:B.FILE:&amp;quot; &amp;quot;:B.ITEM ; RETURN&lt;br /&gt;
  *WRITE REC ON FI,B.NAME:&amp;quot;.BAK&amp;quot;&lt;br /&gt;
  SWAP CHAR(9) WITH SPACE(DEF.INDENT) IN REC&lt;br /&gt;
  *&lt;br /&gt;
  I = DCOUNT(REC,@AM)&lt;br /&gt;
  IF I &amp;lt; 2 THEN RETURN&lt;br /&gt;
  FOR F = 1 TO I&lt;br /&gt;
    PRINT STAR:&lt;br /&gt;
    L = REC&amp;lt;F&amp;gt; ; NEXT.LINE=REC&amp;lt;F+1&amp;gt;&lt;br /&gt;
    GOSUB FORMAT.LINE&lt;br /&gt;
    REC&amp;lt;F&amp;gt; = L&lt;br /&gt;
  NEXT F&lt;br /&gt;
  WRITE REC ON FI,B.ITEM&lt;br /&gt;
  PRINT STAR ; PRINT I:&amp;quot; lines of &amp;quot;:B.ITEM:&amp;quot; formatted&amp;quot;&lt;br /&gt;
  CLOSE FI&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
FORMAT.LINE:&lt;br /&gt;
  L=TRIM(L,&#039; &#039;,&#039;B&#039;)&lt;br /&gt;
  CONVERT TAB TO &amp;quot;&amp;quot; IN L&lt;br /&gt;
  FIRST.WORD = FIELD(L,SPC,1)&lt;br /&gt;
  LEN.FIRST.WORD = LEN(FIRST.WORD)&lt;br /&gt;
  LOCATE FIRST.WORD IN SPECIAL.CASES BY &#039;AL&#039; SETTING SPECIAL ELSE SPECIAL = 0&lt;br /&gt;
  NUM.SPACES = COUNT(L,SPC) + 1&lt;br /&gt;
  LAST.WORD = FIELD(L,SPC,NUM.SPACES)&lt;br /&gt;
  NEXT.TO.LAST.WORD = FIELD(L,SPC,NUM.SPACES-1)&lt;br /&gt;
  THIS.IND = 0&lt;br /&gt;
  NEXT.IND = 0&lt;br /&gt;
  BEGIN CASE&lt;br /&gt;
    CASE L=&amp;quot;&amp;quot;&lt;br /&gt;
      L=&amp;quot;*&amp;quot; ;* Makes pasting code around easier with no blank lines&lt;br /&gt;
    CASE FIRST.WORD[LEN.FIRST.WORD,1] = COLON OR NUM(FIRST.WORD)&lt;br /&gt;
      * A label&lt;br /&gt;
      IND = 0&lt;br /&gt;
      LOCATE COLON IN FORMATS&amp;lt;1&amp;gt; SETTING POS ELSE POS = 0&lt;br /&gt;
      THIS.IND = FORMATS&amp;lt;2,POS&amp;gt;&lt;br /&gt;
      NEXT.IND = FORMATS&amp;lt;3,POS&amp;gt;&lt;br /&gt;
    CASE FIRST.WORD = &amp;quot;IF&amp;quot;&lt;br /&gt;
      LOCATE FIRST.WORD IN FORMATS&amp;lt;1&amp;gt; SETTING POS ELSE POS = 0&lt;br /&gt;
      IF LAST.WORD = &amp;quot;THEN&amp;quot; THEN&lt;br /&gt;
        THIS.IND = FORMATS&amp;lt;2,POS&amp;gt;&lt;br /&gt;
        NEXT.IND = FORMATS&amp;lt;3,POS&amp;gt;&lt;br /&gt;
      END&lt;br /&gt;
    CASE FIRST.WORD = &amp;quot;END&amp;quot;&lt;br /&gt;
      SECOND.WORD = FIELD(L,SPC,2)&lt;br /&gt;
      IF SECOND.WORD = &amp;quot;ELSE&amp;quot; THEN&lt;br /&gt;
        LOCATE &amp;quot;ELSE&amp;quot; IN FORMATS&amp;lt;1&amp;gt; SETTING POS ELSE POS = 0&lt;br /&gt;
        THIS.IND = -FORMATS&amp;lt;3,POS&amp;gt;&lt;br /&gt;
        NEXT.IND = FORMATS&amp;lt;2,POS&amp;gt;&lt;br /&gt;
      END ELSE&lt;br /&gt;
        IF SECOND.WORD = &amp;quot;CASE&amp;quot; THEN&lt;br /&gt;
          LOCATE &amp;quot;BEGIN&amp;quot; IN FORMATS&amp;lt;1&amp;gt; SETTING POS ELSE POS = 0&lt;br /&gt;
          THIS.IND = -FORMATS&amp;lt;3,POS&amp;gt;&lt;br /&gt;
          NEXT.IND = -FORMATS&amp;lt;3,POS&amp;gt;&lt;br /&gt;
        END ELSE&lt;br /&gt;
          LOCATE FIRST.WORD IN FORMATS&amp;lt;1&amp;gt; SETTING POS ELSE POS = 0&lt;br /&gt;
          THIS.IND = FORMATS&amp;lt;2,POS&amp;gt;&lt;br /&gt;
          NEXT.IND = FORMATS&amp;lt;3,POS&amp;gt;&lt;br /&gt;
        END&lt;br /&gt;
      END&lt;br /&gt;
    CASE SPECIAL&lt;br /&gt;
      * Find last word - skip until a space&lt;br /&gt;
      IF LAST.WORD = &amp;quot;ELSE&amp;quot; OR LAST.WORD = &amp;quot;THEN&amp;quot; THEN&lt;br /&gt;
        LOCATE LAST.WORD IN FORMATS&amp;lt;1&amp;gt; SETTING POS ELSE POS = 0&lt;br /&gt;
        THIS.IND = FORMATS&amp;lt;2,POS&amp;gt;&lt;br /&gt;
        NEXT.IND = FORMATS&amp;lt;3,POS&amp;gt;&lt;br /&gt;
      END&lt;br /&gt;
    CASE FIRST.WORD = &amp;quot;FOR&amp;quot; AND NEXT.TO.LAST.WORD = &amp;quot;NEXT&amp;quot;&lt;br /&gt;
      * FOR loop on one line means do nothing&lt;br /&gt;
    CASE FIRST.WORD = &amp;quot;RETURN&amp;quot; AND TRIM(NEXT.LINE) # &amp;quot;*&amp;quot;&lt;br /&gt;
      * RETURN without a blank line means do nothing&lt;br /&gt;
    CASE 1&lt;br /&gt;
      LOCATE FIRST.WORD IN FORMATS&amp;lt;1&amp;gt; SETTING POS ELSE POS = 0&lt;br /&gt;
      IF POS # 0 THEN&lt;br /&gt;
        THIS.IND = FORMATS&amp;lt;2,POS&amp;gt;&lt;br /&gt;
        NEXT.IND = FORMATS&amp;lt;3,POS&amp;gt;&lt;br /&gt;
      END&lt;br /&gt;
  END CASE&lt;br /&gt;
  L = SPACE((IND+THIS.IND)*DEF.INDENT):L&lt;br /&gt;
  *L = STR(TAB,IND+THIS.IND):L ;* In my misguided youth, tabs seemed cool&lt;br /&gt;
  IND = IND + NEXT.IND&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
GET.LINE:&lt;br /&gt;
  * SUBROUTINE GET.LINE(X,LEN,DISP.LEN,XXDATA,RTN)&lt;br /&gt;
  * X           = X POS&lt;br /&gt;
  * LEN         = MAX ALLOWED LENGTH&lt;br /&gt;
  * DISP.LEN    = MAX DISPLAYED LEN&lt;br /&gt;
  * XXDATA      = ON INPUT  VARIABLE XXDATA&lt;br /&gt;
  *             = ON OUTPUT RETURNED STRING&lt;br /&gt;
  * RTN         = SEQ(CHAR PRESSED TO EXIT)&lt;br /&gt;
  * -----------------&lt;br /&gt;
  * Important globals&lt;br /&gt;
  * CP          = Cursor Position, Y coordinate on the screen 0 -&amp;gt; DISP.LEN&lt;br /&gt;
  * CH.PTR      = Pointer into string being edited            1 -&amp;gt; LEN&lt;br /&gt;
  * POS         = Pointer to first char currently displayed   1 -&amp;gt; LEN&lt;br /&gt;
  * ASC.CH      = The numeric value of the key just entered&lt;br /&gt;
  *&lt;br /&gt;
  ECHO OFF&lt;br /&gt;
  XXDATA = ENTRY&lt;br /&gt;
  MODE = INSERT ; TEMP.XXDATA = XXDATA&lt;br /&gt;
  BASE = @(X) ; MASK = &#039;L#&#039;:DISP.LEN&lt;br /&gt;
  PRINT BASE:&lt;br /&gt;
  CURR.LEN = LEN(XXDATA)&lt;br /&gt;
  GOSUB GO.END&lt;br /&gt;
  RTN=&#039;&#039;&lt;br /&gt;
  *&lt;br /&gt;
  LOOP&lt;br /&gt;
    PRINT @(X+CP):&lt;br /&gt;
    CH=IN()&lt;br /&gt;
    ASC.CH = SEQ(CH)&lt;br /&gt;
    EXIT.FLAG=FALSE&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
      CASE ASC.CH = 1&lt;br /&gt;
        GOSUB GO.BEGIN&lt;br /&gt;
      CASE ASC.CH = 2&lt;br /&gt;
        GOSUB LEFT&lt;br /&gt;
      CASE ASC.CH = 4&lt;br /&gt;
        GOSUB DEL&lt;br /&gt;
      CASE ASC.CH = 5&lt;br /&gt;
        GOSUB GO.END&lt;br /&gt;
      CASE ASC.CH = 6&lt;br /&gt;
        GOSUB RIGHT&lt;br /&gt;
      CASE ASC.CH = 8&lt;br /&gt;
        GOSUB BACK&lt;br /&gt;
      CASE ASC.CH = 9&lt;br /&gt;
        GOSUB AUTO.COMPLETE&lt;br /&gt;
      CASE ASC.CH = 10&lt;br /&gt;
        GOSUB DEL.TO.END&lt;br /&gt;
      CASE ASC.CH = 13&lt;br /&gt;
        EXIT.FLAG = TRUE&lt;br /&gt;
        RTN=13&lt;br /&gt;
      CASE ASC.CH = 14&lt;br /&gt;
        RTN=2&lt;br /&gt;
        EXIT.FLAG=TRUE&lt;br /&gt;
      CASE ASC.CH = 16&lt;br /&gt;
        RTN=1&lt;br /&gt;
        EXIT.FLAG=TRUE&lt;br /&gt;
      CASE ASC.CH = 18&lt;br /&gt;
        GOSUB INSRT&lt;br /&gt;
      CASE ASC.CH = PG.UP.KEY&lt;br /&gt;
        EXIT.FLAG=TRUE&lt;br /&gt;
        RTN=PG.UP.KEY&lt;br /&gt;
      CASE ASC.CH = PG.DOWN.KEY&lt;br /&gt;
        EXIT.FLAG=TRUE&lt;br /&gt;
        RTN=PG.DOWN.KEY&lt;br /&gt;
      CASE ASC.CH = 23&lt;br /&gt;
        GOSUB DELETE.WORD&lt;br /&gt;
      CASE ASC.CH = 24&lt;br /&gt;
        GOSUB FORWARD.WORD&lt;br /&gt;
      CASE ASC.CH = 7 OR ASC.CH = 12&lt;br /&gt;
        IF ASC.CH = 12 THEN PRINT @(-1):&lt;br /&gt;
        XXDATA = &#039;&#039;&lt;br /&gt;
        EXIT.FLAG=TRUE&lt;br /&gt;
        RTN=13&lt;br /&gt;
      CASE ASC.CH = 26&lt;br /&gt;
        GOSUB BACK.WORD&lt;br /&gt;
      CASE ASC.CH = 27&lt;br /&gt;
        GOSUB ESC.KEY&lt;br /&gt;
      CASE ASC.CH &amp;lt; 27&lt;br /&gt;
        PRINT @(0):ASC.CH:&lt;br /&gt;
      CASE ASC.CH = 127&lt;br /&gt;
        GOSUB BACK&lt;br /&gt;
      CASE 1&lt;br /&gt;
        GOSUB ORD&lt;br /&gt;
    END CASE&lt;br /&gt;
    CURR.LEN = LEN(XXDATA)&lt;br /&gt;
  UNTIL EXIT.FLAG DO&lt;br /&gt;
  REPEAT&lt;br /&gt;
  IF XXDATA[CURR.LEN,1] = SPC THEN XXDATA = XXDATA[1,CURR.LEN-1]&lt;br /&gt;
  ECHO ON ; PRINT BASE:XXDATA MASK&lt;br /&gt;
  ENTRY=XXDATA&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
AUTO.COMPLETE:&lt;br /&gt;
  * Grab the current word and figure out max completion&lt;br /&gt;
  WORD=&#039;&#039; ; WORD.CTR=&#039;&#039;&lt;br /&gt;
  CH.PTR.TMP=CH.PTR-1&lt;br /&gt;
  LOOP&lt;br /&gt;
    C=XXDATA[CH.PTR.TMP,1]&lt;br /&gt;
  UNTIL C=&#039; &#039; OR CH.PTR.TMP=0 DO&lt;br /&gt;
    WORD=C:WORD&lt;br /&gt;
    CH.PTR.TMP-=1&lt;br /&gt;
  REPEAT&lt;br /&gt;
  *&lt;br /&gt;
  * Count which word we&#039;re on - there are different auto-completes for 1, 2 or 3+&lt;br /&gt;
  IF CH.PTR.TMP=0 THEN&lt;br /&gt;
    WORD.CTR=1 ;* Trying to autocomplete a command&lt;br /&gt;
    WORD=&#039;CMD_&#039;:WORD&lt;br /&gt;
  END ELSE&lt;br /&gt;
    CH.PTR.TMP-=1&lt;br /&gt;
    LOOP&lt;br /&gt;
      C=XXDATA[CH.PTR.TMP,1]&lt;br /&gt;
    UNTIL C=&#039; &#039; OR CH.PTR.TMP=0 DO&lt;br /&gt;
      CH.PTR.TMP-=1&lt;br /&gt;
    REPEAT&lt;br /&gt;
    IF CH.PTR.TMP=0 THEN&lt;br /&gt;
      WORD.CTR=2 ;* Trying to autocomplete a filename&lt;br /&gt;
      WORD=&#039;FILE_&#039;:WORD&lt;br /&gt;
    END ELSE&lt;br /&gt;
      WORD.CTR=3 ;* Trying to autocomplete from a dictionary&lt;br /&gt;
      FNAME=FIELD(XXDATA,&#039; &#039;,2)&lt;br /&gt;
      WORD=&#039;DICT-&#039;:FNAME:&#039;_&#039;:WORD&lt;br /&gt;
    END&lt;br /&gt;
  END&lt;br /&gt;
  *&lt;br /&gt;
  IF XXDATA[CURR.LEN,1] = SPC THEN XXDATA = XXDATA[1,CURR.LEN-1]&lt;br /&gt;
  CURR.LEN=LEN(XXDATA)&lt;br /&gt;
  *&lt;br /&gt;
  LOOP&lt;br /&gt;
    READ AC.LIST FROM AC, WORD ELSE CRT BEEP: ; RETURN&lt;br /&gt;
    * Ok, we have some auto-completion candidates, need to do two things&lt;br /&gt;
    * 1) Check to see if we&#039;re done, return if so, or&lt;br /&gt;
    * 2) List top 20 possible completions if there are more than one&lt;br /&gt;
    IF DCOUNT(AC.LIST&amp;lt;1&amp;gt;,@VM)=1 AND DCOUNT(AC.LIST&amp;lt;2,1&amp;gt;,@SVM)=1 THEN&lt;br /&gt;
      NEWF=AC.LIST&amp;lt;2&amp;gt;[LEN(WORD)+1,999]&lt;br /&gt;
      XXDATA:=NEWF:&#039; &#039;&lt;br /&gt;
      PRINT BASE:XXDATA:EOS:&lt;br /&gt;
      CURR.LEN=LEN(XXDATA)&lt;br /&gt;
      GOSUB GO.END&lt;br /&gt;
      RETURN&lt;br /&gt;
    END ELSE&lt;br /&gt;
      CRT CS:@(0,0):BON:PROMPT.DISP:BOFF:XXDATA&lt;br /&gt;
      NUM.CP=DCOUNT(AC.LIST&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
      IF NUM.CP&amp;gt;20 THEN NUM.CP=20&lt;br /&gt;
      FOR CP=1 TO NUM.CP&lt;br /&gt;
        CRT CP&#039;R#2&#039;:&#039;) &#039;:FIELD(AC.LIST&amp;lt;1,CP&amp;gt;,&#039;_&#039;,2,99):&#039; (&#039;:&lt;br /&gt;
        NUM.CP2=DCOUNT(AC.LIST&amp;lt;2,CP&amp;gt;,@SVM)&lt;br /&gt;
        NUM.CP2.MAX=NUM.CP2&lt;br /&gt;
        IF NUM.CP2&amp;gt;3 THEN NUM.CP2=3&lt;br /&gt;
        FOR CP2=1 TO NUM.CP2&lt;br /&gt;
          CRT FIELD(AC.LIST&amp;lt;2,CP,CP2&amp;gt;,&#039;_&#039;,2,99):&lt;br /&gt;
          IF CP2&amp;lt;NUM.CP2 THEN CRT &#039;,&#039;:&lt;br /&gt;
        NEXT CP2&lt;br /&gt;
        IF NUM.CP2 # NUM.CP2.MAX THEN CRT &#039; [+&#039;:NUM.CP2.MAX-NUM.CP2:&#039;]&#039;:&lt;br /&gt;
        CRT &#039;)&#039;&lt;br /&gt;
      NEXT CP&lt;br /&gt;
      WORD.CONTINUE=IN()&lt;br /&gt;
      ASC.VAL = SEQ(WORD.CONTINUE)&lt;br /&gt;
      CRT CS:@(0,0):BON:PROMPT.DISP:BOFF:XXDATA:&lt;br /&gt;
      BEGIN CASE&lt;br /&gt;
        CASE ASC.VAL=13 OR ASC.VAL=27&lt;br /&gt;
          CURR.LEN=LEN(XXDATA)&lt;br /&gt;
          GOSUB GO.END&lt;br /&gt;
          RETURN&lt;br /&gt;
        CASE ASC.VAL&amp;gt;=32 AND ASC.VAL&amp;lt;127&lt;br /&gt;
          WORD:=WORD.CONTINUE&lt;br /&gt;
          XXDATA:=WORD.CONTINUE&lt;br /&gt;
      END CASE&lt;br /&gt;
    END&lt;br /&gt;
  REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
ORD:&lt;br /&gt;
  * Ordinary key pressed&lt;br /&gt;
  IF CH.PTR # LEN+1 THEN&lt;br /&gt;
    IF MODE = INSERT THEN&lt;br /&gt;
      IF CURR.LEN = LEN THEN&lt;br /&gt;
        PRINT BEEP:&lt;br /&gt;
        GOTO SKIP1&lt;br /&gt;
      END ELSE&lt;br /&gt;
        XXDATA = XXDATA[1,CH.PTR-1]:CH:XXDATA[CH.PTR,CURR.LEN]&lt;br /&gt;
      END&lt;br /&gt;
    END ELSE&lt;br /&gt;
      XXDATA = XXDATA[1,CH.PTR-1]:CH:XXDATA[CH.PTR+1,CURR.LEN]&lt;br /&gt;
    END&lt;br /&gt;
    CH.PTR = CH.PTR + 1&lt;br /&gt;
    IF CP # DISP.LEN THEN&lt;br /&gt;
      PRINT @(X+CP):CH:&lt;br /&gt;
      IF MODE = INSERT THEN&lt;br /&gt;
        PRINT XXDATA[CH.PTR,DISP.LEN-CP-1]:&lt;br /&gt;
      END&lt;br /&gt;
      CP = CP + 1&lt;br /&gt;
    END ELSE&lt;br /&gt;
      POS = POS + 1&lt;br /&gt;
      PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
    END&lt;br /&gt;
  END ELSE&lt;br /&gt;
    PRINT BEEP:&lt;br /&gt;
  END&lt;br /&gt;
SKIP1:&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
RIGHT:&lt;br /&gt;
  * There are 3 situations here -&lt;br /&gt;
  * 1 We&#039;re pressing the right arrow thru existing text       (CH.PTR = CURR.LEN)&lt;br /&gt;
  * 2 We&#039;ve typed text and are at the end when we press right (CH.PTR &amp;gt; CURR.LEN)&lt;br /&gt;
  * 3 We&#039;re in the middle of text, pressing the right arrow   (CH.PTR &amp;lt; CURR.LEN)&lt;br /&gt;
  IF CH.PTR &amp;lt; LEN THEN&lt;br /&gt;
    IF CH.PTR &amp;gt; CURR.LEN THEN PRINT BEEP: ; GOTO SKIP2&lt;br /&gt;
    IF CH.PTR = CURR.LEN THEN&lt;br /&gt;
      * If the last char is not a space make it one&lt;br /&gt;
      IF XXDATA[CURR.LEN,1] # SPC THEN&lt;br /&gt;
        XXDATA = XXDATA:SPC&lt;br /&gt;
        IF CP # DISP.LEN THEN PRINT @(X+CP+1):SPC:&lt;br /&gt;
        CURR.LEN = CURR.LEN + 1&lt;br /&gt;
      END ELSE&lt;br /&gt;
        PRINT BEEP:&lt;br /&gt;
        GOTO SKIP2&lt;br /&gt;
      END&lt;br /&gt;
    END&lt;br /&gt;
    CH.PTR = CH.PTR + 1&lt;br /&gt;
    IF CP # DISP.LEN THEN&lt;br /&gt;
      * We&#039;re not at the end of display so just move the cursor&lt;br /&gt;
      CP = CP + 1&lt;br /&gt;
    END ELSE&lt;br /&gt;
      * We are at the end of the display so leave cursor where&lt;br /&gt;
      * it is and scroll through line&lt;br /&gt;
      POS = POS + 1&lt;br /&gt;
      PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
    END&lt;br /&gt;
  END ELSE&lt;br /&gt;
    PRINT BEEP:&lt;br /&gt;
  END&lt;br /&gt;
SKIP2:&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
FORWARD.WORD:&lt;br /&gt;
  * Tab key pressed - move forwards a word&lt;br /&gt;
  IF CH.PTR &amp;gt;= CURR.LEN THEN&lt;br /&gt;
    PRINT BEEP:&lt;br /&gt;
  END ELSE&lt;br /&gt;
    LOOP&lt;br /&gt;
      CH.PTR = CH.PTR + 1&lt;br /&gt;
      CP = CP + 1&lt;br /&gt;
    UNTIL XXDATA[CH.PTR,1] = SPC OR CH.PTR = CURR.LEN DO&lt;br /&gt;
    REPEAT&lt;br /&gt;
    IF CH.PTR # CURR.LEN THEN&lt;br /&gt;
      LOOP&lt;br /&gt;
        CH.PTR = CH.PTR + 1&lt;br /&gt;
        CP = CP + 1&lt;br /&gt;
      UNTIL XXDATA[CH.PTR,1] # SPC OR CH.PTR = CURR.LEN DO&lt;br /&gt;
      REPEAT&lt;br /&gt;
    END&lt;br /&gt;
    IF CP &amp;gt; DISP.LEN THEN&lt;br /&gt;
      CP = DISP.LEN&lt;br /&gt;
      POS = CH.PTR - DISP.LEN&lt;br /&gt;
      PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
    END&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
LEFT:&lt;br /&gt;
  * If we&#039;re not at the start of data, move left&lt;br /&gt;
  IF CH.PTR # 1 THEN&lt;br /&gt;
    CH.PTR = CH.PTR - 1&lt;br /&gt;
    IF CP # 0 THEN&lt;br /&gt;
      * We&#039;re not at the start of the display so just move the cursor&lt;br /&gt;
      CP = CP - 1&lt;br /&gt;
    END ELSE&lt;br /&gt;
      * We are at the start of the display so leave cursor and scroll&lt;br /&gt;
      POS = POS - 1&lt;br /&gt;
      PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
    END&lt;br /&gt;
  END ELSE&lt;br /&gt;
    PRINT BEEP:&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
DEL:&lt;br /&gt;
  * Delete the character at the cursor and redisplay from this point&lt;br /&gt;
  XXDATA = XXDATA[1,CH.PTR-1]:XXDATA[CH.PTR+1,CURR.LEN]&lt;br /&gt;
  CURR.LEN = CURR.LEN - 1&lt;br /&gt;
  PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
BACK:&lt;br /&gt;
  * Backspace key pressed&lt;br /&gt;
  IF CH.PTR # 1 THEN&lt;br /&gt;
    CH.PTR = CH.PTR - 1&lt;br /&gt;
    XXDATA = XXDATA[1,CH.PTR-1]:XXDATA[CH.PTR+1,CURR.LEN]&lt;br /&gt;
    CURR.LEN = CURR.LEN - 1&lt;br /&gt;
    IF CP # 0 THEN&lt;br /&gt;
      CP = CP - 1&lt;br /&gt;
    END ELSE&lt;br /&gt;
      POS = POS - 1&lt;br /&gt;
    END&lt;br /&gt;
    PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
  END ELSE&lt;br /&gt;
    PRINT BEEP:&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
INSRT:&lt;br /&gt;
  * Toggle between insert and replace modes&lt;br /&gt;
  MODE = -MODE&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
ESC.KEY:&lt;br /&gt;
  * ESC pressed, or extended key - wyse50 arrow keys&lt;br /&gt;
  * Get next char of extended command&lt;br /&gt;
  ALLOW = 0&lt;br /&gt;
  EXT.KEY=IN()&lt;br /&gt;
  EXT = SEQ(EXT.KEY)&lt;br /&gt;
  EXT.KEY = OCONV(EXT.KEY,&#039;MCU&#039;)&lt;br /&gt;
  BEGIN CASE&lt;br /&gt;
    CASE EXT.KEY = &#039;D&#039;&lt;br /&gt;
      GOSUB DELETE.WORD&lt;br /&gt;
    CASE EXT.KEY = &#039;[&#039; OR EXT.KEY = &#039;O&#039;&lt;br /&gt;
      EXT.KEY=IN()&lt;br /&gt;
      BEGIN CASE&lt;br /&gt;
        CASE EXT.KEY = &#039;C&#039;&lt;br /&gt;
          GOSUB RIGHT&lt;br /&gt;
        CASE EXT.KEY = &#039;D&#039;&lt;br /&gt;
          GOSUB LEFT&lt;br /&gt;
        CASE EXT.KEY = &#039;A&#039;&lt;br /&gt;
          RTN=1&lt;br /&gt;
          EXIT.FLAG=TRUE&lt;br /&gt;
        CASE EXT.KEY = &#039;B&#039;&lt;br /&gt;
          RTN=2&lt;br /&gt;
          EXIT.FLAG=TRUE&lt;br /&gt;
      END CASE&lt;br /&gt;
  END CASE&lt;br /&gt;
RETURN ; * From ESC key&lt;br /&gt;
*&lt;br /&gt;
BACK.WORD:&lt;br /&gt;
  * Shift tab pressed - go back a word&lt;br /&gt;
  IF CH.PTR = 1 THEN&lt;br /&gt;
    PRINT BEEP:&lt;br /&gt;
  END ELSE&lt;br /&gt;
    * 2 situations - either we&#039;re in a word already or&lt;br /&gt;
    * we&#039;re at the start of a word&lt;br /&gt;
    * If in a word - loop to the start of the word&lt;br /&gt;
    * otherwise skip spaces, and then move to start of word&lt;br /&gt;
    IF XXDATA[CH.PTR-1,1] # SPC THEN&lt;br /&gt;
      LOOP&lt;br /&gt;
      UNTIL XXDATA[CH.PTR-1,1] = SPC OR CH.PTR = 1 DO&lt;br /&gt;
        CH.PTR = CH.PTR - 1&lt;br /&gt;
        CP = CP - 1&lt;br /&gt;
      REPEAT&lt;br /&gt;
    END ELSE&lt;br /&gt;
      * Skip spaces&lt;br /&gt;
      LOOP&lt;br /&gt;
      UNTIL XXDATA[CH.PTR-1,1] # SPC OR CH.PTR = 1 DO&lt;br /&gt;
        CH.PTR = CH.PTR - 1&lt;br /&gt;
        CP = CP - 1&lt;br /&gt;
      REPEAT&lt;br /&gt;
      IF CH.PTR &amp;gt; 1 THEN&lt;br /&gt;
        * At word end - move to start of word&lt;br /&gt;
        LOOP&lt;br /&gt;
        UNTIL XXDATA[CH.PTR-1,1] = SPC OR CH.PTR = 1 DO&lt;br /&gt;
          CH.PTR = CH.PTR - 1&lt;br /&gt;
          CP = CP - 1&lt;br /&gt;
        REPEAT&lt;br /&gt;
      END&lt;br /&gt;
    END&lt;br /&gt;
    IF CP &amp;lt; 0 THEN&lt;br /&gt;
      CP = 0&lt;br /&gt;
      POS = CH.PTR&lt;br /&gt;
      PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
    END&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
DEL.TO.END:&lt;br /&gt;
  * Delete from cursor to end of line&lt;br /&gt;
  IF CH.PTR = 1 THEN&lt;br /&gt;
    XXDATA = &#039;&#039;&lt;br /&gt;
    CP = 0&lt;br /&gt;
    POS = 1&lt;br /&gt;
  END ELSE&lt;br /&gt;
    XXDATA = XXDATA[1,CH.PTR-1]&lt;br /&gt;
  END&lt;br /&gt;
  CURR.LEN = LEN(XXDATA)&lt;br /&gt;
  PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
DELETE.WORD:&lt;br /&gt;
  * Delete to space at right of cursor&lt;br /&gt;
  IF CH.PTR &amp;gt;= CURR.LEN THEN&lt;br /&gt;
    PRINT BEEP:&lt;br /&gt;
  END ELSE&lt;br /&gt;
    C = CH.PTR&lt;br /&gt;
    LOOP&lt;br /&gt;
      C = C + 1&lt;br /&gt;
    UNTIL XXDATA[C,1] = SPC OR C = CURR.LEN DO&lt;br /&gt;
    REPEAT&lt;br /&gt;
    XXDATA = XXDATA[1,CH.PTR-1]:XXDATA[C+1,CURR.LEN]&lt;br /&gt;
    CURR.LEN = CURR.LEN - C + CH.PTR - 1&lt;br /&gt;
    PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
  END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
GO.BEGIN:&lt;br /&gt;
  * Go to the start of data and redisplay&lt;br /&gt;
  CP = 0&lt;br /&gt;
  CH.PTR = 1&lt;br /&gt;
  POS = 1&lt;br /&gt;
  PRINT BASE:XXDATA MASK:&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
GO.END:&lt;br /&gt;
  * Move to the end of data and redisplay&lt;br /&gt;
  IF XXDATA[CURR.LEN,1] # SPC THEN&lt;br /&gt;
    XXDATA = XXDATA:SPC&lt;br /&gt;
    CURR.LEN = CURR.LEN + 1&lt;br /&gt;
  END&lt;br /&gt;
  IF CURR.LEN &amp;lt; DISP.LEN THEN&lt;br /&gt;
    CP = CURR.LEN - 1&lt;br /&gt;
    POS = 1&lt;br /&gt;
  END ELSE&lt;br /&gt;
    CP = DISP.LEN - 1&lt;br /&gt;
    POS = CURR.LEN - DISP.LEN + 1&lt;br /&gt;
  END&lt;br /&gt;
  CH.PTR = CURR.LEN&lt;br /&gt;
  PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
ATB.FIND:&lt;br /&gt;
  OPEN &amp;quot;IL.TB.CHNG.LOG&amp;quot; TO IL.TB.CHNG.LOG ELSE STOP 201,&amp;quot;IL.TB.CHNG.LOG&amp;quot;&lt;br /&gt;
  OPEN &amp;quot;IL.CHANGE.LOG.INDEX&amp;quot; TO IL.CHANGE.LOG.INDEX ELSE STOP 201,&amp;quot;IL.CHANGE.LOG.INDEX&amp;quot;&lt;br /&gt;
  OPEN &amp;quot;REV.ATB.LOG&amp;quot; TO REV.ATB.LOG ELSE STOP 201,&amp;quot;REV.ATB.LOG&amp;quot;&lt;br /&gt;
  OPEN &amp;quot;HELP.TEXT.USA&amp;quot; TO HELP.TEXT.USA ELSE STOP 201,&amp;quot;HELP.TEXT.USA&amp;quot;&lt;br /&gt;
  MSK=&amp;quot;L#22&amp;quot;&lt;br /&gt;
  ATB = FIELD(ANS,&amp;quot; &amp;quot;,2)&lt;br /&gt;
  *&lt;br /&gt;
  IF ATB=&amp;quot;&amp;quot; THEN&lt;br /&gt;
    PRINT &amp;quot;ENTER ATB NAME: &amp;quot;: ; INPUT ATB&lt;br /&gt;
    IF ATB=&amp;quot;&amp;quot; OR ATB=&amp;quot;/&amp;quot; THEN RETURN&lt;br /&gt;
  END&lt;br /&gt;
  *&lt;br /&gt;
  READ AREC FROM REV.ATB.LOG,ATB ELSE&lt;br /&gt;
    ATBREC=&amp;quot;&amp;quot; ; TEST=&amp;quot;&amp;quot;&lt;br /&gt;
    EXEC.LINE=\SSELECT REV.ATB.LOG = &amp;quot;[\:ATB:\]&amp;quot;\&lt;br /&gt;
    GOSUB EXEC.SUB&lt;br /&gt;
    CTR=0&lt;br /&gt;
    LOOP&lt;br /&gt;
      READNEXT ID ELSE EXIT&lt;br /&gt;
      CTR+=1&lt;br /&gt;
      PRINT CTR &amp;quot;L#4&amp;quot;:ID&lt;br /&gt;
      ATBREC&amp;lt;CTR&amp;gt;=ID&lt;br /&gt;
      IF MOD(CTR,23)=0 THEN PRINT &amp;quot;[ENTER]&amp;quot;: ; INPUT TEST&lt;br /&gt;
      IF TEST = &amp;quot;/&amp;quot; THEN EXIT&lt;br /&gt;
    REPEAT&lt;br /&gt;
    PRINT&lt;br /&gt;
    PRINT &amp;quot;Enter choice (1-&amp;quot;:CTR:&amp;quot;): &amp;quot;: ; INPUT CHOICE&lt;br /&gt;
    IF CHOICE=&amp;quot;&amp;quot; OR CHOICE=&amp;quot;/&amp;quot; THEN RETURN&lt;br /&gt;
    ATB=ATBREC&amp;lt;CHOICE&amp;gt;&lt;br /&gt;
    IF ATB=&amp;quot;&amp;quot; THEN RETURN&lt;br /&gt;
    READ AREC FROM REV.ATB.LOG,ATB ELSE PRINT &#039;Not found&#039; ; RETURN&lt;br /&gt;
  END&lt;br /&gt;
  *&lt;br /&gt;
  MAXV=DCOUNT(AREC&amp;lt;5&amp;gt;,@VM)&lt;br /&gt;
  FNAMES=&amp;quot;&amp;quot;&lt;br /&gt;
  FOR J=1 TO MAXV&lt;br /&gt;
    IF AREC&amp;lt;5,J&amp;gt;[1,2] # &amp;quot;BK&amp;quot; THEN FNAMES :=AREC&amp;lt;5,J&amp;gt;:&amp;quot;,&amp;quot;:AREC&amp;lt;6,J&amp;gt;:&amp;quot;  &amp;quot;&lt;br /&gt;
  NEXT J&lt;br /&gt;
  *&lt;br /&gt;
  READV CKEY FROM IL.CHANGE.LOG.INDEX,AREC&amp;lt;24&amp;gt;,1 ELSE CKEY=&amp;quot;&amp;quot;&lt;br /&gt;
  READ CHNG_REC FROM IL.TB.CHNG.LOG,CKEY ELSE CHNG_REC=&amp;quot;&amp;quot;&lt;br /&gt;
  READ HELP.TEXT FROM HELP.TEXT.USA,ATB ELSE HELP.TEXT= &amp;quot; NOT FOUND&amp;quot;&lt;br /&gt;
  CONVERT &amp;quot;~&amp;quot; TO &amp;quot;&amp;quot; IN HELP.TEXT&lt;br /&gt;
  DEP=AREC&amp;lt;16&amp;gt;&lt;br /&gt;
  CONVERT @VM TO &amp;quot;,&amp;quot; IN DEP&lt;br /&gt;
  PRINT ATB&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &amp;quot;IL.BPI&amp;quot; MSK               :AREC&amp;lt;1&amp;gt;&lt;br /&gt;
  PRINT &amp;quot;FILE(S)&amp;quot; MSK              :FNAMES&lt;br /&gt;
  PRINT &amp;quot;FIELD&amp;quot; MSK                :AREC&amp;lt;2&amp;gt;&lt;br /&gt;
  PRINT &amp;quot;CHANGE LOG INDEX&amp;quot; MSK     :AREC&amp;lt;24&amp;gt;&lt;br /&gt;
  PRINT &amp;quot;CHANGE LOG KEY&amp;quot; MSK       :CKEY&lt;br /&gt;
  PRINT &amp;quot;TYPE&amp;quot; MSK                 :AREC&amp;lt;3&amp;gt;&lt;br /&gt;
  PRINT &amp;quot;MASK&amp;quot; MSK                 :AREC&amp;lt;10&amp;gt;&lt;br /&gt;
  PRINT &amp;quot;S/MV&amp;quot; MSK                 :AREC&amp;lt;14&amp;gt;&lt;br /&gt;
  PRINT &amp;quot;CONTROLLING/DEPENDENT&amp;quot; MSK:AREC&amp;lt;15&amp;gt;&lt;br /&gt;
  PRINT &amp;quot;SUB/MASTER FIELDS&amp;quot; MSK    :DEP&lt;br /&gt;
  PRINT &amp;quot;CHG DESCRIPTION&amp;quot; MSK      :CHNG_REC&amp;lt;1&amp;gt;&lt;br /&gt;
  IF AREC&amp;lt;32&amp;gt; # &amp;quot;&amp;quot; THEN&lt;br /&gt;
    PRINT &amp;quot;COMMENTS&amp;quot; MSK           :AREC&amp;lt;32&amp;gt;&lt;br /&gt;
    PRINT&lt;br /&gt;
  END&lt;br /&gt;
  PRINT&lt;br /&gt;
  MAXV=DCOUNT(HELP.TEXT&amp;lt;2&amp;gt;,@VM)&lt;br /&gt;
  FOR J=1 TO MAXV&lt;br /&gt;
    PRINT HELP.TEXT&amp;lt;2,J&amp;gt;&lt;br /&gt;
  NEXT J&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
GET.TERM.WIDTH:&lt;br /&gt;
  T=&#039;/tmp/&#039;:@LOGNAME:&#039;.term&#039;&lt;br /&gt;
  EXEC.LINE=\!tput cols &amp;gt; \:T ;* Always returns 80 if you capture, so use tmp file&lt;br /&gt;
  CAP.ACTIVE=FALSE&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
  EXEC.LINE=\!cat \:T&lt;br /&gt;
  CAP.ACTIVE=TRUE&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
  TERM.WIDTH=EXEC.CAP&amp;lt;1&amp;gt;&lt;br /&gt;
  EXEC.LINE=\!rm \:T&lt;br /&gt;
  GOSUB EXEC.SUB&lt;br /&gt;
  EXEC.LINE=\TERM \:TERM.WIDTH ; GOSUB EXEC.SUB&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
PICKLE:&lt;br /&gt;
  PICKLE.LIST=&#039;&#039;&lt;br /&gt;
  *&lt;br /&gt;
  IF FIELD(ANS,&#039; &#039;,2)=&#039;DICT&#039; THEN&lt;br /&gt;
    FILE=&#039;DICT &#039;:FIELD(ANS,&#039; &#039;,3)&lt;br /&gt;
    ITEM=FIELD(ANS,&#039; &#039;,4)&lt;br /&gt;
  END ELSE&lt;br /&gt;
    FILE=FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
    ITEM=FIELD(ANS,&#039; &#039;,3)&lt;br /&gt;
  END&lt;br /&gt;
  OPEN FILE TO FVAR ELSE&lt;br /&gt;
    PRINT &#039;Cannot open &#039;:FILE&lt;br /&gt;
    RETURN&lt;br /&gt;
  END&lt;br /&gt;
  READ REC FROM FVAR, ITEM ELSE&lt;br /&gt;
    PRINT &#039;Cannot read &#039;:FILE:&#039; &#039;:ITEM&lt;br /&gt;
    RETURN&lt;br /&gt;
  END&lt;br /&gt;
  BLOB=&#039;R=&amp;quot;&amp;quot;&#039;&lt;br /&gt;
  IF FILE[1,5]=&#039;DICT &#039; THEN DEL REC&amp;lt;9&amp;gt; ; DEL REC&amp;lt;8&amp;gt; ;* Avoid CD probs&lt;br /&gt;
  INS ITEM BEFORE REC&amp;lt;1&amp;gt;&lt;br /&gt;
  INS FILE BEFORE REC&amp;lt;1&amp;gt;&lt;br /&gt;
  SWAP @AM WITH &#039;#AM#&#039; IN REC   ; SWAP @VM WITH &#039;#VM#&#039; IN REC&lt;br /&gt;
  SWAP @SVM WITH &#039;#SVM#&#039; IN REC ; SWAP &#039;\&#039; WITH &#039;#134#&#039; IN REC&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=\S=&#039;&#039;\&lt;br /&gt;
  LOOP&lt;br /&gt;
    T=REC[1,70]&lt;br /&gt;
    BLOB&amp;lt;-1&amp;gt;=&#039;S:=\&#039;:T:&#039;\&#039;&lt;br /&gt;
    REC=REC[71,LEN(REC)]&lt;br /&gt;
  UNTIL LEN(REC)=0 DO&lt;br /&gt;
  REPEAT&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;R&amp;lt;-1&amp;gt;=S&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;*&#039;&lt;br /&gt;
  *&lt;br /&gt;
  * Write out basic code that when run will recreate the record&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;FOR F=1 TO DCOUNT(R,@AM)&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;  REC=R&amp;lt;F&amp;gt;&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;  SWAP &amp;quot;#AM#&amp;quot; WITH @AM IN REC   ; SWAP &amp;quot;#VM#&amp;quot; WITH @VM IN REC&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;  SWAP &amp;quot;#SVM#&amp;quot; WITH @SVM IN REC ; SWAP &amp;quot;#134#&amp;quot; WITH &amp;quot;\&amp;quot; IN REC&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;  FILE=REC&amp;lt;1&amp;gt; ; DEL REC&amp;lt;1&amp;gt;&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;  ITEM=REC&amp;lt;1&amp;gt; ; DEL REC&amp;lt;1&amp;gt;&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;  PRINT FILE:&amp;quot; &amp;quot;:ITEM:&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;  OPEN FILE TO FVAR ELSE STOP 201, FILE&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;  WRITE REC ON FVAR,ITEM ; PRINT &amp;quot;*&amp;quot;&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;  CLOSE FVAR&#039;&lt;br /&gt;
  BLOB&amp;lt;-1&amp;gt;=&#039;NEXT F&#039;&lt;br /&gt;
  FOR I=1 TO DCOUNT(BLOB,@AM)&lt;br /&gt;
    PRINT BLOB&amp;lt;I&amp;gt;&lt;br /&gt;
  NEXT I&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SETTINGS:&lt;br /&gt;
  PRINT CS:&lt;br /&gt;
  PRINT &#039;COMMAND.SEP  = &#039;:SETTINGS&amp;lt;1&amp;gt;&lt;br /&gt;
  PRINT &#039;STACK.CHAR   = &#039;:SETTINGS&amp;lt;2&amp;gt;&lt;br /&gt;
  PRINT &#039;PROG.CHAR    = &#039;:SETTINGS&amp;lt;3&amp;gt;&lt;br /&gt;
  PRINT &#039;MAX.STACK    = &#039;:SETTINGS&amp;lt;4&amp;gt;&lt;br /&gt;
  PRINT &#039;WP.VERB      = &#039;:SETTINGS&amp;lt;5&amp;gt;&lt;br /&gt;
  PRINT &#039;ED.VERB      = &#039;:SETTINGS&amp;lt;6&amp;gt;&lt;br /&gt;
  PRINT &#039;STAMP.STRING = &#039;:SETTINGS&amp;lt;7&amp;gt;&lt;br /&gt;
  PRINT &#039;GET.LINE.FLAG= &#039;:SETTINGS&amp;lt;8&amp;gt;&lt;br /&gt;
  PRINT &#039;WORK.FILE    = &#039;:SETTINGS&amp;lt;9&amp;gt;&lt;br /&gt;
  PRINT &#039;MCU.ON       = &#039;:SETTINGS&amp;lt;10&amp;gt;&lt;br /&gt;
  PRINT &#039;STARTUP      = &#039;:SETTINGS&amp;lt;11&amp;gt;&lt;br /&gt;
  PRINT &#039;PROMT        = &#039;:SETTINGS&amp;lt;12&amp;gt;&lt;br /&gt;
  PRINT &#039;X.DISP       = &#039;:SETTINGS&amp;lt;13&amp;gt;&lt;br /&gt;
  PRINT &#039;DEF.SHELL    = &#039;:SETTINGS&amp;lt;14&amp;gt;&lt;br /&gt;
  PRINT ; PRINT &#039;Hit ENTER to accept the current default, / to Cancel&#039;&lt;br /&gt;
  X=18&lt;br /&gt;
  LEN=30&lt;br /&gt;
  DISP.LEN=30&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;The command seperator is used to run multiple commands from one entry&#039;&lt;br /&gt;
  PRINT &#039;E.g. COUNT VOC ; COUNT VOC WITH F1 = &amp;quot;C&amp;quot; will run both count commands&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;1&amp;gt;&lt;br /&gt;
  PRINT &#039;COMMAND SEPERATOR:&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;1&amp;gt;&lt;br /&gt;
  SETTINGS&amp;lt;1&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;The stack character is what to prefix command stack operations with&#039;&lt;br /&gt;
  PRINT &#039;E.g. .L or .R87 or .D uses a stack character of &amp;quot;.&amp;quot;&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;2&amp;gt;&lt;br /&gt;
  PRINT &#039;STACK CHAR       :&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;2&amp;gt;&lt;br /&gt;
  SETTINGS&amp;lt;2&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;The program character is what to prefix program stack operations with&#039;&lt;br /&gt;
  PRINT &#039;E.g. /W2 or /B3 or /L uses a program character of &amp;quot;/&amp;quot;&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;3&amp;gt;&lt;br /&gt;
  PRINT &#039;PROG CHAR        :&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;3&amp;gt;&lt;br /&gt;
  SETTINGS&amp;lt;3&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Max lines is the maximum number of lines to hold in the command stack&#039;&lt;br /&gt;
  PRINT &#039;E.g. 9999&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;4&amp;gt;&lt;br /&gt;
  PRINT &#039;MAX # LINES      :&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;4&amp;gt;&lt;br /&gt;
  SETTINGS&amp;lt;4&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Screen editor is what command to run to edit a program visually&#039;&lt;br /&gt;
  PRINT &#039;E.g. VI or !emacs or !/home/dsiroot/joe&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;5&amp;gt;&lt;br /&gt;
  PRINT &#039;SCREEN EDITOR    :&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;5&amp;gt;&lt;br /&gt;
  SETTINGS&amp;lt;5&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Line editor is what command to run to edit a program&#039;&lt;br /&gt;
  PRINT &#039;E.g. AE or ED&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;6&amp;gt;&lt;br /&gt;
  PRINT &#039;LINE EDITOR      :&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;6&amp;gt;&lt;br /&gt;
  SETTINGS&amp;lt;6&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Header string is not currently used&#039;&lt;br /&gt;
  PRINT &#039;HEADER STRING    :&#039;:SETTINGS&amp;lt;7&amp;gt;&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Use enhanced input commands, allowing editing with arrow keys&#039;&lt;br /&gt;
  PRINT &#039;Or just use plain INPUT command&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;8&amp;gt;&lt;br /&gt;
  PRINT &#039;USE GET.LINE SUBR:&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;8&amp;gt;&lt;br /&gt;
  IF ENTRY=&#039;Y&#039; OR ENTRY=&#039;1&#039; THEN ENTRY=&#039;1&#039; ELSE ENTRY=&#039;0&#039;&lt;br /&gt;
  SETTINGS&amp;lt;8&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Default file for basic programs if none specifed&#039;&lt;br /&gt;
  PRINT &#039;E.g. BP&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;9&amp;gt;&lt;br /&gt;
  PRINT &#039;WORK FILE        :&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;9&amp;gt;&lt;br /&gt;
  SETTINGS&amp;lt;9&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Convert commands to upper case before running&#039;&lt;br /&gt;
  PRINT &#039;E.g. 1 or 0, Y or N&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;10&amp;gt;&lt;br /&gt;
  PRINT &#039;CONVERT TO UCASE :&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;9&amp;gt;&lt;br /&gt;
  IF ENTRY=&#039;Y&#039; OR ENTRY=&#039;1&#039; THEN ENTRY=&#039;1&#039; ELSE ENTRY=&#039;0&#039;&lt;br /&gt;
  SETTINGS&amp;lt;9&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Command to run when stack first starts&#039;&lt;br /&gt;
  PRINT &#039;E.g. LISTUSER ; WHO&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;11&amp;gt;&lt;br /&gt;
  PRINT &#039;STARTUP COMMAND  :&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;11&amp;gt;&lt;br /&gt;
  SETTINGS&amp;lt;11&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Default Prompt to display, use .P to change this&#039;&lt;br /&gt;
  PRINT &#039;PROMPT           :&#039;:SETTINGS&amp;lt;12&amp;gt;&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Adjustment for input position (if you use #R, then CR+LF is inserted,&#039;&lt;br /&gt;
  PRINT &#039;and an adjustment of -2 is needed.  Use .P to change this&#039;&lt;br /&gt;
  PRINT &#039;X DISP FOR PROMPT:&#039;:SETTINGS&amp;lt;13&amp;gt;&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Default shell to use with !command&#039;&lt;br /&gt;
  PRINT &#039;E.g. ksh, bash, /usr/bin/ksh, /opt/freeware/bin/bash&#039;&lt;br /&gt;
  PRINT &#039;Current value:&#039;:SETTINGS&amp;lt;14&amp;gt;&lt;br /&gt;
  PRINT &#039;SHELL            :&#039;:&lt;br /&gt;
  INPUT ENTRY&lt;br /&gt;
  IF ENTRY = &#039;/&#039; THEN RETURN&lt;br /&gt;
  IF ENTRY = &#039;&#039;  THEN ENTRY=SETTINGS&amp;lt;14&amp;gt;&lt;br /&gt;
  SETTINGS&amp;lt;14&amp;gt;=ENTRY&lt;br /&gt;
  *&lt;br /&gt;
  WRITE SETTINGS ON HOME.F, SETTING.ITEM&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
LISTA:&lt;br /&gt;
  OPEN &#039;ACC&#039; TO ACC.F ELSE STOP 201,&#039;ACC&#039;&lt;br /&gt;
  OPEN &#039;INFO.STATUS&#039; TO INFO.STATUS ELSE STOP 201,&#039;INFO.STATUS&#039;&lt;br /&gt;
  SELECT ACC.F&lt;br /&gt;
  USER.LIST=&#039;&#039;&lt;br /&gt;
  LOOP&lt;br /&gt;
    READNEXT PORT ELSE EXIT&lt;br /&gt;
    READ REC FROM ACC.F, PORT THEN&lt;br /&gt;
      READ MENU FROM INFO.STATUS, PORT&#039;R%3&#039; ELSE MENU=&#039;TCL&#039;&lt;br /&gt;
      MENU=MENU&amp;lt;DCOUNT(MENU,@AM)&amp;gt; ;* Show the last item&lt;br /&gt;
      USER=REC&amp;lt;5&amp;gt;&lt;br /&gt;
      DATE=REC&amp;lt;2&amp;gt;&lt;br /&gt;
      TIME=REC&amp;lt;3&amp;gt;&lt;br /&gt;
      LOCATE PORT IN USER.LIST&amp;lt;4&amp;gt; BY &#039;AR&#039; SETTING POS ELSE NULL&lt;br /&gt;
      INS USER BEFORE USER.LIST&amp;lt;1,POS&amp;gt;&lt;br /&gt;
      INS DATE BEFORE USER.LIST&amp;lt;2,POS&amp;gt;&lt;br /&gt;
      INS TIME BEFORE USER.LIST&amp;lt;3,POS&amp;gt;&lt;br /&gt;
      INS PORT BEFORE USER.LIST&amp;lt;4,POS&amp;gt;&lt;br /&gt;
      INS MENU BEFORE USER.LIST&amp;lt;5,POS&amp;gt;&lt;br /&gt;
    END&lt;br /&gt;
  REPEAT&lt;br /&gt;
  *GET.LOCKS&lt;br /&gt;
  LOCK.LIST=&#039;&#039;&lt;br /&gt;
  FLIST=&#039;&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;AS.FEATURE&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;AS.MASTER&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;AUVB.PARAMETER&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;BQ.PARAMETER&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;CS.MASTER&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;DATA.MASKING.PARAMETER&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;DB.RECORD.LOCKS&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;DE.MASTER&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;FIELD.SECURITY&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;INFO-SYSTEM&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;IT.INSURANCE&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;IT.INSURANCE.AGENT&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;LS.BANK.DEPOSIT&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;LS.DISCOUNT.PACKAGE&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;LS.DISCOUNT.WORKSHEET&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;LS.GL.HISTORY&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;LS.MASTER&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;LS.POST.DATED.CHECK&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;LS.SUPER.QUOTE&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;LS.WK.CASH&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;MISC&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;MM.GROUP&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;PARAMETER&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;PROCESSOR.PARAMETER&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;TRED.FUTURE.PROC.DATES&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;USERS.MENUS&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;WL.FOLLOW.UP&#039;&lt;br /&gt;
  FLIST&amp;lt;-1&amp;gt;=&#039;WL.PARAMETER&#039;&lt;br /&gt;
  *&lt;br /&gt;
  FOR G=1 TO DCOUNT(FLIST,@AM)&lt;br /&gt;
    FILE=&#039;DB.RECORD.LOCKS,&#039;:FLIST&amp;lt;G&amp;gt;&lt;br /&gt;
    OPEN FILE TO FVAR THEN&lt;br /&gt;
      SELECT FVAR&lt;br /&gt;
      LOOP&lt;br /&gt;
        READNEXT LOCK.ID ELSE EXIT&lt;br /&gt;
        READ REC FROM FVAR, LOCK.ID THEN&lt;br /&gt;
          PORT=REC&amp;lt;1&amp;gt;&lt;br /&gt;
          DATE=REC&amp;lt;2&amp;gt;&lt;br /&gt;
          TIME=REC&amp;lt;3&amp;gt;&lt;br /&gt;
          USER=REC&amp;lt;4&amp;gt;&lt;br /&gt;
          LOCK.LIST&amp;lt;1,-1&amp;gt;=FILE&lt;br /&gt;
          LOCK.LIST&amp;lt;2,-1&amp;gt;=LOCK.ID&lt;br /&gt;
          LOCK.LIST&amp;lt;3,-1&amp;gt;=PORT&lt;br /&gt;
          LOCK.LIST&amp;lt;4,-1&amp;gt;=DATE&lt;br /&gt;
          LOCK.LIST&amp;lt;5,-1&amp;gt;=TIME&lt;br /&gt;
          LOCK.LIST&amp;lt;6,-1&amp;gt;=USER&lt;br /&gt;
          LOCATE PORT IN USER.LIST&amp;lt;4&amp;gt; SETTING POS THEN&lt;br /&gt;
            USER.LIST&amp;lt;6,POS&amp;gt;=LOCK.ID:&#039;,&#039;:USER.LIST&amp;lt;6,POS&amp;gt;&lt;br /&gt;
          END&lt;br /&gt;
        END&lt;br /&gt;
      REPEAT&lt;br /&gt;
      CLOSE FVAR&lt;br /&gt;
    END&lt;br /&gt;
  NEXT G&lt;br /&gt;
  *&lt;br /&gt;
  PRINT @(-1):&#039;USERS&#039;&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Port&#039;:&#039; &#039;:&#039;User&#039;&#039;L#12&#039;:&#039; &#039;:&#039;Date&#039;&#039;L#10&#039;:&#039; &#039;:&#039;Time&#039;&#039;L#8&#039;:&#039; &#039;:&lt;br /&gt;
  PRINT &#039;Time On&#039;&#039;L#8&#039;:&#039; &#039;:&#039;Menu&#039;&#039;L#30&#039;:&#039; &#039;:&#039;L&#039;&lt;br /&gt;
  PRINT &#039;----&#039;:&#039; &#039;:STR(&#039;-&#039;,12):&#039; &#039;:STR(&#039;-&#039;,10):&#039; &#039;:STR(&#039;-&#039;,8):&#039; &#039;:&lt;br /&gt;
  PRINT STR(&#039;-&#039;,8):&#039; &#039;:STR(&#039;-&#039;,30):&#039; &#039;:&#039;-&#039;&lt;br /&gt;
  FOR F=1 TO DCOUNT(USER.LIST&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    DUR=TIME()-USER.LIST&amp;lt;3,F&amp;gt;&lt;br /&gt;
    IF DUR&amp;lt;0 THEN DUR+=86400 ;* Roll over midnight, add back number of seconds in a day&lt;br /&gt;
    PRINT USER.LIST&amp;lt;4,F&amp;gt;&#039;R#4&#039;:&#039; &#039;:&lt;br /&gt;
    PRINT USER.LIST&amp;lt;1,F&amp;gt;&#039;L#12&#039;:&#039; &#039;:&lt;br /&gt;
    PRINT USER.LIST&amp;lt;2,F&amp;gt;&#039;D4/&#039;:&#039; &#039;:&lt;br /&gt;
    PRINT USER.LIST&amp;lt;3,F&amp;gt;&#039;MTS&#039;:&#039; &#039;:&lt;br /&gt;
    PRINT DUR&#039;MTS&#039;:&#039; &#039;:&lt;br /&gt;
    PRINT USER.LIST&amp;lt;5,F&amp;gt;&#039;L#30&#039;:&#039; &#039;:&lt;br /&gt;
    IF USER.LIST&amp;lt;6,F&amp;gt;#&#039;&#039; THEN PRINT &#039;*&#039; ELSE PRINT &#039; &#039;&lt;br /&gt;
  NEXT F&lt;br /&gt;
  *&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;LOCKS&#039;&lt;br /&gt;
  PRINT&lt;br /&gt;
  PRINT &#039;Table&#039;&#039;L#20&#039;:&#039; &#039;:&#039;ID&#039;&#039;L#25&#039;:&#039; &#039;:&#039;Port&#039;&#039;L#4&#039;:&#039; &#039;:&lt;br /&gt;
  PRINT &#039;Date&#039;&#039;L#5&#039;:&#039; &#039;:&#039;Time&#039;&#039;L#5&#039;:&#039; &#039;:&#039;User&#039;&#039;L#15&#039;&lt;br /&gt;
  PRINT STR(&#039;-&#039;,20):&#039; &#039;:STR(&#039;-&#039;,25):&#039; &#039;:STR(&#039;-&#039;,4):&#039; &#039;:&lt;br /&gt;
  PRINT STR(&#039;-&#039;,5):&#039; &#039;:STR(&#039;-&#039;,5):&#039; &#039;:STR(&#039;-&#039;,15)&lt;br /&gt;
  FOR L=1 TO DCOUNT(LOCK.LIST&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    FILE=FIELD(LOCK.LIST&amp;lt;1,L&amp;gt;,&#039;,&#039;,2)&lt;br /&gt;
    PRINT FILE&#039;L#20&#039;:&#039; &#039;:LOCK.LIST&amp;lt;2,L&amp;gt;&#039;L#25&#039;:&#039; &#039;:LOCK.LIST&amp;lt;3,L&amp;gt;&#039;R#4&#039;:&#039; &#039;:&lt;br /&gt;
    PRINT (LOCK.LIST&amp;lt;4,L&amp;gt;&#039;D4/&#039;)[1,5]:&#039; &#039;:LOCK.LIST&amp;lt;5,L&amp;gt;&#039;MT&#039;:&#039; &#039;:LOCK.LIST&amp;lt;6,L&amp;gt;&#039;L#15&#039;&lt;br /&gt;
  NEXT L&lt;br /&gt;
  *&lt;br /&gt;
  CLOSE ACC.F&lt;br /&gt;
  CLOSE INFO.STATUS&lt;br /&gt;
  *&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SEARCH.BY.EXAMPLE:&lt;br /&gt;
  * Calculate all possible ATB&#039;s for an example contract&lt;br /&gt;
  @ID=ID&lt;br /&gt;
  IF FILE=&#039;&#039; OR @ID=&#039;&#039; THEN&lt;br /&gt;
    PRINT &#039;Usage: SE &amp;lt;FNAME&amp;gt; &amp;lt;ID&amp;gt;&#039;&lt;br /&gt;
    RETURN&lt;br /&gt;
  END&lt;br /&gt;
  OPEN FILE TO F ELSE PRINT &#039;Cannot open &#039;:FILE ; RETURN&lt;br /&gt;
  OPEN &amp;quot;DICT &amp;quot;:FILE TO @DICT ELSE PRINT &#039;Cannot open DICT &#039;:FILE ; RETURN&lt;br /&gt;
  READ @RECORD FROM F, @ID ELSE PRINT &#039;Cannot read &#039;:@ID:&#039; in &#039;:FILE ; RETURN&lt;br /&gt;
  CLOSE F&lt;br /&gt;
  OUTPUT=&#039;&#039;&lt;br /&gt;
  EXECUTE \SSELECT DICT \:FILE:\ WITH F1 = &amp;quot;I&amp;quot; USING DICT VOC\&lt;br /&gt;
  LOOP&lt;br /&gt;
    READNEXT FLD ELSE EXIT&lt;br /&gt;
    PRINT FLD:&#039;=&#039;:&lt;br /&gt;
    VAL=CALCULATE(FLD)&lt;br /&gt;
    PRINT VAL&lt;br /&gt;
    IF @CONV # &#039;&#039; THEN VAL=OCONV(VAL,@CONV)&lt;br /&gt;
    *OUTPUT&amp;lt;-1&amp;gt;=FLD:&#039;=&#039;:VAL&lt;br /&gt;
  REPEAT&lt;br /&gt;
  WRITE OUTPUT ON VOC, &#039;OUTPUT.TMP&#039;&lt;br /&gt;
  EXECUTE \AE VOC OUTPUT.TMP\&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
IL10.XREF:&lt;br /&gt;
  FILE.NAME = FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
  FIELD.NAME = FIELD(ANS,&#039; &#039;,3)&lt;br /&gt;
  SELECT.HDR=\BPI,FILE_NAME,FIELD_NAME,STRING_POS,TABLE_NAME,COLUMN_NAME,VALUE_TYPE,FIELD_TYPE\&lt;br /&gt;
  SELECT.COMMAND = \SELECT\&lt;br /&gt;
  SELECT.COMMAND := \ BPI, FILE_NAME, FIELD_NAME, STRING_POS, TABLE_NAME, COLUMN_NAME, VALUE_TYPE, FIELD_TYPE\&lt;br /&gt;
  IF INDEX(FILE.NAME,&#039;%&#039;,1) THEN&lt;br /&gt;
    SELECT.COMMAND := \ FROM METADATA_FIELDS WHERE (FILE_NAME LIKE &#039;\:FILE.NAME:\&#039; OR TABLE_NAME LIKE &#039;\:FILE.NAME:\&#039;)\&lt;br /&gt;
  END ELSE&lt;br /&gt;
    SELECT.COMMAND := \ FROM METADATA_FIELDS WHERE (FILE_NAME = &#039;\:FILE.NAME:\&#039; OR TABLE_NAME = &#039;\:FILE.NAME:\&#039;)\&lt;br /&gt;
  END&lt;br /&gt;
  IF FIELD.NAME # &#039;&#039; THEN SELECT.COMMAND :=\ AND FIELD_NAME LIKE &#039;%\:FIELD.NAME:\%&#039;\&lt;br /&gt;
  SELECT.COMMAND := \ ORDER BY FILE_NAME, STRING_POS\&lt;br /&gt;
  *&lt;br /&gt;
  GOSUB IL10.SEL&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
IL10.AF:&lt;br /&gt;
  FLD = FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
  SELECT.HDR=\BPI,FILE_NAME,FIELD_NAME,MV_POS,TABLE_NAME,COLUMN_NAME,MV/S,TYPE,LEN,SCALE\&lt;br /&gt;
  SELECT.COMMAND = \SELECT BPI,FILE_NAME,FIELD_NAME,STRING_POS,TABLE_NAME,COLUMN_NAME,VALUE_TYPE,FIELD_TYPE,FIELD_LENGTH,SCALE\&lt;br /&gt;
  SELECT.COMMAND  :=\ FROM METADATA_FIELDS\&lt;br /&gt;
  SELECT.COMMAND  :=\ WHERE FIELD_NAME LIKE &#039;%\:FLD:\%&#039; OR COLUMN_NAME LIKE &#039;%\:FLD:\%&#039;\&lt;br /&gt;
  GOSUB IL10.SEL&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
IL10.DESC:&lt;br /&gt;
  TABLE = FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
  SELECT.HDR=\COL,COLUMN_NAME,DATA_TYPE\&lt;br /&gt;
  SELECT.COMMAND = \SELECT ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS\&lt;br /&gt;
  SELECT.COMMAND:= \ WHERE TABLE_NAME = &#039;\:TABLE:\&#039;\&lt;br /&gt;
  GOSUB IL10.SEL&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
IL10.NSEL:&lt;br /&gt;
  PRMT=1&lt;br /&gt;
  EXECLINE=&#039;SELECT &#039;:FIELD(ANS,&#039; &#039;,2,999)&lt;br /&gt;
  CALL EXECUTE.SELECT.SUB(EXECLINE,ERR.MSG,1,&#039;&#039;,0,SELECTED.LIST,1,&#039;&#039;,0,&#039;&#039;,0,0)&lt;br /&gt;
  CTR=0&lt;br /&gt;
  LOOP&lt;br /&gt;
    READNEXT ID FROM SELECTED.LIST ELSE EXIT&lt;br /&gt;
    CTR+=1&lt;br /&gt;
    CRT CTR&#039;R#6&#039;:&#039;) &#039;:ID&lt;br /&gt;
    IF CTR/20=INT(CTR/20) AND PRMT THEN&lt;br /&gt;
      CRT &#039;:&#039;:&lt;br /&gt;
      INPUT AAA&lt;br /&gt;
      IF AAA = &#039;/&#039; OR AAA=&#039;Q&#039; THEN STOP&lt;br /&gt;
      IF AAA = &#039;N&#039; THEN PRMT=0&lt;br /&gt;
    END&lt;br /&gt;
  REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SQL.SEL:&lt;br /&gt;
  SELECT.HDR=&#039;&#039;&lt;br /&gt;
  SELECT.COMMAND=FIELD(ANS,&#039; &#039;,2,200)&lt;br /&gt;
  GOSUB IL10.SEL&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SQL.FILE:&lt;br /&gt;
  SELECT.HDR=&#039;&#039;&lt;br /&gt;
  FILE=FIELD(ANS,&#039; &#039;,2) ;* Spaces in file name are not supported&lt;br /&gt;
  OSREAD SELECT.COMMAND FROM FILE THEN&lt;br /&gt;
  CONVERT @AM TO &#039; &#039; IN SELECT.COMMAND&lt;br /&gt;
  SWAP CHAR(13):CHAR(10) WITH &#039; &#039; IN SELECT.COMMAND&lt;br /&gt;
  GOSUB IL10.SEL&lt;br /&gt;
END ELSE&lt;br /&gt;
  CRT FILE:&#039; not found&#039;&lt;br /&gt;
END&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
SQL.SEL.LIST:&lt;br /&gt;
  LIST=FIELD(ANS,&#039; &#039;,2)&lt;br /&gt;
  SELECT.COMMAND=FIELD(ANS,&#039; &#039;,3,200)&lt;br /&gt;
  PRINT SELECT.COMMAND&lt;br /&gt;
  PARAM=&#039;&#039;&lt;br /&gt;
  CALL IDS.EXECUTE.ANSI.SQL(SELECT.COMMAND,PARAM,&#039;&#039;,&#039;&#039;,KEY.LIST)&lt;br /&gt;
  CALL CONVERT.LIST(KEY.LIST)&lt;br /&gt;
  EXECUTE \SAVE.LIST \:LIST PASSLIST KEY.LIST&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
IL10.SEL:&lt;br /&gt;
  PARAM=&#039;&#039;&lt;br /&gt;
  CONVERT &#039;,&#039; TO @VM IN SELECT.HDR&lt;br /&gt;
  PRINT SELECT.COMMAND&lt;br /&gt;
  CALL IDS.EXECUTE.ANSI.SQL(SELECT.COMMAND,PARAM,&#039;&#039;,&#039;&#039;,KEY.LIST)&lt;br /&gt;
  *SUBROUTINE IDS.EXECUTE.ANSI.SQL.ERROR(SQL.STRING, PARAMS, COLUMNS, TYPES, RESULTS.ARRAY, ERROR, OFFSET, LIMIT, SORT.COLUMN, ENHANCE, ALTER.SESSION,TRANSFER.CONTRACT)&lt;br /&gt;
  CALL IDS.EXECUTE.ANSI.SQL.ERROR(SELECT.COMMAND, PARAM, &#039;&#039;, &#039;&#039;, KEY.LIST, ERR, &#039;&#039;, &#039;&#039;, &#039;&#039;, &#039;0&#039;, &#039;&#039;,&#039;&#039;)&lt;br /&gt;
  DISP.MAX=DCOUNT(KEY.LIST,@AM)&lt;br /&gt;
  PRINT DISP.MAX:&#039; items selected, ERR=&#039;:ERR&lt;br /&gt;
  IF DISP.MAX=0 THEN RETURN&lt;br /&gt;
  *&lt;br /&gt;
  * Get widths&lt;br /&gt;
  W=&#039;&#039;&lt;br /&gt;
  IF SELECT.HDR # &#039;&#039; THEN&lt;br /&gt;
    INS SELECT.HDR BEFORE KEY.LIST&amp;lt;1&amp;gt;&lt;br /&gt;
    DISP.MAX+=1&lt;br /&gt;
  END&lt;br /&gt;
  FOR R=1 TO DISP.MAX&lt;br /&gt;
    FOR C=1 TO DCOUNT(KEY.LIST&amp;lt;R&amp;gt;,@VM)&lt;br /&gt;
      L=LEN(KEY.LIST&amp;lt;R,C&amp;gt;)&lt;br /&gt;
      IF L &amp;gt; W&amp;lt;C&amp;gt; THEN W&amp;lt;C&amp;gt;=L&lt;br /&gt;
    NEXT C&lt;br /&gt;
  NEXT R&lt;br /&gt;
  *&lt;br /&gt;
  * Print the header&lt;br /&gt;
  DISP.START=1&lt;br /&gt;
  IF SELECT.HDR # &#039;&#039; THEN&lt;br /&gt;
    DISP.START=2&lt;br /&gt;
    FOR C=1 TO DCOUNT(KEY.LIST&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
      PRINT FMT(KEY.LIST&amp;lt;1,C&amp;gt;,&#039;L#&#039;:W&amp;lt;C&amp;gt;):&#039; &#039;:&lt;br /&gt;
    NEXT C&lt;br /&gt;
    PRINT&lt;br /&gt;
    *&lt;br /&gt;
    FOR C=1 TO DCOUNT(KEY.LIST&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
      PRINT STR(&#039;-&#039;,W&amp;lt;C&amp;gt;):&#039; &#039;:&lt;br /&gt;
    NEXT C&lt;br /&gt;
    PRINT&lt;br /&gt;
  END&lt;br /&gt;
  * Now the data&lt;br /&gt;
  FOR R=DISP.START TO DISP.MAX&lt;br /&gt;
    IF SELECT.HDR = &#039;&#039; THEN CRT R,:&lt;br /&gt;
    FOR C=1 TO DCOUNT(KEY.LIST&amp;lt;R&amp;gt;,@VM)&lt;br /&gt;
      PRINT FMT(KEY.LIST&amp;lt;R,C&amp;gt;,&#039;L#&#039;:W&amp;lt;C&amp;gt;):&#039; &#039;:&lt;br /&gt;
    NEXT C&lt;br /&gt;
    PRINT&lt;br /&gt;
  NEXT R&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
LIST.PARAM:&lt;br /&gt;
  P=&#039;&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=STR(&#039;-&#039;, 18)         ; P&amp;lt;2,-1&amp;gt;=STR(&#039;-&#039;,33)                         ; P&amp;lt;3,-1&amp;gt;=STR(&#039;-&#039;,30)&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;Key Prefix&#039;         ; P&amp;lt;2,-1&amp;gt;=&#039;InfoLease Table&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;RDBMS Table&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=STR(&#039;-&#039;, 18)         ; P&amp;lt;2,-1&amp;gt;=STR(&#039;-&#039;,33)                         ; P&amp;lt;3,-1&amp;gt;=STR(&#039;-&#039;,30)&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;*00&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Lessor Parameters&#039;                 ; P&amp;lt;3,-1&amp;gt;=&#039;LESSOR_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;*00A&#039;               ; P&amp;lt;2,-1&amp;gt;=&#039;Temporary Lessor&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;TEMP_LESSOR_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;*00B&#039;               ; P&amp;lt;2,-1&amp;gt;=&#039;Additional Lessor&#039;                 ; P&amp;lt;3,-1&amp;gt;=&#039;ADDL_LESSOR_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;*00GL&#039;              ; P&amp;lt;2,-1&amp;gt;=&#039;Multiple Bookset&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;MULTIPLE_BOOKSET_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;*00UD&#039;              ; P&amp;lt;2,-1&amp;gt;=&#039;Lessor User-Defined&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;LESSOR_USER_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;*ACH&#039;               ; P&amp;lt;2,-1&amp;gt;=&#039;Lessor ACH Flags&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;LESSOR_ACH_FLAGS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;*ADVICE*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Advice Follow-up&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;ADVICE_FOLLOW_UP_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;*COMMISSION&#039;        ; P&amp;lt;2,-1&amp;gt;=&#039;Commission&#039;                        ; P&amp;lt;3,-1&amp;gt;=&#039;COMMISSION_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;*WARNING.MESSAGES&#039;  ; P&amp;lt;2,-1&amp;gt;=&#039;Lessor Warning Messages&#039;           ; P&amp;lt;3,-1&amp;gt;=&#039;LESSOR_WARNING_MESSAGES_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;[Lessor Id]&#039;        ; P&amp;lt;2,-1&amp;gt;=&#039;Lessor Address&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;LS_ADDRESS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;00*00&#039;              ; P&amp;lt;2,-1&amp;gt;=&#039;Lease System Parameters&#039;           ; P&amp;lt;3,-1&amp;gt;=&#039;PARAMETER_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;00*00A&#039;             ; P&amp;lt;2,-1&amp;gt;=&#039;Temporary Lease System Params&#039;     ; P&amp;lt;3,-1&amp;gt;=&#039;TEMP_PARAMETER_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;00*00B&#039;             ; P&amp;lt;2,-1&amp;gt;=&#039;Additional Lease System Params&#039;    ; P&amp;lt;3,-1&amp;gt;=&#039;ADDL_PARAMETER_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;00*00IRR&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;IRR Parameter&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;IRR_PARAMETER_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;00*00RPT&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Report Parameter&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;RPT_PARAMETER_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;10*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Personnel&#039;                         ; P&amp;lt;3,-1&amp;gt;=&#039;PERSONNEL_INFO_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;12*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Office&#039;                            ; P&amp;lt;3,-1&amp;gt;=&#039;OFFICE_DATA_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;13*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Vendor/Dealer&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;PARAM_ADDRESS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;13APA*&#039;             ; P&amp;lt;2,-1&amp;gt;=&#039;Additional Vendor/Dealer Address&#039;  ; P&amp;lt;3,-1&amp;gt;=&#039;ADDL_PARAM_ADDRESS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;14*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Reason Code&#039;                       ; P&amp;lt;3,-1&amp;gt;=&#039;REASON_CODE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;15*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Collateral Code&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;TB_COLLATERAL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;16*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Equipment Category&#039;                ; P&amp;lt;3,-1&amp;gt;=&#039;EQUIP_CODE_DEFAULTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;17*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Tax Description&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;TAX_DESC_TBL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;18*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Property Tax Status&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;PROP_TAX_STATUS_TBL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;19*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Region&#039;                            ; P&amp;lt;3,-1&amp;gt;=&#039;REGION_TABLE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;20*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Remit To&#039;                          ; P&amp;lt;3,-1&amp;gt;=&#039;REMIT_ADDRESS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;21*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Base Rate Indicator&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;FLOAT_BANK_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;22*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Broker Address&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;BROKER_TABLE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;23*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;General Ledger Account&#039;            ; P&amp;lt;3,-1&amp;gt;=&#039;GL_ACCT_TABLE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;24*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Branch&#039;                            ; P&amp;lt;3,-1&amp;gt;=&#039;BRANCH_DATA_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;26*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Department&#039;                        ; P&amp;lt;3,-1&amp;gt;=&#039;DEPARTMENT_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;27*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Business&#039;                          ; P&amp;lt;3,-1&amp;gt;=&#039;TB_BUSINESS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;28*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Program Type&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;PROG_TYPE_DEFAULTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;29*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Payment Plan&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;TB_PAYMENT_PLAN_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;30*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Promotion&#039;                         ; P&amp;lt;3,-1&amp;gt;=&#039;PROMOTION_TBL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;31*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Account Type&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;TB_ACCT_TYPE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;32*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Business Type&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;TB_BUSINESS_TYPE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;33*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Application Status&#039;                ; P&amp;lt;3,-1&amp;gt;=&#039;TB_STATUS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;34*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Disposition Payment Type&#039;          ; P&amp;lt;3,-1&amp;gt;=&#039;TB_DISP_PAYMENT_TYPE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;35*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Disposition/Inventory&#039;             ; P&amp;lt;3,-1&amp;gt;=&#039;DISP_INVENT_TABLE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;36*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Bank Additional User-Defined&#039;      ; P&amp;lt;3,-1&amp;gt;=&#039;AUS_BANKS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;39*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Product Line&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;PROD_LINE_DEFAULTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;40*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Insurance Type&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;TB_INSURANCE_TYPE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;41*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Insurance Status&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;TB_INSURANCE_STATUS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;42*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Contract Status&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;CONTRACT_STATUS_INFO_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;43*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Guaranteed Residual&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;TB_GUARANTEED_RESIDUAL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;45*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Country Code&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;COUNTRY_CODES_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;ACTIVITY.DE*&#039;       ; P&amp;lt;2,-1&amp;gt;=&#039;Activity (Inv. Interface)&#039;         ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;ADDL.BUYOUT*&#039;       ; P&amp;lt;2,-1&amp;gt;=&#039;Additional Buyout Info&#039;            ; P&amp;lt;3,-1&amp;gt;=&#039;ADDL_BUYOUT_DEFAULT_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;ADJ*&#039;               ; P&amp;lt;2,-1&amp;gt;=&#039;Adjustment Code&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;ADJUSTMENT_CODE_TBL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;ADMIN*&#039;             ; P&amp;lt;2,-1&amp;gt;=&#039;Administrative Code&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;TB_ADMINISTRATIVE_CODE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;AP.INTERFACE*1&#039;     ; P&amp;lt;2,-1&amp;gt;=&#039;API Parameters&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;API_PARAMETERS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;ASSET.DE*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;Asset (Inv. Interface)&#039;            ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;ASSET.STATUS*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Asset Status&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;TB_ASSET_STATUS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;ASSOCIATION*&#039;       ; P&amp;lt;2,-1&amp;gt;=&#039;Association&#039;                       ; P&amp;lt;3,-1&amp;gt;=&#039;ASSOC_REL_PARTY_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;BANK*&#039;              ; P&amp;lt;2,-1&amp;gt;=&#039;Bank Address&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;BANK_ADDRESS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;BANK.ADDL*&#039;         ; P&amp;lt;2,-1&amp;gt;=&#039;Additional Bank Address&#039;           ; P&amp;lt;3,-1&amp;gt;=&#039;ADDL_BANK_ADDRESS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;BI.TYPE*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Blended Income Type&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;TB_BLENDED_INCOME_TYPE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;BID*&#039;               ; P&amp;lt;2,-1&amp;gt;=&#039;Blended Income Defaults&#039;           ; P&amp;lt;3,-1&amp;gt;=&#039;BLENDED_INCOME_DEF_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;BLENDED.INCOME*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Blended Income Parameter&#039;          ; P&amp;lt;3,-1&amp;gt;=&#039;BLENDED_INCOME_TBL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;BUS.PLAN*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;Business Plan&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;BUS_PLAN_DEFAULTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;BUS.SEG*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Business Segment&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;BUS_SEGMENT_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;BUYOUT*&#039;            ; P&amp;lt;2,-1&amp;gt;=&#039;Buyout Parameters&#039;                 ; P&amp;lt;3,-1&amp;gt;=&#039;BUYOUT_DEFAULT_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;CADDR.DE*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;Customer Address (Inv. Interface)&#039; ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;CCA*&#039;               ; P&amp;lt;2,-1&amp;gt;=&#039;CCA Class&#039;                         ; P&amp;lt;3,-1&amp;gt;=&#039;CCA_CLASS_DEPR_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;CHECK.TYPE*&#039;        ; P&amp;lt;2,-1&amp;gt;=&#039;Check Type&#039;                        ; P&amp;lt;3,-1&amp;gt;=&#039;CHECK_TYPE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;CHRG.DE*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Charge Info (Inv. Interface)&#039;      ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;CHRG.TYPE*&#039;         ; P&amp;lt;2,-1&amp;gt;=&#039;Open Item Charge Types&#039;            ; P&amp;lt;3,-1&amp;gt;=&#039;CHARGE_TYPE_TABLE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;CHRG.TYPE.INDEX*&#039;   ; P&amp;lt;2,-1&amp;gt;=&#039;Open Item Charge Type Indexes&#039;     ; P&amp;lt;3,-1&amp;gt;=&#039;CHARGE_TYPE_INDEX_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;CNTC.DE*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Contact (Inv. Interface)&#039;          ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;CURRENCY*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;Currency Code&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;CURRENCY_CODES_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;DEALER.DISTRICT*&#039;   ; P&amp;lt;2,-1&amp;gt;=&#039;Dealer District&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;TB_DEALER_DISTRICT_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;DEALER.PARAM*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Dealer Parameter&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;DEALER_PARAM_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;DEALER.REGION*&#039;     ; P&amp;lt;2,-1&amp;gt;=&#039;Dealer Region&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;TB_DEALER_REGION_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;DEALER.SALESMAN*&#039;   ; P&amp;lt;2,-1&amp;gt;=&#039;Dealer Salesman&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;DLR_SALESMAN_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;DEALER.SERIES*&#039;     ; P&amp;lt;2,-1&amp;gt;=&#039;Dealer Series&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;TB_DEALER_SERIES_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;DEALER.STATUS*&#039;     ; P&amp;lt;2,-1&amp;gt;=&#039;Dealer Status&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;DEALER_STATUS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;DLR.RECOURSE*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Dealer Recourse&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;TB_DEALER_RECOURSE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;EARLY.TERM.OPTION*&#039; ; P&amp;lt;2,-1&amp;gt;=&#039;Early Term Option&#039;                 ; P&amp;lt;3,-1&amp;gt;=&#039;TB_EARLY_TERM_OPTION_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;ER*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Exchange Rate&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;EXCHANGE_RATE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;FAC*&#039;               ; P&amp;lt;2,-1&amp;gt;=&#039;Void Factura Reason&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;TB_VOID_FACTURA_REASON_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;FIN.CLASS*&#039;         ; P&amp;lt;2,-1&amp;gt;=&#039;Finance Class&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;TB_FINANCE_CLASS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;FIN.PLAN*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;Finance Plan&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;TB_FINANCE_PLAN_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;FOLLOW.UP*&#039;         ; P&amp;lt;2,-1&amp;gt;=&#039;Follow Up&#039;                         ; P&amp;lt;3,-1&amp;gt;=&#039;FOLLOW_UP_CODES_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;GL.LINK.INDEX*&#039;     ; P&amp;lt;2,-1&amp;gt;=&#039;General Ledger Link Index&#039;         ; P&amp;lt;3,-1&amp;gt;=&#039;TB_GL_LINK_INDEX_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;GROUP.MISC.CODES*&#039;  ; P&amp;lt;2,-1&amp;gt;=&#039;Group Misc GL Codes&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;GROUP_MISC_CODES_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;HOLIDAY.TBL*&#039;       ; P&amp;lt;2,-1&amp;gt;=&#039;Holiday/Weekend&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;HOLIDAY_WEEKEND_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;IDC.DESC*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;IDC Description&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;TB_IDC_DESC_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;INVOICE.FORMAT*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Invoice Format&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;INVOICE_FORMAT_TABLE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;IP*&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Insurance Parameter&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;INSURANCE_PARAMETER_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;IRS.CAT*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;IRS Category/Tax&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;IRS_CAT_DEFAULTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;ITP&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;Insurance Tape Parameter&#039;          ; P&amp;lt;3,-1&amp;gt;=&#039;INS_TAPE_PARAMETER_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;L.NATIONALITY*&#039;     ; P&amp;lt;2,-1&amp;gt;=&#039;Nationality&#039;                       ; P&amp;lt;3,-1&amp;gt;=&#039;TB_NATIONALITY_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;LANG*&#039;              ; P&amp;lt;2,-1&amp;gt;=&#039;Language&#039;                          ; P&amp;lt;3,-1&amp;gt;=&#039;TB_LANGUAGE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;LEGAL.S*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Legal Status&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;TB_LEGAL_STATUS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;LESSEE.CONTACT*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Lessee Contact Permitted&#039;          ; P&amp;lt;3,-1&amp;gt;=&#039;TB_LESSEE_CONTACT_PERMIT_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;LESSOR.SUB*&#039;        ; P&amp;lt;2,-1&amp;gt;=&#039;Lessor Subsidiary&#039;                 ; P&amp;lt;3,-1&amp;gt;=&#039;SUBSIDIARY_ADDRESS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;LKE.POOL*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;Like Kind Exchange Pool&#039;           ; P&amp;lt;3,-1&amp;gt;=&#039;TB_LIKE_KIND_EXCHANGE_PO_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;LOCAL.SIC.CODE*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Local SIC Code&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;LOCAL_SIC_CODE_TBL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;LOCKBOX.PARAMS&#039;     ; P&amp;lt;2,-1&amp;gt;=&#039;Lockbox Parameters&#039;                ; P&amp;lt;3,-1&amp;gt;=&#039;LOCKBOX_PARAMETERS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;MILE.CAT*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;Mileage Category&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;TB_MILEAGE_CATEGORY_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;MISC.PARAM*&#039;        ; P&amp;lt;2,-1&amp;gt;=&#039;Miscellaneous Parameters&#039;          ; P&amp;lt;3,-1&amp;gt;=&#039;MISC_PARAM_DEFAULTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;MMR.ASSET.DE*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;MMR Asset (Inv. Interface)&#039;        ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;MMR.ASSET.RATE.DE*&#039; ; P&amp;lt;2,-1&amp;gt;=&#039;MMR Asset Rate (Inv. Interface)&#039;   ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;MMR.CHRG.DE*&#039;       ; P&amp;lt;2,-1&amp;gt;=&#039;MMR Charge (Inv. Interface)&#039;       ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;NJS.FLAG&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;NJS Flag&#039;                          ; P&amp;lt;3,-1&amp;gt;=&#039;NJS_FLAG_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;PAYMENT.STATUS*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Payment Status&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;TB_PAYMENT_STATUS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;PAYMENT.TYPE*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Payment Type&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;PYMT_TYPE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;PENDING.CODE*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Pending Code&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;PENDING_CODE_TBL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;POLICY.STATUS*&#039;     ; P&amp;lt;2,-1&amp;gt;=&#039;Policy Status&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;TB_POLICY_STATUS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;PROGRAM.CONTROL*&#039;   ; P&amp;lt;2,-1&amp;gt;=&#039;Program Control&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;TB_PROGRAM_CONTROL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;PUR.OPT*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Purchase Option&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;PURCHASE_OPTION_TABLE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;PURPOSE.LOAN*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Purpose Of Loan&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;TB_PURPOSE_OF_LOAN_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;PUT.TO*&#039;            ; P&amp;lt;2,-1&amp;gt;=&#039;Put To&#039;                            ; P&amp;lt;3,-1&amp;gt;=&#039;TB_PUT_TO_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;QUOTE.BUYOUT*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Quote Buyout&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;QUOTE_BUYOUT_TBL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RCPT*&#039;              ; P&amp;lt;2,-1&amp;gt;=&#039;Void Receipt Reason&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;TB_VOID_RECEIPT_REASON_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RECOURSE*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;Recourse&#039;                          ; P&amp;lt;3,-1&amp;gt;=&#039;TB_RECOURSE_CODE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RECOVERY.STATUS*&#039;   ; P&amp;lt;2,-1&amp;gt;=&#039;Recovery Status&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;TB_RECOVERY_STATUS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RELATIONSHIP*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Relationship&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;RELATIONSHIP_DATA_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;REM.PUR.OPTION*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Remarketing Purchase Option&#039;       ; P&amp;lt;3,-1&amp;gt;=&#039;TB_REMARKETING_PURCHASE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RENEWAL.OPTION*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Renewal Option&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;RENEWAL_OPTION_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;REPO.STATUS*&#039;       ; P&amp;lt;2,-1&amp;gt;=&#039;Repossession Status&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;REPOSSESSION_CODE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RESERVE*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Reserve Code&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;TB_RESERVE_CODE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RESIDUAL.GUAR*&#039;     ; P&amp;lt;2,-1&amp;gt;=&#039;Residual Guarantee&#039;                ; P&amp;lt;3,-1&amp;gt;=&#039;TB_RESIDUAL_GUARANTEE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RESIDUAL.OWNER*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Residual Owner&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;TB_RESIDUAL_OWNER_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RESIDUAL.SHARING*&#039;  ; P&amp;lt;2,-1&amp;gt;=&#039;Residual Sharing&#039;                  ; P&amp;lt;3,-1&amp;gt;=&#039;TB_RESIDUAL_SHARING_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RESTOCKING.FEE*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Restocking Fee Obligation&#039;         ; P&amp;lt;3,-1&amp;gt;=&#039;TB_RESTOCK_FEE_OBLIGATIO_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;RETURN.COSTS.PD*&#039;   ; P&amp;lt;2,-1&amp;gt;=&#039;Return Costs Paid&#039;                 ; P&amp;lt;3,-1&amp;gt;=&#039;TB_RETURN_COSTS_PAID_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;REVS.PT*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;REVS Plate Type&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;TB_REVS_PLATE_TYPE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;REVS.ST*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;REVS State&#039;                        ; P&amp;lt;3,-1&amp;gt;=&#039;TB_REVS_STATE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;SCAN.LINE.DE*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Scan Line (Inv. Interface)&#039;        ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;SCORE.DECISION*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Credit Score Decision&#039;             ; P&amp;lt;3,-1&amp;gt;=&#039;TB_CREDIT_SCORE_DECISION_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;SCORE.STATUS*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Credit Score Status&#039;               ; P&amp;lt;3,-1&amp;gt;=&#039;CREDIT_SCORE_STATUS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;SCORING.CODE*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Scoring Code&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;SCORING_CODE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;SEC.PARTY*&#039;         ; P&amp;lt;2,-1&amp;gt;=&#039;Secure Party&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;LESSOR_SEC_PARTY_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;SOURCE*&#039;            ; P&amp;lt;2,-1&amp;gt;=&#039;Source&#039;                            ; P&amp;lt;3,-1&amp;gt;=&#039;TB_SOURCE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;SPECIAL.INST*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Special Instructions&#039;              ; P&amp;lt;3,-1&amp;gt;=&#039;TB_SPECIAL_INSTRUCTIONS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;SPLIT.DE*&#039;          ; P&amp;lt;2,-1&amp;gt;=&#039;Invoice Interface Data Elements&#039;   ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;SSP&#039;                ; P&amp;lt;2,-1&amp;gt;=&#039;System Security&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;SC_SECURE_PARAM_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;UCC.STATE*&#039;         ; P&amp;lt;2,-1&amp;gt;=&#039;Filing State&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;FILING_STATE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;UCC.STATUS*&#039;        ; P&amp;lt;2,-1&amp;gt;=&#039;Filing Status&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;FILING_STATUS_TABLE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;UCC.TITLE.CODE*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Filing Code&#039;                       ; P&amp;lt;3,-1&amp;gt;=&#039;FILING_CODE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;UK.POOL*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;UK Pool&#039;                           ; P&amp;lt;3,-1&amp;gt;=&#039;UK_POOL_NUM_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;USG.ASSET.DE*&#039;      ; P&amp;lt;2,-1&amp;gt;=&#039;Usage Asset (Inv. Interface)&#039;      ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;USG.CHRG.DE*&#039;       ; P&amp;lt;2,-1&amp;gt;=&#039;Usage Charge (Inv. Interface)&#039;     ; P&amp;lt;3,-1&amp;gt;=&#039;INV_INT_DATA_ELEMENTS_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;VLMAKE*&#039;            ; P&amp;lt;2,-1&amp;gt;=&#039;Vehicle Make&#039;                      ; P&amp;lt;3,-1&amp;gt;=&#039;TB_VEHICLE_MAKE_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;VLMODEL*&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Vehicle Model&#039;                     ; P&amp;lt;3,-1&amp;gt;=&#039;TB_VEHICLE_MODEL_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;VLOPT*&#039;             ; P&amp;lt;2,-1&amp;gt;=&#039;Vehicle Option&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;TB_VEHICLE_OPTION_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;WAREHOUSE*&#039;         ; P&amp;lt;2,-1&amp;gt;=&#039;Warehouse Location&#039;                ; P&amp;lt;3,-1&amp;gt;=&#039;TB_WAREHOUSE_LOCATION_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;WHOLESALE.PLAN*&#039;    ; P&amp;lt;2,-1&amp;gt;=&#039;Wholesale Plan&#039;                    ; P&amp;lt;3,-1&amp;gt;=&#039;TB_WHOLESALE_PLAN_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;WL.FOLLOW-UP.CODE*&#039; ; P&amp;lt;2,-1&amp;gt;=&#039;Worklist Follow-Up Codes&#039;          ; P&amp;lt;3,-1&amp;gt;=&#039;WORKLIST_FOLLOW_UP_CODES_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=&#039;WP.PARAM&#039;           ; P&amp;lt;2,-1&amp;gt;=&#039;Word Processing&#039;                   ; P&amp;lt;3,-1&amp;gt;=&#039;WP_PARAM_NF&#039;&lt;br /&gt;
  P&amp;lt;1,-1&amp;gt;=STR(&#039;-&#039;, 18)         ; P&amp;lt;2,-1&amp;gt;=STR(&#039;-&#039;,33)                         ; P&amp;lt;3,-1&amp;gt;=STR(&#039;-&#039;,30)&lt;br /&gt;
  FOR F=1 TO DCOUNT(P&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    PRINT &#039;|&#039;:P&amp;lt;1,F&amp;gt;&#039;L#18&#039;:&#039;|&#039;:P&amp;lt;2,F&amp;gt;&#039;L#33&#039;:&#039;|&#039;:P&amp;lt;3,F&amp;gt;&#039;L#30&#039;:&#039;|&#039;&lt;br /&gt;
  NEXT F&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
BUILD.AC:&lt;br /&gt;
  * Check for a DICT request&lt;br /&gt;
  IF FIELD(ANS,&#039; &#039;,2)=&#039;DICT&#039; THEN&lt;br /&gt;
    DICT=FIELD(ANS,&#039; &#039;,3)&lt;br /&gt;
    OPEN &#039;DICT&#039;,DICT TO DVAR ELSE CRT &#039;Cannot open DICT&#039;:DICT ; RETURN&lt;br /&gt;
    SELECT DVAR&lt;br /&gt;
    ID.LIST=&#039;&#039;&lt;br /&gt;
    LOOP&lt;br /&gt;
      READNEXT ID ELSE EXIT&lt;br /&gt;
      READ R FROM DVAR, ID ELSE CONTINUE&lt;br /&gt;
      IF R&amp;lt;1&amp;gt;=&#039;D&#039; OR R&amp;lt;1&amp;gt;=&#039;I&#039; OR R&amp;lt;1&amp;gt;=&#039;V&#039; THEN&lt;br /&gt;
        ID.LIST&amp;lt;-1&amp;gt;=&#039;DICT-&#039;:DICT:&#039;_&#039;:ID&lt;br /&gt;
      END&lt;br /&gt;
    REPEAT&lt;br /&gt;
    GOSUB ADD.TO.AC&lt;br /&gt;
    RETURN&lt;br /&gt;
  END&lt;br /&gt;
  *&lt;br /&gt;
  * Build auto-complete list of VOC commands&lt;br /&gt;
  CLEARFILE AC&lt;br /&gt;
  L1=&#039;&#039; ; L2=&#039;&#039;&lt;br /&gt;
  *&lt;br /&gt;
  EXECUTE \SELECT VOC WITH F1 = &amp;quot;C&amp;quot; &amp;quot;V&amp;quot;\ RTNLIST L1&lt;br /&gt;
  ID.LIST=&#039;&#039;&lt;br /&gt;
  LOOP&lt;br /&gt;
    READNEXT ID FROM L1 ELSE EXIT&lt;br /&gt;
    READ R FROM VOC, ID ELSE CONTINUE&lt;br /&gt;
    ID.LIST&amp;lt;-1&amp;gt;=&#039;CMD_&#039;:ID&lt;br /&gt;
  REPEAT&lt;br /&gt;
  GOSUB ADD.TO.AC&lt;br /&gt;
  *&lt;br /&gt;
  * Build auto-complete list for filenames&lt;br /&gt;
  *&lt;br /&gt;
  EXECUTE \SELECT VOC WITH F1 = &amp;quot;F&amp;quot; &amp;quot;LF&amp;quot; &amp;quot;DIR&amp;quot; &amp;quot;LD&amp;quot; AND WITH @ID # &amp;quot;TMP]&amp;quot;\ RTNLIST L1&lt;br /&gt;
  ID.LIST=&#039;&#039;&lt;br /&gt;
  LOOP&lt;br /&gt;
    READNEXT ID FROM L1 ELSE EXIT&lt;br /&gt;
    READ R FROM VOC, ID ELSE CONTINUE&lt;br /&gt;
    ID.LIST&amp;lt;-1&amp;gt;=&#039;FILE_&#039;:ID&lt;br /&gt;
    IF R&amp;lt;1&amp;gt;=&#039;LF&#039; OR R&amp;lt;1&amp;gt;=&#039;LD&#039; THEN&lt;br /&gt;
      * Multi-level file or dir, dive deeper&lt;br /&gt;
      E=\SELECT DICT \:ID:\ WITH @ID = &amp;quot;@]&amp;quot; AND WITH F1 = &amp;quot;LF&amp;quot; &amp;quot;LD&amp;quot; USING DICT VOC\&lt;br /&gt;
      *CRT E&lt;br /&gt;
      EXECUTE E RTNLIST L2 CAPTURING DUMMY&lt;br /&gt;
      LOOP&lt;br /&gt;
        READNEXT ID2 FROM L2 ELSE EXIT&lt;br /&gt;
        ID2=ID:&#039;,&#039;:ID2[2,99]&lt;br /&gt;
        ID.LIST&amp;lt;-1&amp;gt;=&#039;FILE_&#039;:ID2&lt;br /&gt;
      REPEAT&lt;br /&gt;
    END&lt;br /&gt;
  REPEAT&lt;br /&gt;
  GOSUB ADD.TO.AC&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
ADD.TO.AC:&lt;br /&gt;
  NUM.ITEMS=DCOUNT(ID.LIST,@AM)&lt;br /&gt;
  CRT NUM.ITEMS:&#039; ITEMS&#039;&lt;br /&gt;
  FOR I=1 TO NUM.ITEMS&lt;br /&gt;
    ID=ID.LIST&amp;lt;I&amp;gt;&lt;br /&gt;
    L=LEN(ID)&lt;br /&gt;
    FOR C=1 TO LEN(ID)&lt;br /&gt;
      PRE=ID[1,C]&lt;br /&gt;
      READ NODE FROM AC, PRE ELSE NODE=&#039;&#039;&lt;br /&gt;
      * Now insert pointers to one level down&lt;br /&gt;
      PTR=ID[1,C+1]&lt;br /&gt;
      LOCATE PTR IN NODE&amp;lt;1&amp;gt; BY &#039;AL&#039; SETTING POS THEN&lt;br /&gt;
        LOCATE ID IN NODE&amp;lt;2,POS&amp;gt; BY &#039;AL&#039; SETTING POS2 ELSE NULL&lt;br /&gt;
        INS ID BEFORE NODE&amp;lt;2,POS, POS2&amp;gt;&lt;br /&gt;
      END ELSE&lt;br /&gt;
        INS PTR BEFORE NODE&amp;lt;1,POS&amp;gt;&lt;br /&gt;
        INS ID  BEFORE NODE&amp;lt;2,POS&amp;gt;&lt;br /&gt;
      END&lt;br /&gt;
      WRITE NODE ON AC, PRE&lt;br /&gt;
    NEXT C&lt;br /&gt;
  NEXT I&lt;br /&gt;
RETURN&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2642</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2642"/>
		<updated>2019-09-13T01:08:48Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2019-07-05 Resources for learning more about MV available at: [https://www.pickmultivalue.com/ www.pickmultivalue.com]&lt;br /&gt;
* 2019-02-14 Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01-09 [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2015-07-13 [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree]&lt;br /&gt;
* 2015-03-09 Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01-15 [http://www.zumasys.com/admin/zumasys-acquires-jbase-database/ Zumasys acquires jBase!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by Zumasys and community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Main_Page&amp;diff=2641</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Main_Page&amp;diff=2641"/>
		<updated>2019-09-13T01:06:03Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Reorder to put &amp;quot;stuff about the wiki&amp;quot; lower down the page, and add a link to mvdbms in the help section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
|title=PickWiki | Powered by Zumasys&lt;br /&gt;
|titlemode=replace&lt;br /&gt;
|description=The site is all about Pick/MultiValue databases and applications. PickWiki was created by Ian McGowan and is now managed by Zumasys.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the &amp;lt;big&amp;gt;&#039;&#039;&#039;PickWiki!&#039;&#039;&#039;&amp;lt;/big&amp;gt; This site is about [[MultiValuedDatabases| Multivalue Databases]]. Learn more about the evolution of the [[Pick Operating System]].&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
* 2019-07-05 Resources for learning more about MV available at: [https://www.pickmultivalue.com/ www.pickmultivalue.com]&lt;br /&gt;
* 2019-02-14 Apologies for the downtime, but the wiki is back up and several new features implemented - new registrations will require passing a Captcha, and edits/new pages will be moderated to prevent spam.  Once a user has successfully edited/added a page, they will be added to a group that is unmoderated.&lt;br /&gt;
* 2019-01-09 [http://www.zumasys.com/contest The $10,000 MultiValue Idea Contest]  is Open until the end of February 2019&lt;br /&gt;
* 2015-07-13 [http://www.zumasys.com/admin/zumasys-tincat-group-collaborate-to-update-the-multivalue-family-tree/ Zumasys &amp;amp; Tincat Group Collaborate to Update The MultiValue Family Tree]&lt;br /&gt;
* 2015-03-09 Management of pickwiki.com has been transitioned to [http://www.zumasys.com Zumasys] and the original UseMod Wiki platform has been migrated to MediaWiki&lt;br /&gt;
* 2015-01-15 [http://www.zumasys.com/admin/zumasys-acquires-jbase-database/ Zumasys acquires jBase!]&lt;br /&gt;
&lt;br /&gt;
== Some useful starting points ==&lt;br /&gt;
* [[Getting_Started|Getting Started]] with MultiValued Databases&lt;br /&gt;
* [[HistoryOfMV | Pick/MultiValue Turns 50 Years Old]]&lt;br /&gt;
* [[HowTos]] - Common issues and solutions, like creating web interfaces&lt;br /&gt;
* [[SourceCode| Source Code]] - Programming and technical articles&lt;br /&gt;
* [[InMemoriam| In Memoriam]] - Remembering those who are no longer with us&lt;br /&gt;
* [[MultiValuedDatabases#Licensees | Pick Licensees]] - List of Pick Licensees&lt;br /&gt;
* [[MultiValuedDatabases| MultiValued Databases]] - Describes the database and its history&lt;br /&gt;
&lt;br /&gt;
== Other resources==&lt;br /&gt;
* [[Blogs]] related to [[MultiValue]] software&lt;br /&gt;
* [[Community]] page includes links to [[employment]], [[UserGroups]] and forums to post questions&lt;br /&gt;
* [[Freeware]] - All free, mostly open source&lt;br /&gt;
* [[MultiValueConsultants| MultiValue Consultants]] - Need some help? Find the perfect person!&lt;br /&gt;
* [[MultiValueCompanies| MultiValue Companies]] - List of companies which use MultiValue databases&lt;br /&gt;
&lt;br /&gt;
== About PickWiki ==&lt;br /&gt;
This wiki runs on MediaWiki and is managed by Zumasys and community volunteers&lt;br /&gt;
* [[Special:Allpages| Index]] - All pages&lt;br /&gt;
* [[Special:RecentChanges| Recent Changes]]&lt;br /&gt;
* [[Special:ListUsers]] - As a registered user, you can create your own page and your updates will automatically link to it!&lt;br /&gt;
&lt;br /&gt;
== Help ==&lt;br /&gt;
* If you&#039;re having problems with the wiki, or a MultiValued system, https://groups.google.com/forum/#!forum/mvdbms is a good resource&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Help:Wiki_markup Text Formatting Rules]&lt;br /&gt;
* [http://www.mediawiki.org/wiki/Help:FAQ MediaWiki FAQ]&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=FLAVA&amp;diff=2640</id>
		<title>FLAVA</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=FLAVA&amp;diff=2640"/>
		<updated>2019-09-12T17:22:55Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Created page with &amp;quot;A utility that attempts to figure out the flavour of the current Pick environment.  Designed for use when writing portable code.  TODO: 1) test!, 2) add probes for more flavor...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A utility that attempts to figure out the flavour of the current Pick environment.  Designed for use when writing portable code.&lt;br /&gt;
&lt;br /&gt;
TODO: 1) test!, 2) add probes for more flavors, 3) some environments have different emulation modes - maybe return that as a &amp;quot;sub-flavor&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
Contributions welcome!  Please free to edit this page, or submit pull-requests at https://github.com/ianmcgowan/SCI.BP/blob/master/FLAVA&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
********************************************************************************&lt;br /&gt;
* Program: FLAVA&lt;br /&gt;
* Author : MCGOWJ01&lt;br /&gt;
* Created: 2019-09-11&lt;br /&gt;
* Updated: 2019-09-11&lt;br /&gt;
* Comment: Find DB flavo{u}r&lt;br /&gt;
********************************************************************************&lt;br /&gt;
*&lt;br /&gt;
* Probe for jBase, thanks to Andrew Cole &amp;lt;andrewcole50@gmail.com&amp;gt;&lt;br /&gt;
* SYSTEM(1021)&amp;lt;4&amp;gt;. When I run that on my system&lt;br /&gt;
* &amp;quot;Copyright (c) 2018 jBASE International. All rights reserved&amp;quot;.&lt;br /&gt;
*&lt;br /&gt;
X=SYSTEM(1021)&amp;lt;4&amp;gt;&lt;br /&gt;
IF INDEX(X,&#039;jBASE&#039;,1) THEN CRT &#039;jBASE&#039; ; STOP&lt;br /&gt;
*&lt;br /&gt;
* Probe for Unidata/Universe&lt;br /&gt;
* From: http://www.rsusers.com/cms/pages/wiki.wsp?page=112 (What&#039;s the min ver for this?)&lt;br /&gt;
*&lt;br /&gt;
X=SYSTEM(9010)&lt;br /&gt;
IF INDEX(X,&#039;UD&#039;,1) THEN CRT &#039;UD&#039; ; STOP&lt;br /&gt;
IF INDEX(X,&#039;UV&#039;,1) THEN CRT &#039;UV&#039; ; STOP&lt;br /&gt;
*&lt;br /&gt;
* Probe for D3/Cache&lt;br /&gt;
* https://www3.rocketsoftware.com/rocketd3/support/documentation/d3nt/103/refman/index.htm&lt;br /&gt;
* crt system(100)&lt;br /&gt;
* D3UNIX:RS6000;AIX;pick0:prod0;2;3;000047311000;6.0.0.m0;27 May 2001&lt;br /&gt;
*&lt;br /&gt;
X=SYSTEM(100)&lt;br /&gt;
IF INDEX(X,&#039;D3&#039;,1) THEN CRT &#039;D3&#039; ; STOP&lt;br /&gt;
IF INDEX(X,&#039;CACHE&#039;,1) THEN CRT &#039;CACHE&#039; ; STOP&lt;br /&gt;
*&lt;br /&gt;
* Probe for OpenQM - this is pretty weak sauce, do this last&lt;br /&gt;
*&lt;br /&gt;
X=SYSTEM(1012)&lt;br /&gt;
IF X # &#039;&#039; AND X # 0 THEN CRT &#039;QM&#039; ; STOP&lt;br /&gt;
*&lt;br /&gt;
* No matches, let&#039;s display all possible values&lt;br /&gt;
*&lt;br /&gt;
CRT &#039;No match, does anything in this list look good?&#039;&lt;br /&gt;
FOR F=1 TO 10000&lt;br /&gt;
  IF SYSTEM(F) # &amp;quot;&amp;quot; AND SYSTEM(F) # 0 THEN CRT F, SYSTEM(F)&lt;br /&gt;
NEXT F&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=BasicSource&amp;diff=2639</id>
		<title>BasicSource</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=BasicSource&amp;diff=2639"/>
		<updated>2019-09-12T17:16:45Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: Add link to FLAVA utility (soon to be a SUBR)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HomePage&amp;gt;&amp;gt;SourceCode&amp;gt;&amp;gt;[[BasicSource]]&lt;br /&gt;
&lt;br /&gt;
=== General Notes ===&lt;br /&gt;
* General format [[HintsAndTips]]&lt;br /&gt;
* Put &amp;lt;nowiki&amp;gt;&amp;lt;PRE&amp;gt;&amp;lt;/nowiki&amp;gt; around code sections to turn off wiki formatting for that section&lt;br /&gt;
* Watch out for trailing &amp;quot;\&amp;quot; at the end of a line - even within a &amp;lt;nowiki&amp;gt;&amp;lt;PRE&amp;gt;&amp;lt;/nowiki&amp;gt; block it appears to smush lines together&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Discussions about Basic programming ===&lt;br /&gt;
*[[LoopDebates|Loop Debates]] - a discussion of different ways to loop in Pick[[/Basic]] programs&lt;br /&gt;
*[[Sorting]] - An overview of the various sorts out there&lt;br /&gt;
*[[CodingStandards]] - Some modest proposals around Basic coding standards&lt;br /&gt;
*[[Date Conversion With ICONV]] - converting output date for internal storage&lt;br /&gt;
*[[Date Conversion With OCONV]] - converting internal date for output&lt;br /&gt;
*[[Hexadecimal Conversion]] - converting to/from hexadecimal&lt;br /&gt;
*[[RemovePerformance]] - a more efficient way to loop over a dynamic array&lt;br /&gt;
&lt;br /&gt;
=== General Utilities (Alphabetically) ===&lt;br /&gt;
*[[AMVdefine_AE]] - Alternate Editor utility to define associated multivalues for amvedit&lt;br /&gt;
*[[AMVedit_AE]] - Alternate Editor utility to edit associated multivalues&lt;br /&gt;
*[[ASORT]] - Sorts Associated Multivalues&lt;br /&gt;
*[[BarCode128]] - Print a 128 barcode in BASIC&lt;br /&gt;
*[[BFormat]] - A utility to format basic code&lt;br /&gt;
*[[BFind]] - A utility to find strings in selected file(s).&lt;br /&gt;
*[[BPTest]] - A utility to run BASIC code from the command line&lt;br /&gt;
*[[BROWSE.FOR.FILE]] - Subroutine which allows user to move up and down through DOS tree and pick a file, from Universe code&lt;br /&gt;
*[[Build.Inode.Xref]] - Builds the INODE.XREF file, run once in each account&lt;br /&gt;
*[[CallHTTP]] - sample code for [[CallHTTP]]&lt;br /&gt;
*[[CallHTTPWithSSL]] - an attempt to retrieve a simple web page over HTTPS using [[CallHTTP]] and SSL&lt;br /&gt;
*[[CAM_AE]] - Alternate Editor utility to convert PICK.VARIABLES to Camelcase&lt;br /&gt;
*[[Chead]] - &amp;quot;See header&amp;quot; QM utility to show information about compiled code.&lt;br /&gt;
*[[Checksum]] - Program to calculate the checksum of a given file item. It uses the original R83 method of doing so.&lt;br /&gt;
*[[Compare]] - To see the changes in two records - usually program code.&lt;br /&gt;
*[[ConvCase]] - To convert the case of items (usually programs)&lt;br /&gt;
*[[Cruise]] - Display entire contents of records, using DICT entries for labels and conversions&lt;br /&gt;
*[[CSEQ]] - To see part of a large directory file (useful for checking .csv files)&lt;br /&gt;
*[[CSV2ARRAY]] - Function to convert a CSV to a dynamic array (also can change columns to attributes)&lt;br /&gt;
*[[CSV2FIELDS]] - Another subroutine to convert a CSV string to a dynamic array&lt;br /&gt;
*[[CTRLFIC]] - To periodically check the Unidata files in level 1 overflow (from a list or just for given file) or level 2 using Unidata &amp;quot;guide&amp;quot; and &amp;quot;checkover&amp;quot; commands.&lt;br /&gt;
*[[DateUtility]] - utility to do various date conversions such as ISO8601 and RFC1123&lt;br /&gt;
*[[DumpSqlLdr]] - Dump fields to flat file for import into Oracle using sql*ldr&lt;br /&gt;
* [[DumpRecall]] - Dump a query to excel or other formats&lt;br /&gt;
* [[EM]] - A utility to enable editing of multiple MVdatabase records or individual ones in client-server Emacs in X(-windows).&lt;br /&gt;
* [[ENCRYPT64]] - sample code using Universe&#039;s ENCRYPT function.&lt;br /&gt;
*[[SORTDYNM1|Dynamic Array Sort]] Sort a multivalued dynamic array&lt;br /&gt;
*[[FieldInput]] - Generalised Input subroutine that handles various types of input in a somewhat intelligent manner.  EG passwords, dates, time, patterns, lists, and so on.  Using this can reduce your source code size quite a lot.&lt;br /&gt;
*[[FileInfo]] - [[UniVerse]] utility to show information about a file using FILEINFO()&lt;br /&gt;
*[[FileStatus]] - [[UniVerse]] utility to show information about a file using STATUS&lt;br /&gt;
*[[Find.Inode]] - A utility to locate filename of inode, using Pick Basic.&lt;br /&gt;
*[[FindUnusedAtt]] - A utility to find the null attributes in a file.  So you can USE them!&lt;br /&gt;
*[[FLAVA]] - A (hopefully) portable routine to figure out the flavour of Pick&lt;br /&gt;
* [[GET.REMOTE.IP]] - D3[[/Linux]] source to obtain IP address of client.&lt;br /&gt;
*[[GetFileInfo]] - A wrapper around the O[[/S]] fstat command, or a [[PerlVersionOfFstat]].  Returns information about a unix file in a convenient format.&lt;br /&gt;
*[[GetKey]] - Acts like keycode() in QM - returns a single character for any key pressed.&lt;br /&gt;
*[[GetLineStack]] - An input subroutine that allows editing with the arrow keys.  Works with vt100 and wyse50.&lt;br /&gt;
*[[GetNameList]] - PICK BASIC program to build list of names based on either EXACT or SOUNDEX principles. Uses &#039;*&#039; and &#039;...&#039; for first name likeness.&lt;br /&gt;
*[[GetOsInfo]] - UD program to get the O[[/S]] information (date/time/size/privileges) for items in a DIR type file&lt;br /&gt;
*[[Getptr]] - [[UniVerse]] version of GETPTR function in [[UniData]]&lt;br /&gt;
*[[HeapSort]] - Two routines to create a heap then return items from the heap in sorted order&lt;br /&gt;
*[[HelpForUniverse]] - Displays like the Unidata help because the Universe one splodges the screen when at the console in NT.&lt;br /&gt;
*[[HMAC]] - Sample Unidata / Universe Basic code to produce an HMAC-MD5 hash&lt;br /&gt;
*[[HollDump]] - Does a Hollerith (fixed column) style dump from a UV file into &amp;amp;HOLD&amp;amp;&lt;br /&gt;
*[[HollLoad]] - Reads a fixed-width file from &amp;amp;HOLD&amp;amp; into a UV file - and can handle multivalue fields.&lt;br /&gt;
*[[InputWait]] - Duplicates in Universe the INPUT...WAITING functionality available in Unidata&lt;br /&gt;
*[[IsoWeekNum]] - returns the ISO week number on being given an external format date&lt;br /&gt;
*[[KLIST]] - Utility for listing records in files with formatted m/vs and s/vs + date conversion with selection/search&lt;br /&gt;
*[[LFormat]] - A utility to print source code with line-up bars.&lt;br /&gt;
*[[LineEDitor]] - A version of [[UniData]]&#039;s AE with embedded full page editor, change and search history/redo capability, and lots of other good stuff.&lt;br /&gt;
*[[List.Path.Readu]] - Basic program to list.readu with pathnames instead.&lt;br /&gt;
*[[LOOP-ON]] - Replacement on Universe for the R83 verb LOOP-ON&lt;br /&gt;
*[[MAC_AE]] - Alternate Editor utility to convert Camelcase to PICK.VARIABLES&lt;br /&gt;
*[[MakeDict]] - Program to allow command line dictionary creation - works for [[UniVerse]] and [[QM]]&lt;br /&gt;
*[[MakeXml]] - Generates XML using standard dictionaries, particularly I-types.  It will also generate DTD, XSD, and XSL definitions.  Started in [[UniData]], mostly done in [[UniVerse]], and has also been done in QM from Ladybridge.&lt;br /&gt;
*[[MD5Hash]]  - Sample Unidata / Universe Basic code to produce an MD5 hash&lt;br /&gt;
*[[MenuProgram]] - A simple menu interpreter&lt;br /&gt;
*[[ParseXML]]  - Sample Unidata / Universe Basic code to parse an XML text file&lt;br /&gt;
*[[Pick.to.HTML]] - Example code of building a HTML table in Pick and then launching it through Accuterm&lt;br /&gt;
*[[Pivot]] - Quickly view totals and counts when looking at a new file&lt;br /&gt;
*[[PrePass]] - Duplicates the $DEFINE $IFDEF compiler stuff that Universe and Unidata have&lt;br /&gt;
*[[ProgramToListAlgorithms]] - Program to list algorithms that are stored in &amp;amp;PARTFILES&amp;amp;, VOC,  and the parts themselves.&lt;br /&gt;
*[[Purge.Bad.Chars]] - Remove chars from 0 to 31, and 128 to 250 from a user-supplied file&lt;br /&gt;
*[[QM.Sort.Item]] - Subroutine to use new QM SORT() mechanism to sort associated multivalues&lt;br /&gt;
*[[QuickSort]] - uniVerse BASIC implementation of the quick sort algorithm&lt;br /&gt;
*[[Resize.Stats]] - Checks all processes on system (HPUX 11.0 &amp;amp; Universe9.6) for resize activity and displays progress and estimated completions. Great for determining when phantoms are expected to finish.&lt;br /&gt;
*[[ReturnSourceCode]] - Reads the GLOBAL.CATDIR opcode item on Universe, and extracts the source path off it&#039;s end&lt;br /&gt;
*[[Row2Col]] - transpose a variable&#039;s &amp;quot;rows&amp;quot; (fields) into &amp;quot;columns&amp;quot; (values), and back again.&lt;br /&gt;
*[[Row2Col II]] - An alternative version to transpose an array&lt;br /&gt;
*[[SBProcessSearch]] - Search for a string in SB+ process file with a simple list output.&lt;br /&gt;
*[[SCI.XLS.RECALL]] - Dump a flat delimited file (produced with TO DELIM perhaps) to SpreadsheetML XML format&lt;br /&gt;
*[[SCI.XLSX.RECALL]] - Dump a flat delimited file to Open XML native Excel XLSX format&lt;br /&gt;
*[[ShellSort|Shell sort]] - a sort that uses Donald Shell&#039;s algorithm&lt;br /&gt;
*[[ShowLocks]] - Universe utility to show locks by name (requires up to date STAT.FILE)&lt;br /&gt;
*[[Sudoku]] - To play a sudoku game&lt;br /&gt;
*[[StarDate]] - a function for converting from timestamp to stardate&lt;br /&gt;
*[[SvnWrapper]] - Wrapper for Linux &#039;svn&#039; command for [[UniVerse]]; with &#039;release&#039; format support.&lt;br /&gt;
*[[TclStack]] - a TCL stacker/development environment.  Works better with [[GetLineStack]], but not required.&lt;br /&gt;
*[[TCL.II]] - pre-processes @sentence, parsing TCL.II components for you to handle later&lt;br /&gt;
*[[Trace]] - A utility that allows you to trace from a Proc to a Verb to a Basic program, interactive.&lt;br /&gt;
*[[TreeTraversal]] - Finding the ultimate parent or all children of a particular node&lt;br /&gt;
*[[Try]] - Another utility to run BASIC code from the command line.&lt;br /&gt;
*[[UdtOra]] - A program to call a perl script to run sql statements and parse the resultset&lt;br /&gt;
*[[UdtService]] - A program that is a phantom service to spawn other Udt phantoms&lt;br /&gt;
*[[URLEncode]] - A function to URL encode any text.&lt;br /&gt;
*[[UV.EM]] - A utility based upon UV.VI that works with Emacs (see also Emacs Lisp code page).&lt;br /&gt;
*[[WLISTU]] - Allows sorting the LISTU output by Date by Time, or also by PID&lt;br /&gt;
*[[XMLOUT|XML Output Utility]] - Extract an Unidata file in XML format using or not dictionary, with criteria of selection or not.&lt;br /&gt;
&lt;br /&gt;
=== Special Purpose Utilities ===&lt;br /&gt;
*[https://bitbucket.org/slestak/u2-tools uuidgen] - Unibasic wrapper around python UUID module.  &lt;br /&gt;
*[[uvcron]] - C program to allow cron to execute Universe jobs.&lt;br /&gt;
*[[InfoLease]] utilities, programs of interest only to customers of http://www.idsgrp.com (maybe :-)&lt;br /&gt;
*[[Datatel]] utilities, specific to users of Datatel&#039;s Benefactor and Colleague apps&lt;br /&gt;
*[[CedarvilleDownload]], DOWNLOAD is a utility that creates extracts from U2 in a variety of formats&lt;br /&gt;
&lt;br /&gt;
=== Source Code Repositories ===&lt;br /&gt;
* https://bitbucket.org/slestak/u2-tools (Steve Romanow)&lt;br /&gt;
* https://bitbucket.org/foss4mv ([[FOSS4MV]])&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=Talk:PickDataStructure&amp;diff=2638</id>
		<title>Talk:PickDataStructure</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=Talk:PickDataStructure&amp;diff=2638"/>
		<updated>2019-07-09T22:37:24Z</updated>

		<summary type="html">&lt;p&gt;IanMcGowan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I don&#039;t think it&#039;s correct any more to say that a Pick system cannot contain non-ascii text.  Unidata for example can be used for foreign languages by using language groups, and Universe has something similar: https://docs.rocketsoftware.com/nxt/gateway.dll/RKBnew20/unidata/previous%20versions/v7.2/unidata_internationalrefguide_v72.pdf.  It&#039;s probably worth a larger discussion about Internationalization, perhaps on its own page?  [[User:IanMcGowan|IanMcGowan]] ([[User talk:IanMcGowan|talk]]) 22:37, 9 July 2019 (UTC)&lt;/div&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
</feed>