<?xml version='1.0' encoding='ISO-8859-1' standalone='no'?>
<!DOCTYPE interface-description SYSTEM 'file:///usr/pkgsrc/lang/oo2c/work.macaroon/oo2c_32-2.0.11/rsrc/OOC/xml/interface-description.dtd'>
<interface-description name='Object' id=''>
  <oberon-doc>
    <summary>This module provides the definitions for a basic object type used in most of the ADT library, and the implementation of the predefined type <code>STRING</code>.</summary>
    <p pad-after='yes' no-indent='yes'>This module provides the definitions for a basic object type used in most of the ADT library, and the implementation of the predefined type <code>STRING</code>.</p>
    <p pad-after='yes' no-indent='no'>Note: This module is a construction site.  New type definitions and features are added on demand.  If it is not used, it has no place here.</p>
  </oberon-doc>
  <type-decl name='Hash' id='Hash' export='yes'>
    <oberon-doc>
      <summary>The integer type used to store hash values.</summary>
      <p pad-after='yes' no-indent='yes'>The integer type used to store hash values.</p>
    </oberon-doc>
    <type>
      <type-name module='#predef' name='LONGINT'/>
    </type>
  </type-decl>
  <type-decl name='ObjectArray' id='ObjectArray' export='yes'>
    <type>
      <array>
        <element-type>
          <type-name name='E' href='#ObjectArray.E'/>
        </element-type>
      </array>
    </type>
    <type-parameters>
      <type-decl name='E' id='ObjectArray.E' export='no'>
        <type>
          <type-name name='Object' href='#Object'/>
        </type>
      </type-decl>
    </type-parameters>
  </type-decl>
  <type-decl name='ObjectArrayPtr' id='ObjectArrayPtr' export='yes'>
    <type>
      <pointer>
        <pointer-base>
          <qualified-type>
            <type>
              <type-name name='ObjectArray' href='#ObjectArray'/>
            </type>
            <type-arguments>
              <type-name name='E' href='#ObjectArrayPtr.E'/>
            </type-arguments>
          </qualified-type>
        </pointer-base>
      </pointer>
    </type>
    <type-parameters>
      <type-decl name='E' id='ObjectArrayPtr.E' export='no'>
        <type>
          <type-name name='Object' href='#Object'/>
        </type>
      </type-decl>
    </type-parameters>
  </type-decl>
  <const-decl name='surrogateLow' id='surrogateLow' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Smallest code of the surrogate area, and the beginning of the low surrogate area.</summary>
      <p pad-after='yes' no-indent='yes'>Smallest code of the surrogate area, and the beginning of the low surrogate area.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='surrogateHigh' id='surrogateHigh' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Beginning of the high surrogate area.</summary>
      <p pad-after='yes' no-indent='yes'>Beginning of the high surrogate area.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='surrogateEnd' id='surrogateEnd' export='yes' value='unknown'>
    <oberon-doc>
      <summary>First code <emph>after</emph> the surrogate area.</summary>
      <p pad-after='yes' no-indent='yes'>First code <emph>after</emph> the surrogate area.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='surrogateLimit' id='surrogateLimit' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Starting with this code point, a Unicode character is mapped onto two 16-bit values in UTF-16.</summary>
      <p pad-after='yes' no-indent='yes'>Starting with this code point, a Unicode character is mapped onto two 16-bit values in UTF-16.</p>
    </oberon-doc>
  </const-decl>
  <type-decl name='StringArray' id='StringArray' export='yes'>
    <type>
      <array>
        <element-type>
          <type-name name='String' href='#String'/>
        </element-type>
      </array>
    </type>
  </type-decl>
  <type-decl name='StringArrayPtr' id='StringArrayPtr' export='yes'>
    <type>
      <pointer>
        <pointer-base>
          <type-name name='StringArray' href='#StringArray'/>
        </pointer-base>
      </pointer>
    </type>
  </type-decl>
  <type-decl name='CharsLatin1' id='CharsLatin1' export='yes'>
    <oberon-doc>
      <summary>Note: The elements of this type should be considered read-only in importing modules, similar to read-only exported record fields.</summary>
      <p pad-after='yes' no-indent='yes'>Note: The elements of this type should be considered read-only in importing modules, similar to read-only exported record fields.</p>
    </oberon-doc>
    <type>
      <pointer>
        <pointer-base>
          <array>
            <element-type>
              <type-name module='#predef' name='CHAR'/>
            </element-type>
          </array>
        </pointer-base>
      </pointer>
    </type>
  </type-decl>
  <type-decl name='CharsUTF16' id='CharsUTF16' export='yes'>
    <oberon-doc>
      <summary>Note: The elements of this type should be considered read-only in importing modules, similar to read-only exported record fields.</summary>
      <p pad-after='yes' no-indent='yes'>Note: The elements of this type should be considered read-only in importing modules, similar to read-only exported record fields.</p>
    </oberon-doc>
    <type>
      <pointer>
        <pointer-base>
          <array>
            <element-type>
              <type-name module='#predef' name='LONGCHAR'/>
            </element-type>
          </array>
        </pointer-base>
      </pointer>
    </type>
  </type-decl>
  <var-decl name='emptyString' id='emptyString' export='read-only'>
    <oberon-doc>
      <summary>Initialized with an instance of <oberon-type href='#String8'>String8</oberon-type> holding the empty string.</summary>
      <p pad-after='yes' no-indent='yes'>Initialized with an instance of <oberon-type href='#String8'>String8</oberon-type> holding the empty string.</p>
    </oberon-doc>
    <type>
      <type-name name='String' href='#String'/>
    </type>
  </var-decl>
  <import-decl name='-RT0' id='-RT0' export='no' module='RT0'/>
  <class name='Object'>
    <type-decl name='Object' id='Object' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ObjectDesc' href='#ObjectDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ObjectDesc' id='ObjectDesc' export='yes'>
      <oberon-doc>
        <summary>This class is the common base type of (almost) all classes defined in this module and the ADT library.</summary>
        <p pad-after='yes' no-indent='yes'>This class is the common base type of (almost) all classes defined in this module and the ADT library.  It provides the methods <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> and <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc>.</p>
        <p pad-after='yes' no-indent='no'>It is an abstract class without any state of its own.  As such, it has no initialization procedure or cleanup method.</p>
        <p pad-after='yes' no-indent='no'>String constants are assignment compatbile with variables of type <oberon-type href='#Object'>Object</oberon-type>.  Such an assignment automatically converts the constant into an instance of <oberon-type href='#String'>String</oberon-type>.  That is, in an assignment, for a procedure argument passed to a value parameter, and as a function result, a string constant can be used instead of a <oberon-type href='#String'>String</oberon-type>.  The string object is created once, as part of the module's initialization code, <emph>not</emph> each time its surrounding code is evaluated.</p>
      </oberon-doc>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='ToString' id='ObjectDesc.ToString' export='yes'>
      <oberon-doc>
        <summary>Returns a string representation of the object.</summary>
        <p pad-after='yes' no-indent='yes'>Returns a string representation of the object.  Typically, the string is some form of <left-quote/>natural<right-quote/> representation of the value.  For complex objects, it should describe the type and essential attributes of the object.  The exact format of the returned value is intentionally left vague.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='x' id='ObjectDesc.ToString.x' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='Equals' id='ObjectDesc.Equals' export='yes'>
      <oberon-doc>
        <summary>Indicates whether some other object is "equal to" this one.</summary>
        <p pad-after='yes' no-indent='yes'>Indicates whether some other object is "equal to" this one.</p>
        <p pad-after='yes' no-indent='no'>The <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method implements an equivalence relation:</p>
        <itemize pad-after='yes'>
          <itemize-mark><bullet/></itemize-mark>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is reflexive: for any reference value <samp>x</samp>, <samp>x.Equals(x)</samp> should return <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is symmetric: for any reference values <samp>x</samp> and <samp>y</samp>, <samp>x.Equals(y)</samp> should return <code>TRUE</code> if and only if <samp>y.Equals(x)</samp> returns <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is transitive: for any reference values <samp>x</samp>, <samp>y</samp>, and <samp>z</samp>, if <samp>x.Equals(y)</samp> returns <code>TRUE</code> and <samp>y.Equals(z)</samp> returns <code>TRUE</code>, then <samp>x.Equals(z)</samp> should return <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is consistent: for any reference values <samp>x</samp> and <samp>y</samp>, multiple invocations of <samp>x.Equals(y)</samp> consistently return <code>TRUE</code> or consistently return <code>FALSE</code>, provided no information used in equals comparisons on the object is modified.</p>
          </item>
          <item pad-after='no'>
            <p pad-after='no' no-indent='yes'>For any non-<code>NIL</code> reference value <samp>x</samp>, <samp>x.Equals(NIL)</samp> should return <code>FALSE</code>.</p>
          </item>
        </itemize>
        <p pad-after='yes' no-indent='no'>The <samp>Equals</samp> method for class <oberon-type href='#Object'>Object</oberon-type> implements the most discriminating possible equivalence relation on objects; that is, for any reference values <samp>x</samp> and <samp>y</samp>, this method returns <code>TRUE</code> if and only if <samp>x</samp> and <samp>y</samp> refer to the same object (<samp>x=y</samp> has the value <code>TRUE</code>).</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='x' id='ObjectDesc.Equals.x' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='ObjectDesc.Equals.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='HashCode' id='ObjectDesc.HashCode' export='yes'>
      <oberon-doc>
        <summary>Returns a hash code value for the object.</summary>
        <p pad-after='yes' no-indent='yes'>Returns a hash code value for the object.  This method is supported for the benefit of dictionaries such as those provided by <oberon-module href='ADT:Dictionary#'>ADT:Dictionary</oberon-module>..</p>
        <p pad-after='yes' no-indent='no'>The general contract of <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> is:</p>
        <itemize pad-after='yes'>
          <itemize-mark><bullet/></itemize-mark>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>Whenever it is invoked on the same object more than once during an execution of an application, the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.  This integer need not remain consistent from one execution of an application to another execution of the same application.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>If two objects are equal according to the <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method, then calling the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method on each of the two objects must produce the same integer result.</p>
          </item>
          <item pad-after='no'>
            <p pad-after='no' no-indent='yes'>It is <emph>not</emph> required that if two objects are unequal according to the <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method, then calling the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method on each of the two objects must produce distinct integer results.  However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of dictionaries.</p>
          </item>
        </itemize>
        <p pad-after='yes' no-indent='no'>As much as is reasonably practical, the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method defined by class <oberon-type href='#Object'>Object</oberon-type> does return distinct integers for distinct objects.  (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required.)</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='x' id='ObjectDesc.HashCode.x' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='Hash'/>
        </result-type>
      </formal-parameters>
    </procedure>
  </class>
  <class name='String'>
    <type-decl name='String' id='String' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='StringDesc' href='#StringDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='StringDesc' id='StringDesc' export='no'>
      <type>
        <record>
          <field-decl name='length' id='StringDesc.length' export='read-only'>
            <oberon-doc>
              <summary>Number of words points in the sequence.</summary>
              <p pad-after='yes' no-indent='yes'>Number of words points in the sequence.  For an instance of <oberon-type href='#String8'>String8</oberon-type>, this is the number of characters in the string.  For <oberon-type href='#String16'>String16</oberon-type>, it is the number of 16-bit words in the sequence.  This number may differ from the number of characters in the presence of surrogate pairs.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='LONGINT'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='NewUTF16' id='NewUTF16' export='yes'>
      <oberon-doc>
        <summary>Create a string value from <oberon-param href='#NewUTF16.str'>str</oberon-param> without any translation.</summary>
        <p pad-after='yes' no-indent='yes'>Create a string value from <oberon-param href='#NewUTF16.str'>str</oberon-param> without any translation.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'>The characters in <oberon-param href='#NewUTF16.str'>str</oberon-param> are Unicode 3.1 code points outside the surrogate areas.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='str' id='NewUTF16.str' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='LONGCHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='NewUTF16Region' id='NewUTF16Region' export='yes'>
      <oberon-doc>
        <summary>Create a string value from <samp>str[start, end-1]</samp> without any translation.</summary>
        <p pad-after='yes' no-indent='yes'>Create a string value from <samp>str[start, end-1]</samp> without any translation.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#NewUTF16Region.start'>start</oberon-param> &lt;= <oberon-param href='#NewUTF16Region.end'>end</oberon-param> &lt;= LEN(<oberon-param href='#NewUTF16Region.str'>str</oberon-param>)</samp>.  The characters in <oberon-param href='#NewUTF16Region.str'>str</oberon-param> are Unicode 3.1 code points outside the surrogate areas.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='str' id='NewUTF16Region.str' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='LONGCHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <parameter-decl name='start' id='NewUTF16Region.start' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='end' id='NewUTF16Region.end' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='NewUTF16Char' id='NewUTF16Char' export='yes'>
      <oberon-doc>
        <summary>Create a string value of length 1 from <samp>ch</samp> without any translation.</summary>
        <p pad-after='yes' no-indent='yes'>Create a string value of length 1 from <samp>ch</samp> without any translation.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#NewUTF16Char.ch'>ch</oberon-param> is a Unicode 3.1 code point outside the surrogate areas.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='ch' id='NewUTF16Char.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGCHAR'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='NewUCS4Char' id='NewUCS4Char' export='yes'>
      <oberon-doc>
        <summary>Create a string value from <oberon-param href='#NewUCS4Char.ch'>ch</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Create a string value from <oberon-param href='#NewUCS4Char.ch'>ch</oberon-param>.  The length of the string instance is 2 if <samp><oberon-param href='#NewUCS4Char.ch'>ch</oberon-param> &gt;= <oberon-const href='#surrogateLimit'>surrogateLimit</oberon-const></samp>, and 1 otherwise.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#NewUCS4Char.ch'>ch</oberon-param> is a Unicode code point.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='ch' id='NewUCS4Char.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='UCS4CHAR'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='NewUCS4Region' id='NewUCS4Region' export='yes'>
      <oberon-doc>
        <summary>Create a string value from <samp>str[start, end]</samp> without any translation.</summary>
        <p pad-after='yes' no-indent='yes'>Create a string value from <samp>str[start, end]</samp> without any translation.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#NewUCS4Region.start'>start</oberon-param> &lt;= <oberon-param href='#NewUCS4Region.end'>end</oberon-param> &lt;= LEN(<oberon-param href='#NewUCS4Region.str'>str</oberon-param>)</samp>.  All characters are Unicode 3.1 code points outside the surrogate areas.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='str' id='NewUCS4Region.str' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='UCS4CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <parameter-decl name='start' id='NewUCS4Region.start' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='end' id='NewUCS4Region.end' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='NewUCS4' id='NewUCS4' export='yes'>
      <oberon-doc>
        <summary>Create a string value from <oberon-param href='#NewUCS4.str'>str</oberon-param> without any translation.</summary>
        <p pad-after='yes' no-indent='yes'>Create a string value from <oberon-param href='#NewUCS4.str'>str</oberon-param> without any translation.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'>The characters in <oberon-param href='#NewUCS4.str'>str</oberon-param> are Unicode 3.1 code points outside the surrogate areas.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='str' id='NewUCS4.str' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='UCS4CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='Concat2' id='Concat2' export='yes'>
      <oberon-doc>
        <summary>Concatenates two strings.</summary>
        <p pad-after='yes' no-indent='yes'>Concatenates two strings.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'>Neither <oberon-param href='#Concat2.s1'>s1</oberon-param> nor <oberon-param href='#Concat2.s2'>s2</oberon-param> is <code>NIL</code>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='s1' id='Concat2.s1' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <parameter-decl name='s2' id='Concat2.s2' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='Concat' id='StringDesc.Concat' export='yes'>
      <oberon-doc>
        <summary>Concatenates strings <oberon-param href='#StringDesc.Concat.s'>s</oberon-param> and <oberon-param href='#StringDesc.Concat.t'>t</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Concatenates strings <oberon-param href='#StringDesc.Concat.s'>s</oberon-param> and <oberon-param href='#StringDesc.Concat.t'>t</oberon-param>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#StringDesc.Concat.t'>t</oberon-param> is not <code>NIL</code>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.Concat.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='t' id='StringDesc.Concat.t' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ToString' id='StringDesc.ToString' export='yes'>
      <oberon-doc>
        <summary>Identity operation returning <oberon-param href='#StringDesc.ToString.s'>s</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Identity operation returning <oberon-param href='#StringDesc.ToString.s'>s</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.ToString.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='ToString' class='Object' href='#ObjectDesc.ToString'/>
    </procedure>
    <procedure name='ToString8' id='StringDesc.ToString8' export='yes'>
      <oberon-doc>
        <summary>Identity operation returning <oberon-param href='#StringDesc.ToString8.s'>s</oberon-param> if all characters are in the range of <oberon-type href='#String8'>String8</oberon-type>.</summary>
        <p pad-after='yes' no-indent='yes'>Identity operation returning <oberon-param href='#StringDesc.ToString8.s'>s</oberon-param> if all characters are in the range of <oberon-type href='#String8'>String8</oberon-type>.  Otherwise, characters outside this range are substituted with <oberon-param href='#StringDesc.ToString8.replace'>replace</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.ToString8.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='replace' id='StringDesc.ToString8.replace' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='CHAR'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String8' href='#String8'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ToString16' id='StringDesc.ToString16' export='yes'>
      <oberon-doc>
        <summary>Identity operation returning <oberon-param href='#StringDesc.ToString16.s'>s</oberon-param> as an instance of <oberon-type href='#String16'>String16</oberon-type>.</summary>
        <p pad-after='yes' no-indent='yes'>Identity operation returning <oberon-param href='#StringDesc.ToString16.s'>s</oberon-param> as an instance of <oberon-type href='#String16'>String16</oberon-type>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.ToString16.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='String16' href='#String16'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='Equals' id='StringDesc.Equals' export='yes'>
      <doc-inherited-from module='Object' name='Equals' class='Object' href='#ObjectDesc.Equals'/>
      <oberon-doc>
        <summary>Indicates whether some other object is "equal to" this one.</summary>
        <p pad-after='yes' no-indent='yes'>Indicates whether some other object is "equal to" this one.</p>
        <p pad-after='yes' no-indent='no'>The <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method implements an equivalence relation:</p>
        <itemize pad-after='yes'>
          <itemize-mark><bullet/></itemize-mark>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is reflexive: for any reference value <samp>x</samp>, <samp>x.Equals(x)</samp> should return <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is symmetric: for any reference values <samp>x</samp> and <samp>y</samp>, <samp>x.Equals(y)</samp> should return <code>TRUE</code> if and only if <samp>y.Equals(x)</samp> returns <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is transitive: for any reference values <samp>x</samp>, <samp>y</samp>, and <samp>z</samp>, if <samp>x.Equals(y)</samp> returns <code>TRUE</code> and <samp>y.Equals(z)</samp> returns <code>TRUE</code>, then <samp>x.Equals(z)</samp> should return <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is consistent: for any reference values <samp>x</samp> and <samp>y</samp>, multiple invocations of <samp>x.Equals(y)</samp> consistently return <code>TRUE</code> or consistently return <code>FALSE</code>, provided no information used in equals comparisons on the object is modified.</p>
          </item>
          <item pad-after='no'>
            <p pad-after='no' no-indent='yes'>For any non-<code>NIL</code> reference value <samp>x</samp>, <samp>x.Equals(NIL)</samp> should return <code>FALSE</code>.</p>
          </item>
        </itemize>
        <p pad-after='yes' no-indent='no'>The <samp>Equals</samp> method for class <oberon-type href='#Object'>Object</oberon-type> implements the most discriminating possible equivalence relation on objects; that is, for any reference values <samp>x</samp> and <samp>y</samp>, this method returns <code>TRUE</code> if and only if <samp>x</samp> and <samp>y</samp> refer to the same object (<samp>x=y</samp> has the value <code>TRUE</code>).</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.Equals.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='StringDesc.Equals.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='Equals' class='Object' href='#ObjectDesc.Equals'/>
    </procedure>
    <procedure name='EqualsIgnoreCase' id='StringDesc.EqualsIgnoreCase' export='yes'>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.EqualsIgnoreCase.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='StringDesc.EqualsIgnoreCase.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='Compare' id='StringDesc.Compare' export='yes'>
      <oberon-doc>
        <summary>Compares the two strings <oberon-param href='#StringDesc.Compare.s'>s</oberon-param> and <oberon-param href='#StringDesc.Compare.y'>y</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Compares the two strings <oberon-param href='#StringDesc.Compare.s'>s</oberon-param> and <oberon-param href='#StringDesc.Compare.y'>y</oberon-param>.  The sign of the result signals if <oberon-param href='#StringDesc.Compare.s'>s</oberon-param> is less than, equal to, or greater than <oberon-param href='#StringDesc.Compare.y'>y</oberon-param>:</p>
        <table pad-after='yes'>
          <table-row pad-after='yes'>
            <table-first-column pad-after='no'><asis><oberon-param href='#StringDesc.Compare.s'>s</oberon-param> &lt; <oberon-param href='#StringDesc.Compare.y'>y</oberon-param></asis></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'><result/> &lt; 0</p>
            </item>
          </table-row>
          <table-row pad-after='yes'>
            <table-first-column pad-after='no'><asis><oberon-param href='#StringDesc.Compare.s'>s</oberon-param> = <oberon-param href='#StringDesc.Compare.y'>y</oberon-param></asis></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'><result/> &gt; 0</p>
            </item>
          </table-row>
          <table-row pad-after='no'>
            <table-first-column pad-after='no'><asis><oberon-param href='#StringDesc.Compare.s'>s</oberon-param> &gt; <oberon-param href='#StringDesc.Compare.y'>y</oberon-param></asis></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'><result/> &gt; 0</p>
            </item>
          </table-row>
        </table>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#StringDesc.Compare.y'>y</oberon-param> is not <code>NIL</code>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.Compare.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='StringDesc.Compare.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='HashCode' id='StringDesc.HashCode' export='yes'>
      <doc-inherited-from module='Object' name='HashCode' class='Object' href='#ObjectDesc.HashCode'/>
      <oberon-doc>
        <summary>Returns a hash code value for the object.</summary>
        <p pad-after='yes' no-indent='yes'>Returns a hash code value for the object.  This method is supported for the benefit of dictionaries such as those provided by <oberon-module href='ADT:Dictionary#'>ADT:Dictionary</oberon-module>..</p>
        <p pad-after='yes' no-indent='no'>The general contract of <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> is:</p>
        <itemize pad-after='yes'>
          <itemize-mark><bullet/></itemize-mark>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>Whenever it is invoked on the same object more than once during an execution of an application, the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.  This integer need not remain consistent from one execution of an application to another execution of the same application.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>If two objects are equal according to the <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method, then calling the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method on each of the two objects must produce the same integer result.</p>
          </item>
          <item pad-after='no'>
            <p pad-after='no' no-indent='yes'>It is <emph>not</emph> required that if two objects are unequal according to the <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method, then calling the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method on each of the two objects must produce distinct integer results.  However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of dictionaries.</p>
          </item>
        </itemize>
        <p pad-after='yes' no-indent='no'>As much as is reasonably practical, the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method defined by class <oberon-type href='#Object'>Object</oberon-type> does return distinct integers for distinct objects.  (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required.)</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.HashCode.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='Hash'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='HashCode' class='Object' href='#ObjectDesc.HashCode'/>
    </procedure>
    <procedure name='CharAt' id='StringDesc.CharAt' export='yes'>
      <oberon-doc>
        <summary>Return the character at position <oberon-param href='#StringDesc.CharAt.index'>index</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the character at position <oberon-param href='#StringDesc.CharAt.index'>index</oberon-param>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#StringDesc.CharAt.index'>index</oberon-param> &lt; <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.CharAt.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='index' id='StringDesc.CharAt.index' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='UCS4CHAR'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='NextChar' id='StringDesc.NextChar' export='yes'>
      <oberon-doc>
        <summary>Return the character at position <oberon-param href='#StringDesc.NextChar.index'>index</oberon-param> and increment <oberon-param href='#StringDesc.NextChar.index'>index</oberon-param> to point to the next character in the string.</summary>
        <p pad-after='yes' no-indent='yes'>Return the character at position <oberon-param href='#StringDesc.NextChar.index'>index</oberon-param> and increment <oberon-param href='#StringDesc.NextChar.index'>index</oberon-param> to point to the next character in the string.  If <oberon-param href='#StringDesc.NextChar.index'>index</oberon-param> equals the length of the string, then result is <samp>0X</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#StringDesc.NextChar.index'>index</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.NextChar.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='index' id='StringDesc.NextChar.index' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='UCS4CHAR'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='Substring' id='StringDesc.Substring' export='yes'>
      <oberon-doc>
        <summary>Return the substring of <oberon-param href='#StringDesc.Substring.s'>s</oberon-param> starting at <oberon-param href='#StringDesc.Substring.start'>start</oberon-param> (inclusive) and ending at <oberon-param href='#StringDesc.Substring.end'>end</oberon-param> (exclusive).</summary>
        <p pad-after='yes' no-indent='yes'>Return the substring of <oberon-param href='#StringDesc.Substring.s'>s</oberon-param> starting at <oberon-param href='#StringDesc.Substring.start'>start</oberon-param> (inclusive) and ending at <oberon-param href='#StringDesc.Substring.end'>end</oberon-param> (exclusive).  The length of the result is <samp>end-start</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#StringDesc.Substring.start'>start</oberon-param> &lt;= <oberon-param href='#StringDesc.Substring.end'>end</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.Substring.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='start' id='StringDesc.Substring.start' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='end' id='StringDesc.Substring.end' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='Trim' id='StringDesc.Trim' export='yes'>
      <oberon-doc>
        <summary>Return the substring beginning with the first character of <oberon-param href='#StringDesc.Trim.s'>s</oberon-param> and ending with the last character of <oberon-param href='#StringDesc.Trim.s'>s</oberon-param> with a code greater than space (<samp>20X</samp>).</summary>
        <p pad-after='yes' no-indent='yes'>Return the substring beginning with the first character of <oberon-param href='#StringDesc.Trim.s'>s</oberon-param> and ending with the last character of <oberon-param href='#StringDesc.Trim.s'>s</oberon-param> with a code greater than space (<samp>20X</samp>).  If <oberon-param href='#StringDesc.Trim.s'>s</oberon-param> contains no such characters, then result is the empty string.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.Trim.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='String' href='#String'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='IndexOf' id='StringDesc.IndexOf' export='yes'>
      <oberon-doc>
        <summary>Return the index of the first character matching <oberon-param href='#StringDesc.IndexOf.char'>char</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the index of the first character matching <oberon-param href='#StringDesc.IndexOf.char'>char</oberon-param>.  Search starts at <oberon-param href='#StringDesc.IndexOf.pos'>pos</oberon-param> and progresses to the end of the string <oberon-param href='#StringDesc.IndexOf.s'>s</oberon-param>.  If no matching character is found, result is <samp>-1</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#StringDesc.IndexOf.pos'>pos</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.IndexOf.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='char' id='StringDesc.IndexOf.char' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='UCS4CHAR'/>
          </type>
        </parameter-decl>
        <parameter-decl name='pos' id='StringDesc.IndexOf.pos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='LastIndexOf' id='StringDesc.LastIndexOf' export='yes'>
      <oberon-doc>
        <summary>Return the index of the last character matching <oberon-param href='#StringDesc.LastIndexOf.char'>char</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the index of the last character matching <oberon-param href='#StringDesc.LastIndexOf.char'>char</oberon-param>.  Search starts with the character before <oberon-param href='#StringDesc.LastIndexOf.pos'>pos</oberon-param> and progresses to the beginning of the string <oberon-param href='#StringDesc.LastIndexOf.s'>s</oberon-param>.  If no matching character is found, result is <samp>-1</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#StringDesc.LastIndexOf.pos'>pos</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.LastIndexOf.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='char' id='StringDesc.LastIndexOf.char' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='UCS4CHAR'/>
          </type>
        </parameter-decl>
        <parameter-decl name='pos' id='StringDesc.LastIndexOf.pos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='EndsWith' id='StringDesc.EndsWith' export='yes'>
      <oberon-doc>
        <summary>Return <code>TRUE</code> is the last characters in <oberon-param href='#StringDesc.EndsWith.s'>s</oberon-param> equal <oberon-param href='#StringDesc.EndsWith.suffix'>suffix</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return <code>TRUE</code> is the last characters in <oberon-param href='#StringDesc.EndsWith.s'>s</oberon-param> equal <oberon-param href='#StringDesc.EndsWith.suffix'>suffix</oberon-param>.  Result is <code>FALSE</code> if <samp><oberon-field href='#StringDesc.length'>s.length</oberon-field> &lt; <oberon-field href='#StringDesc.length'>suffix.length</oberon-field></samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp><oberon-param href='#StringDesc.EndsWith.suffix'>suffix</oberon-param> # <code>NIL</code></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.EndsWith.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='suffix' id='StringDesc.EndsWith.suffix' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='StartsWith' id='StringDesc.StartsWith' export='yes'>
      <oberon-doc>
        <summary>Return <code>TRUE</code> is the first characters in <oberon-param href='#StringDesc.StartsWith.s'>s</oberon-param> equal <oberon-param href='#StringDesc.StartsWith.prefix'>prefix</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return <code>TRUE</code> is the first characters in <oberon-param href='#StringDesc.StartsWith.s'>s</oberon-param> equal <oberon-param href='#StringDesc.StartsWith.prefix'>prefix</oberon-param>.  Result is <code>FALSE</code> if <samp><oberon-field href='#StringDesc.length'>s.length</oberon-field> &lt; <oberon-field href='#StringDesc.length'>prefix.length</oberon-field></samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp><oberon-param href='#StringDesc.StartsWith.prefix'>prefix</oberon-param> # <code>NIL</code></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='StringDesc.StartsWith.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </receiver-decl>
        <parameter-decl name='prefix' id='StringDesc.StartsWith.prefix' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <base-class module='Object' class='Object' href='#Object'>
      <inherited-method module='Object' name='Equals' class='Object' href='#ObjectDesc.Equals'/>
      <inherited-method module='Object' name='HashCode' class='Object' href='#ObjectDesc.HashCode'/>
      <inherited-method module='Object' name='ToString' class='Object' href='#ObjectDesc.ToString'/>
    </base-class>
  </class>
  <class name='String8'>
    <type-decl name='String8' id='String8' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='String8Desc' href='#String8Desc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='String8Desc' id='String8Desc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='NewLatin1' id='NewLatin1' export='yes'>
      <oberon-doc>
        <summary>Create a string value from <oberon-param href='#NewLatin1.str'>str</oberon-param> without any translation.</summary>
        <p pad-after='yes' no-indent='yes'>Create a string value from <oberon-param href='#NewLatin1.str'>str</oberon-param> without any translation.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'>The characters in <oberon-param href='#NewLatin1.str'>str</oberon-param> are Latin-1 code points.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='str' id='NewLatin1.str' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String8' href='#String8'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='NewLatin1Region' id='NewLatin1Region' export='yes'>
      <oberon-doc>
        <summary>Create a string value from <samp>str[start, end-1]</samp> without any translation.</summary>
        <p pad-after='yes' no-indent='yes'>Create a string value from <samp>str[start, end-1]</samp> without any translation.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#NewLatin1Region.start'>start</oberon-param> &lt;= <oberon-param href='#NewLatin1Region.end'>end</oberon-param> &lt;= LEN(<oberon-param href='#NewLatin1Region.str'>str</oberon-param>)</samp>.  The characters in <oberon-param href='#NewLatin1Region.str'>str</oberon-param> are Latin-1 code points.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='str' id='NewLatin1Region.str' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <parameter-decl name='start' id='NewLatin1Region.start' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='end' id='NewLatin1Region.end' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String8' href='#String8'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='NewLatin1Char' id='NewLatin1Char' export='yes'>
      <oberon-doc>
        <summary>Create a string value of length 1 from <samp>ch</samp> without any translation.</summary>
        <p pad-after='yes' no-indent='yes'>Create a string value of length 1 from <samp>ch</samp> without any translation.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#NewLatin1Char.ch'>ch</oberon-param> is a Latin-1 code point.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='ch' id='NewLatin1Char.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='CHAR'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String8' href='#String8'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='CharsLatin1' id='String8Desc.CharsLatin1' export='yes'>
      <oberon-doc>
        <summary>Return a reference to the string's content.</summary>
        <p pad-after='yes' no-indent='yes'>Return a reference to the string's content.  The characters from the index range <samp>[0, <oberon-field href='#StringDesc.length'>s.length</oberon-field>[</samp> hold valid data.  The character at position <oberon-field href='#StringDesc.length'>s.length</oberon-field> is <code>0X</code>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.CharsLatin1.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='CharsLatin1' href='#CharsLatin1'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ToString8' id='String8Desc.ToString8' export='yes'>
      <doc-inherited-from module='Object' name='ToString8' class='String' href='#StringDesc.ToString8'/>
      <oberon-doc>
        <summary>Identity operation returning <oberon-param href='#String8Desc.ToString8.s'>s</oberon-param> if all characters are in the range of <oberon-type href='#String8'>String8</oberon-type>.</summary>
        <p pad-after='yes' no-indent='yes'>Identity operation returning <oberon-param href='#String8Desc.ToString8.s'>s</oberon-param> if all characters are in the range of <oberon-type href='#String8'>String8</oberon-type>.  Otherwise, characters outside this range are substituted with <oberon-param href='#String8Desc.ToString8.replace'>replace</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.ToString8.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <parameter-decl name='replace' id='String8Desc.ToString8.replace' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='CHAR'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String8' href='#String8'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='ToString8' class='String' href='#StringDesc.ToString8'/>
    </procedure>
    <procedure name='ToString16' id='String8Desc.ToString16' export='yes'>
      <doc-inherited-from module='Object' name='ToString16' class='String' href='#StringDesc.ToString16'/>
      <oberon-doc>
        <summary>Identity operation returning <oberon-param href='#String8Desc.ToString16.s'>s</oberon-param> as an instance of <oberon-type href='#String16'>String16</oberon-type>.</summary>
        <p pad-after='yes' no-indent='yes'>Identity operation returning <oberon-param href='#String8Desc.ToString16.s'>s</oberon-param> as an instance of <oberon-type href='#String16'>String16</oberon-type>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.ToString16.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='String16' href='#String16'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='ToString16' class='String' href='#StringDesc.ToString16'/>
    </procedure>
    <procedure name='Equals' id='String8Desc.Equals' export='yes'>
      <doc-inherited-from module='Object' name='Equals' class='Object' href='#ObjectDesc.Equals'/>
      <oberon-doc>
        <summary>Indicates whether some other object is "equal to" this one.</summary>
        <p pad-after='yes' no-indent='yes'>Indicates whether some other object is "equal to" this one.</p>
        <p pad-after='yes' no-indent='no'>The <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method implements an equivalence relation:</p>
        <itemize pad-after='yes'>
          <itemize-mark><bullet/></itemize-mark>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is reflexive: for any reference value <samp>x</samp>, <samp>x.Equals(x)</samp> should return <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is symmetric: for any reference values <samp>x</samp> and <samp>y</samp>, <samp>x.Equals(y)</samp> should return <code>TRUE</code> if and only if <samp>y.Equals(x)</samp> returns <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is transitive: for any reference values <samp>x</samp>, <samp>y</samp>, and <samp>z</samp>, if <samp>x.Equals(y)</samp> returns <code>TRUE</code> and <samp>y.Equals(z)</samp> returns <code>TRUE</code>, then <samp>x.Equals(z)</samp> should return <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is consistent: for any reference values <samp>x</samp> and <samp>y</samp>, multiple invocations of <samp>x.Equals(y)</samp> consistently return <code>TRUE</code> or consistently return <code>FALSE</code>, provided no information used in equals comparisons on the object is modified.</p>
          </item>
          <item pad-after='no'>
            <p pad-after='no' no-indent='yes'>For any non-<code>NIL</code> reference value <samp>x</samp>, <samp>x.Equals(NIL)</samp> should return <code>FALSE</code>.</p>
          </item>
        </itemize>
        <p pad-after='yes' no-indent='no'>The <samp>Equals</samp> method for class <oberon-type href='#Object'>Object</oberon-type> implements the most discriminating possible equivalence relation on objects; that is, for any reference values <samp>x</samp> and <samp>y</samp>, this method returns <code>TRUE</code> if and only if <samp>x</samp> and <samp>y</samp> refer to the same object (<samp>x=y</samp> has the value <code>TRUE</code>).</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.Equals.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='String8Desc.Equals.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='Equals' class='String' href='#StringDesc.Equals'/>
      <redefined-method module='Object' name='Equals' class='Object' href='#ObjectDesc.Equals'/>
    </procedure>
    <procedure name='EqualsIgnoreCase' id='String8Desc.EqualsIgnoreCase' export='yes'>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.EqualsIgnoreCase.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='String8Desc.EqualsIgnoreCase.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='EqualsIgnoreCase' class='String' href='#StringDesc.EqualsIgnoreCase'/>
    </procedure>
    <procedure name='Compare' id='String8Desc.Compare' export='yes'>
      <doc-inherited-from module='Object' name='Compare' class='String' href='#StringDesc.Compare'/>
      <oberon-doc>
        <summary>Compares the two strings <oberon-param href='#String8Desc.Compare.s'>s</oberon-param> and <oberon-param href='#String8Desc.Compare.y'>y</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Compares the two strings <oberon-param href='#String8Desc.Compare.s'>s</oberon-param> and <oberon-param href='#String8Desc.Compare.y'>y</oberon-param>.  The sign of the result signals if <oberon-param href='#String8Desc.Compare.s'>s</oberon-param> is less than, equal to, or greater than <oberon-param href='#String8Desc.Compare.y'>y</oberon-param>:</p>
        <table pad-after='yes'>
          <table-row pad-after='yes'>
            <table-first-column pad-after='no'><asis><oberon-param href='#String8Desc.Compare.s'>s</oberon-param> &lt; <oberon-param href='#String8Desc.Compare.y'>y</oberon-param></asis></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'><result/> &lt; 0</p>
            </item>
          </table-row>
          <table-row pad-after='yes'>
            <table-first-column pad-after='no'><asis><oberon-param href='#String8Desc.Compare.s'>s</oberon-param> = <oberon-param href='#String8Desc.Compare.y'>y</oberon-param></asis></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'><result/> &gt; 0</p>
            </item>
          </table-row>
          <table-row pad-after='no'>
            <table-first-column pad-after='no'><asis><oberon-param href='#String8Desc.Compare.s'>s</oberon-param> &gt; <oberon-param href='#String8Desc.Compare.y'>y</oberon-param></asis></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'><result/> &gt; 0</p>
            </item>
          </table-row>
        </table>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#String8Desc.Compare.y'>y</oberon-param> is not <code>NIL</code>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.Compare.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='String8Desc.Compare.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='Compare' class='String' href='#StringDesc.Compare'/>
    </procedure>
    <procedure name='HashCode' id='String8Desc.HashCode' export='yes'>
      <doc-inherited-from module='Object' name='HashCode' class='Object' href='#ObjectDesc.HashCode'/>
      <oberon-doc>
        <summary>Returns a hash code value for the object.</summary>
        <p pad-after='yes' no-indent='yes'>Returns a hash code value for the object.  This method is supported for the benefit of dictionaries such as those provided by <oberon-module href='ADT:Dictionary#'>ADT:Dictionary</oberon-module>..</p>
        <p pad-after='yes' no-indent='no'>The general contract of <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> is:</p>
        <itemize pad-after='yes'>
          <itemize-mark><bullet/></itemize-mark>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>Whenever it is invoked on the same object more than once during an execution of an application, the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.  This integer need not remain consistent from one execution of an application to another execution of the same application.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>If two objects are equal according to the <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method, then calling the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method on each of the two objects must produce the same integer result.</p>
          </item>
          <item pad-after='no'>
            <p pad-after='no' no-indent='yes'>It is <emph>not</emph> required that if two objects are unequal according to the <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method, then calling the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method on each of the two objects must produce distinct integer results.  However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of dictionaries.</p>
          </item>
        </itemize>
        <p pad-after='yes' no-indent='no'>As much as is reasonably practical, the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method defined by class <oberon-type href='#Object'>Object</oberon-type> does return distinct integers for distinct objects.  (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required.)</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.HashCode.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='Hash'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='HashCode' class='String' href='#StringDesc.HashCode'/>
      <redefined-method module='Object' name='HashCode' class='Object' href='#ObjectDesc.HashCode'/>
    </procedure>
    <procedure name='CharAt' id='String8Desc.CharAt' export='yes'>
      <doc-inherited-from module='Object' name='CharAt' class='String' href='#StringDesc.CharAt'/>
      <oberon-doc>
        <summary>Return the character at position <oberon-param href='#String8Desc.CharAt.index'>index</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the character at position <oberon-param href='#String8Desc.CharAt.index'>index</oberon-param>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String8Desc.CharAt.index'>index</oberon-param> &lt; <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.CharAt.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <parameter-decl name='index' id='String8Desc.CharAt.index' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='UCS4CHAR'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='CharAt' class='String' href='#StringDesc.CharAt'/>
    </procedure>
    <procedure name='NextChar' id='String8Desc.NextChar' export='yes'>
      <doc-inherited-from module='Object' name='NextChar' class='String' href='#StringDesc.NextChar'/>
      <oberon-doc>
        <summary>Return the character at position <oberon-param href='#String8Desc.NextChar.index'>index</oberon-param> and increment <oberon-param href='#String8Desc.NextChar.index'>index</oberon-param> to point to the next character in the string.</summary>
        <p pad-after='yes' no-indent='yes'>Return the character at position <oberon-param href='#String8Desc.NextChar.index'>index</oberon-param> and increment <oberon-param href='#String8Desc.NextChar.index'>index</oberon-param> to point to the next character in the string.  If <oberon-param href='#String8Desc.NextChar.index'>index</oberon-param> equals the length of the string, then result is <samp>0X</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String8Desc.NextChar.index'>index</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.NextChar.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <parameter-decl name='index' id='String8Desc.NextChar.index' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='UCS4CHAR'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='NextChar' class='String' href='#StringDesc.NextChar'/>
    </procedure>
    <procedure name='Substring' id='String8Desc.Substring' export='yes'>
      <doc-inherited-from module='Object' name='Substring' class='String' href='#StringDesc.Substring'/>
      <oberon-doc>
        <summary>Return the substring of <oberon-param href='#String8Desc.Substring.s'>s</oberon-param> starting at <oberon-param href='#String8Desc.Substring.start'>start</oberon-param> (inclusive) and ending at <oberon-param href='#String8Desc.Substring.end'>end</oberon-param> (exclusive).</summary>
        <p pad-after='yes' no-indent='yes'>Return the substring of <oberon-param href='#String8Desc.Substring.s'>s</oberon-param> starting at <oberon-param href='#String8Desc.Substring.start'>start</oberon-param> (inclusive) and ending at <oberon-param href='#String8Desc.Substring.end'>end</oberon-param> (exclusive).  The length of the result is <samp>end-start</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String8Desc.Substring.start'>start</oberon-param> &lt;= <oberon-param href='#String8Desc.Substring.end'>end</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.Substring.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <parameter-decl name='start' id='String8Desc.Substring.start' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='end' id='String8Desc.Substring.end' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String8' href='#String8'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='Substring' class='String' href='#StringDesc.Substring'/>
    </procedure>
    <procedure name='Trim' id='String8Desc.Trim' export='yes'>
      <doc-inherited-from module='Object' name='Trim' class='String' href='#StringDesc.Trim'/>
      <oberon-doc>
        <summary>Return the substring beginning with the first character of <oberon-param href='#String8Desc.Trim.s'>s</oberon-param> and ending with the last character of <oberon-param href='#String8Desc.Trim.s'>s</oberon-param> with a code greater than space (<samp>20X</samp>).</summary>
        <p pad-after='yes' no-indent='yes'>Return the substring beginning with the first character of <oberon-param href='#String8Desc.Trim.s'>s</oberon-param> and ending with the last character of <oberon-param href='#String8Desc.Trim.s'>s</oberon-param> with a code greater than space (<samp>20X</samp>).  If <oberon-param href='#String8Desc.Trim.s'>s</oberon-param> contains no such characters, then result is the empty string.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.Trim.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='String8' href='#String8'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='Trim' class='String' href='#StringDesc.Trim'/>
    </procedure>
    <procedure name='IndexOf' id='String8Desc.IndexOf' export='yes'>
      <doc-inherited-from module='Object' name='IndexOf' class='String' href='#StringDesc.IndexOf'/>
      <oberon-doc>
        <summary>Return the index of the first character matching <oberon-param href='#String8Desc.IndexOf.char'>char</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the index of the first character matching <oberon-param href='#String8Desc.IndexOf.char'>char</oberon-param>.  Search starts at <oberon-param href='#String8Desc.IndexOf.pos'>pos</oberon-param> and progresses to the end of the string <oberon-param href='#String8Desc.IndexOf.s'>s</oberon-param>.  If no matching character is found, result is <samp>-1</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String8Desc.IndexOf.pos'>pos</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.IndexOf.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <parameter-decl name='char' id='String8Desc.IndexOf.char' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='UCS4CHAR'/>
          </type>
        </parameter-decl>
        <parameter-decl name='pos' id='String8Desc.IndexOf.pos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='IndexOf' class='String' href='#StringDesc.IndexOf'/>
    </procedure>
    <procedure name='LastIndexOf' id='String8Desc.LastIndexOf' export='yes'>
      <doc-inherited-from module='Object' name='LastIndexOf' class='String' href='#StringDesc.LastIndexOf'/>
      <oberon-doc>
        <summary>Return the index of the last character matching <oberon-param href='#String8Desc.LastIndexOf.char'>char</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the index of the last character matching <oberon-param href='#String8Desc.LastIndexOf.char'>char</oberon-param>.  Search starts with the character before <oberon-param href='#String8Desc.LastIndexOf.pos'>pos</oberon-param> and progresses to the beginning of the string <oberon-param href='#String8Desc.LastIndexOf.s'>s</oberon-param>.  If no matching character is found, result is <samp>-1</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String8Desc.LastIndexOf.pos'>pos</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String8Desc.LastIndexOf.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String8' href='#String8'/>
          </type>
        </receiver-decl>
        <parameter-decl name='char' id='String8Desc.LastIndexOf.char' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='UCS4CHAR'/>
          </type>
        </parameter-decl>
        <parameter-decl name='pos' id='String8Desc.LastIndexOf.pos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='LastIndexOf' class='String' href='#StringDesc.LastIndexOf'/>
    </procedure>
    <base-class module='Object' class='String' href='#String'>
      <inherited-method module='Object' name='CharAt' class='String' href='#StringDesc.CharAt'/>
      <inherited-method module='Object' name='Compare' class='String' href='#StringDesc.Compare'/>
      <inherited-method module='Object' name='Concat' class='String' href='#StringDesc.Concat'/>
      <inherited-method module='Object' name='EndsWith' class='String' href='#StringDesc.EndsWith'/>
      <inherited-method module='Object' name='Equals' class='String' href='#StringDesc.Equals'/>
      <inherited-method module='Object' name='EqualsIgnoreCase' class='String' href='#StringDesc.EqualsIgnoreCase'/>
      <inherited-method module='Object' name='HashCode' class='String' href='#StringDesc.HashCode'/>
      <inherited-method module='Object' name='IndexOf' class='String' href='#StringDesc.IndexOf'/>
      <inherited-method module='Object' name='LastIndexOf' class='String' href='#StringDesc.LastIndexOf'/>
      <inherited-method module='Object' name='NextChar' class='String' href='#StringDesc.NextChar'/>
      <inherited-method module='Object' name='StartsWith' class='String' href='#StringDesc.StartsWith'/>
      <inherited-method module='Object' name='Substring' class='String' href='#StringDesc.Substring'/>
      <inherited-method module='Object' name='ToString' class='String' href='#StringDesc.ToString'/>
      <inherited-method module='Object' name='ToString16' class='String' href='#StringDesc.ToString16'/>
      <inherited-method module='Object' name='ToString8' class='String' href='#StringDesc.ToString8'/>
      <inherited-method module='Object' name='Trim' class='String' href='#StringDesc.Trim'/>
      <inherited-field module='Object' name='length' class='String' href='#StringDesc.length'/>
      <base-class module='Object' class='Object' href='#Object'/>
    </base-class>
  </class>
  <class name='String16'>
    <type-decl name='String16' id='String16' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='String16Desc' href='#String16Desc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='String16Desc' id='String16Desc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='CharsUTF16' id='String16Desc.CharsUTF16' export='yes'>
      <oberon-doc>
        <summary>Return a reference to the string's content.</summary>
        <p pad-after='yes' no-indent='yes'>Return a reference to the string's content.  The characters from the index range <samp>[0, <oberon-field href='#StringDesc.length'>s.length</oberon-field>[</samp> hold valid data.  The character at position <oberon-field href='#StringDesc.length'>s.length</oberon-field> is <code>0X</code>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.CharsUTF16.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='CharsUTF16' href='#CharsUTF16'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ToString8' id='String16Desc.ToString8' export='yes'>
      <doc-inherited-from module='Object' name='ToString8' class='String' href='#StringDesc.ToString8'/>
      <oberon-doc>
        <summary>Identity operation returning <oberon-param href='#String16Desc.ToString8.s'>s</oberon-param> if all characters are in the range of <oberon-type href='#String8'>String8</oberon-type>.</summary>
        <p pad-after='yes' no-indent='yes'>Identity operation returning <oberon-param href='#String16Desc.ToString8.s'>s</oberon-param> if all characters are in the range of <oberon-type href='#String8'>String8</oberon-type>.  Otherwise, characters outside this range are substituted with <oberon-param href='#String16Desc.ToString8.replace'>replace</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.ToString8.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <parameter-decl name='replace' id='String16Desc.ToString8.replace' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='CHAR'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String8' href='#String8'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='ToString8' class='String' href='#StringDesc.ToString8'/>
    </procedure>
    <procedure name='ToString16' id='String16Desc.ToString16' export='yes'>
      <doc-inherited-from module='Object' name='ToString16' class='String' href='#StringDesc.ToString16'/>
      <oberon-doc>
        <summary>Identity operation returning <oberon-param href='#String16Desc.ToString16.s'>s</oberon-param> as an instance of <oberon-type href='#String16'>String16</oberon-type>.</summary>
        <p pad-after='yes' no-indent='yes'>Identity operation returning <oberon-param href='#String16Desc.ToString16.s'>s</oberon-param> as an instance of <oberon-type href='#String16'>String16</oberon-type>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.ToString16.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='String16' href='#String16'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='ToString16' class='String' href='#StringDesc.ToString16'/>
    </procedure>
    <procedure name='Equals' id='String16Desc.Equals' export='yes'>
      <doc-inherited-from module='Object' name='Equals' class='Object' href='#ObjectDesc.Equals'/>
      <oberon-doc>
        <summary>Indicates whether some other object is "equal to" this one.</summary>
        <p pad-after='yes' no-indent='yes'>Indicates whether some other object is "equal to" this one.</p>
        <p pad-after='yes' no-indent='no'>The <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method implements an equivalence relation:</p>
        <itemize pad-after='yes'>
          <itemize-mark><bullet/></itemize-mark>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is reflexive: for any reference value <samp>x</samp>, <samp>x.Equals(x)</samp> should return <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is symmetric: for any reference values <samp>x</samp> and <samp>y</samp>, <samp>x.Equals(y)</samp> should return <code>TRUE</code> if and only if <samp>y.Equals(x)</samp> returns <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is transitive: for any reference values <samp>x</samp>, <samp>y</samp>, and <samp>z</samp>, if <samp>x.Equals(y)</samp> returns <code>TRUE</code> and <samp>y.Equals(z)</samp> returns <code>TRUE</code>, then <samp>x.Equals(z)</samp> should return <code>TRUE</code>.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>It is consistent: for any reference values <samp>x</samp> and <samp>y</samp>, multiple invocations of <samp>x.Equals(y)</samp> consistently return <code>TRUE</code> or consistently return <code>FALSE</code>, provided no information used in equals comparisons on the object is modified.</p>
          </item>
          <item pad-after='no'>
            <p pad-after='no' no-indent='yes'>For any non-<code>NIL</code> reference value <samp>x</samp>, <samp>x.Equals(NIL)</samp> should return <code>FALSE</code>.</p>
          </item>
        </itemize>
        <p pad-after='yes' no-indent='no'>The <samp>Equals</samp> method for class <oberon-type href='#Object'>Object</oberon-type> implements the most discriminating possible equivalence relation on objects; that is, for any reference values <samp>x</samp> and <samp>y</samp>, this method returns <code>TRUE</code> if and only if <samp>x</samp> and <samp>y</samp> refer to the same object (<samp>x=y</samp> has the value <code>TRUE</code>).</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.Equals.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='String16Desc.Equals.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='Equals' class='String' href='#StringDesc.Equals'/>
      <redefined-method module='Object' name='Equals' class='Object' href='#ObjectDesc.Equals'/>
    </procedure>
    <procedure name='EqualsIgnoreCase' id='String16Desc.EqualsIgnoreCase' export='yes'>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.EqualsIgnoreCase.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='String16Desc.EqualsIgnoreCase.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='EqualsIgnoreCase' class='String' href='#StringDesc.EqualsIgnoreCase'/>
    </procedure>
    <procedure name='Compare' id='String16Desc.Compare' export='yes'>
      <doc-inherited-from module='Object' name='Compare' class='String' href='#StringDesc.Compare'/>
      <oberon-doc>
        <summary>Compares the two strings <oberon-param href='#String16Desc.Compare.s'>s</oberon-param> and <oberon-param href='#String16Desc.Compare.y'>y</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Compares the two strings <oberon-param href='#String16Desc.Compare.s'>s</oberon-param> and <oberon-param href='#String16Desc.Compare.y'>y</oberon-param>.  The sign of the result signals if <oberon-param href='#String16Desc.Compare.s'>s</oberon-param> is less than, equal to, or greater than <oberon-param href='#String16Desc.Compare.y'>y</oberon-param>:</p>
        <table pad-after='yes'>
          <table-row pad-after='yes'>
            <table-first-column pad-after='no'><asis><oberon-param href='#String16Desc.Compare.s'>s</oberon-param> &lt; <oberon-param href='#String16Desc.Compare.y'>y</oberon-param></asis></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'><result/> &lt; 0</p>
            </item>
          </table-row>
          <table-row pad-after='yes'>
            <table-first-column pad-after='no'><asis><oberon-param href='#String16Desc.Compare.s'>s</oberon-param> = <oberon-param href='#String16Desc.Compare.y'>y</oberon-param></asis></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'><result/> &gt; 0</p>
            </item>
          </table-row>
          <table-row pad-after='no'>
            <table-first-column pad-after='no'><asis><oberon-param href='#String16Desc.Compare.s'>s</oberon-param> &gt; <oberon-param href='#String16Desc.Compare.y'>y</oberon-param></asis></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'><result/> &gt; 0</p>
            </item>
          </table-row>
        </table>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#String16Desc.Compare.y'>y</oberon-param> is not <code>NIL</code>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.Compare.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <parameter-decl name='y' id='String16Desc.Compare.y' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='Compare' class='String' href='#StringDesc.Compare'/>
    </procedure>
    <procedure name='HashCode' id='String16Desc.HashCode' export='yes'>
      <doc-inherited-from module='Object' name='HashCode' class='Object' href='#ObjectDesc.HashCode'/>
      <oberon-doc>
        <summary>Returns a hash code value for the object.</summary>
        <p pad-after='yes' no-indent='yes'>Returns a hash code value for the object.  This method is supported for the benefit of dictionaries such as those provided by <oberon-module href='ADT:Dictionary#'>ADT:Dictionary</oberon-module>..</p>
        <p pad-after='yes' no-indent='no'>The general contract of <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> is:</p>
        <itemize pad-after='yes'>
          <itemize-mark><bullet/></itemize-mark>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>Whenever it is invoked on the same object more than once during an execution of an application, the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.  This integer need not remain consistent from one execution of an application to another execution of the same application.</p>
          </item>
          <item pad-after='yes'>
            <p pad-after='no' no-indent='yes'>If two objects are equal according to the <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method, then calling the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method on each of the two objects must produce the same integer result.</p>
          </item>
          <item pad-after='no'>
            <p pad-after='no' no-indent='yes'>It is <emph>not</emph> required that if two objects are unequal according to the <oberon-proc href='#ObjectDesc.Equals'>Object.Equals</oberon-proc> method, then calling the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method on each of the two objects must produce distinct integer results.  However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of dictionaries.</p>
          </item>
        </itemize>
        <p pad-after='yes' no-indent='no'>As much as is reasonably practical, the <oberon-proc href='#ObjectDesc.HashCode'>Object.HashCode</oberon-proc> method defined by class <oberon-type href='#Object'>Object</oberon-type> does return distinct integers for distinct objects.  (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required.)</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.HashCode.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='Hash'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='HashCode' class='String' href='#StringDesc.HashCode'/>
      <redefined-method module='Object' name='HashCode' class='Object' href='#ObjectDesc.HashCode'/>
    </procedure>
    <procedure name='CharAt' id='String16Desc.CharAt' export='yes'>
      <doc-inherited-from module='Object' name='CharAt' class='String' href='#StringDesc.CharAt'/>
      <oberon-doc>
        <summary>Return the character at position <oberon-param href='#String16Desc.CharAt.index'>index</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the character at position <oberon-param href='#String16Desc.CharAt.index'>index</oberon-param>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String16Desc.CharAt.index'>index</oberon-param> &lt; <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.CharAt.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <parameter-decl name='index' id='String16Desc.CharAt.index' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='UCS4CHAR'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='CharAt' class='String' href='#StringDesc.CharAt'/>
    </procedure>
    <procedure name='NextChar' id='String16Desc.NextChar' export='yes'>
      <doc-inherited-from module='Object' name='NextChar' class='String' href='#StringDesc.NextChar'/>
      <oberon-doc>
        <summary>Return the character at position <oberon-param href='#String16Desc.NextChar.index'>index</oberon-param> and increment <oberon-param href='#String16Desc.NextChar.index'>index</oberon-param> to point to the next character in the string.</summary>
        <p pad-after='yes' no-indent='yes'>Return the character at position <oberon-param href='#String16Desc.NextChar.index'>index</oberon-param> and increment <oberon-param href='#String16Desc.NextChar.index'>index</oberon-param> to point to the next character in the string.  If <oberon-param href='#String16Desc.NextChar.index'>index</oberon-param> equals the length of the string, then result is <samp>0X</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String16Desc.NextChar.index'>index</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.NextChar.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <parameter-decl name='index' id='String16Desc.NextChar.index' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='UCS4CHAR'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='NextChar' class='String' href='#StringDesc.NextChar'/>
    </procedure>
    <procedure name='Substring' id='String16Desc.Substring' export='yes'>
      <doc-inherited-from module='Object' name='Substring' class='String' href='#StringDesc.Substring'/>
      <oberon-doc>
        <summary>Return the substring of <oberon-param href='#String16Desc.Substring.s'>s</oberon-param> starting at <oberon-param href='#String16Desc.Substring.start'>start</oberon-param> (inclusive) and ending at <oberon-param href='#String16Desc.Substring.end'>end</oberon-param> (exclusive).</summary>
        <p pad-after='yes' no-indent='yes'>Return the substring of <oberon-param href='#String16Desc.Substring.s'>s</oberon-param> starting at <oberon-param href='#String16Desc.Substring.start'>start</oberon-param> (inclusive) and ending at <oberon-param href='#String16Desc.Substring.end'>end</oberon-param> (exclusive).  The length of the result is <samp>end-start</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String16Desc.Substring.start'>start</oberon-param> &lt;= <oberon-param href='#String16Desc.Substring.end'>end</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.Substring.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <parameter-decl name='start' id='String16Desc.Substring.start' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='end' id='String16Desc.Substring.end' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='String16' href='#String16'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='Substring' class='String' href='#StringDesc.Substring'/>
    </procedure>
    <procedure name='Trim' id='String16Desc.Trim' export='yes'>
      <doc-inherited-from module='Object' name='Trim' class='String' href='#StringDesc.Trim'/>
      <oberon-doc>
        <summary>Return the substring beginning with the first character of <oberon-param href='#String16Desc.Trim.s'>s</oberon-param> and ending with the last character of <oberon-param href='#String16Desc.Trim.s'>s</oberon-param> with a code greater than space (<samp>20X</samp>).</summary>
        <p pad-after='yes' no-indent='yes'>Return the substring beginning with the first character of <oberon-param href='#String16Desc.Trim.s'>s</oberon-param> and ending with the last character of <oberon-param href='#String16Desc.Trim.s'>s</oberon-param> with a code greater than space (<samp>20X</samp>).  If <oberon-param href='#String16Desc.Trim.s'>s</oberon-param> contains no such characters, then result is the empty string.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.Trim.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='String16' href='#String16'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='Trim' class='String' href='#StringDesc.Trim'/>
    </procedure>
    <procedure name='IndexOf' id='String16Desc.IndexOf' export='yes'>
      <doc-inherited-from module='Object' name='IndexOf' class='String' href='#StringDesc.IndexOf'/>
      <oberon-doc>
        <summary>Return the index of the first character matching <oberon-param href='#String16Desc.IndexOf.char'>char</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the index of the first character matching <oberon-param href='#String16Desc.IndexOf.char'>char</oberon-param>.  Search starts at <oberon-param href='#String16Desc.IndexOf.pos'>pos</oberon-param> and progresses to the end of the string <oberon-param href='#String16Desc.IndexOf.s'>s</oberon-param>.  If no matching character is found, result is <samp>-1</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String16Desc.IndexOf.pos'>pos</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.IndexOf.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <parameter-decl name='char' id='String16Desc.IndexOf.char' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='UCS4CHAR'/>
          </type>
        </parameter-decl>
        <parameter-decl name='pos' id='String16Desc.IndexOf.pos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='IndexOf' class='String' href='#StringDesc.IndexOf'/>
    </procedure>
    <procedure name='LastIndexOf' id='String16Desc.LastIndexOf' export='yes'>
      <doc-inherited-from module='Object' name='LastIndexOf' class='String' href='#StringDesc.LastIndexOf'/>
      <oberon-doc>
        <summary>Return the index of the last character matching <oberon-param href='#String16Desc.LastIndexOf.char'>char</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the index of the last character matching <oberon-param href='#String16Desc.LastIndexOf.char'>char</oberon-param>.  Search starts with the character before <oberon-param href='#String16Desc.LastIndexOf.pos'>pos</oberon-param> and progresses to the beginning of the string <oberon-param href='#String16Desc.LastIndexOf.s'>s</oberon-param>.  If no matching character is found, result is <samp>-1</samp>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#String16Desc.LastIndexOf.pos'>pos</oberon-param> &lt;= <oberon-field href='#StringDesc.length'>s.length</oberon-field></samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='String16Desc.LastIndexOf.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='String16' href='#String16'/>
          </type>
        </receiver-decl>
        <parameter-decl name='char' id='String16Desc.LastIndexOf.char' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='UCS4CHAR'/>
          </type>
        </parameter-decl>
        <parameter-decl name='pos' id='String16Desc.LastIndexOf.pos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
      <redefined-method module='Object' name='LastIndexOf' class='String' href='#StringDesc.LastIndexOf'/>
    </procedure>
    <base-class module='Object' class='String' href='#String'>
      <inherited-method module='Object' name='CharAt' class='String' href='#StringDesc.CharAt'/>
      <inherited-method module='Object' name='Compare' class='String' href='#StringDesc.Compare'/>
      <inherited-method module='Object' name='Concat' class='String' href='#StringDesc.Concat'/>
      <inherited-method module='Object' name='EndsWith' class='String' href='#StringDesc.EndsWith'/>
      <inherited-method module='Object' name='Equals' class='String' href='#StringDesc.Equals'/>
      <inherited-method module='Object' name='EqualsIgnoreCase' class='String' href='#StringDesc.EqualsIgnoreCase'/>
      <inherited-method module='Object' name='HashCode' class='String' href='#StringDesc.HashCode'/>
      <inherited-method module='Object' name='IndexOf' class='String' href='#StringDesc.IndexOf'/>
      <inherited-method module='Object' name='LastIndexOf' class='String' href='#StringDesc.LastIndexOf'/>
      <inherited-method module='Object' name='NextChar' class='String' href='#StringDesc.NextChar'/>
      <inherited-method module='Object' name='StartsWith' class='String' href='#StringDesc.StartsWith'/>
      <inherited-method module='Object' name='Substring' class='String' href='#StringDesc.Substring'/>
      <inherited-method module='Object' name='ToString' class='String' href='#StringDesc.ToString'/>
      <inherited-method module='Object' name='ToString16' class='String' href='#StringDesc.ToString16'/>
      <inherited-method module='Object' name='ToString8' class='String' href='#StringDesc.ToString8'/>
      <inherited-method module='Object' name='Trim' class='String' href='#StringDesc.Trim'/>
      <inherited-field module='Object' name='length' class='String' href='#StringDesc.length'/>
      <base-class module='Object' class='Object' href='#Object'/>
    </base-class>
  </class>
  <module-ref name='ADT:Dictionary'>
    <ref-target type='html' relative-uri='ADT/Dictionary.html'/>
  </module-ref>
</interface-description>
