<?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='TextRider' id=''>
  <import-decl name='Channel' id='Channel' export='no' module='Channel'/>
  <import-decl name='CharClass' id='CharClass' export='no' module='CharClass'/>
  <import-decl name='LRealStr' id='LRealStr' export='no' module='LRealStr'/>
  <import-decl name='Msg' id='Msg' export='no' module='Msg'/>
  <import-decl name='Object' id='Object' export='no' module='Object'/>
  <const-decl name='done' id='done' export='yes' value='unknown'/>
  <const-decl name='invalidFormat' id='invalidFormat' export='yes' value='unknown'/>
  <const-decl name='valueOutOfRange' id='valueOutOfRange' export='yes' value='unknown'/>
  <const-decl name='undefined' id='undefined' export='yes' value='unknown'/>
  <const-decl name='char' id='char' export='yes' value='unknown'/>
  <const-decl name='string' id='string' export='yes' value='unknown'/>
  <const-decl name='int' id='int' export='yes' value='unknown'/>
  <const-decl name='real' id='real' export='yes' value='unknown'/>
  <const-decl name='bool' id='bool' export='yes' value='unknown'/>
  <const-decl name='set' id='set' export='yes' value='unknown'/>
  <const-decl name='tab' id='tab' export='yes' value='unknown'/>
  <const-decl name='line' id='line' export='yes' value='unknown'/>
  <const-decl name='ident' id='ident' export='yes' value='unknown'/>
  <const-decl name='error' id='error' export='yes' value='unknown'/>
  <const-decl name='invalid' id='invalid' export='yes' value='unknown'/>
  <const-decl name='noBuffering' id='noBuffering' export='yes' value='unknown'>
    <oberon-doc>
      <summary>When set output is not buffered.</summary>
      <p pad-after='yes' no-indent='yes'>When set output is not buffered.  This allows interactive output prompts to appear as soon as they are written.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='returnCtrlChars' id='returnCtrlChars' export='yes' value='unknown'>
    <oberon-doc>
      <summary>When set the <oberon-type href='#Reader'>Reader</oberon-type> or <oberon-type href='#Scanner'>Scanner</oberon-type> returns EOL &amp; TAB characters.</summary>
      <p pad-after='yes' no-indent='yes'>When set the <oberon-type href='#Reader'>Reader</oberon-type> or <oberon-type href='#Scanner'>Scanner</oberon-type> returns EOL &amp; TAB characters.  Otherwise they are treated like whitespace.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='interpretBools' id='interpretBools' export='yes' value='unknown'>
    <oberon-doc>
      <summary>When set the <oberon-type href='#Scanner'>Scanner</oberon-type> returns truth values of the strings <code>TRUE</code> and <code>FALSE</code>.</summary>
      <p pad-after='yes' no-indent='yes'>When set the <oberon-type href='#Scanner'>Scanner</oberon-type> returns truth values of the strings <code>TRUE</code> and <code>FALSE</code>.  Otherwise it returns them as strings.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='interpretSets' id='interpretSets' export='yes' value='unknown'>
    <oberon-doc>
      <summary>When set the <oberon-type href='#Scanner'>Scanner</oberon-type> returns a set value of the string set representation.</summary>
      <p pad-after='yes' no-indent='yes'>When set the <oberon-type href='#Scanner'>Scanner</oberon-type> returns a set value of the string set representation.  Otherwise it returns the brace, comma, and numbers individually.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='interpretStrings' id='interpretStrings' export='yes' value='unknown'>
    <oberon-doc>
      <summary>When set the <oberon-type href='#Scanner'>Scanner</oberon-type> returns a complete string contained within open and closing quotes.</summary>
      <p pad-after='yes' no-indent='yes'>When set the <oberon-type href='#Scanner'>Scanner</oberon-type> returns a complete string contained within open and closing quotes.  Otherwise it returns the quote characters and string contents as separate tokens.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='useSignedNumbers' id='useSignedNumbers' export='yes' value='unknown'>
    <oberon-doc>
      <summary>When set the <oberon-type href='#Scanner'>Scanner</oberon-type> returns a complete signed number.</summary>
      <p pad-after='yes' no-indent='yes'>When set the <oberon-type href='#Scanner'>Scanner</oberon-type> returns a complete signed number.  Otherwise it returns the sign characters and the number tokens separately.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='defReaderOptions' id='defReaderOptions' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Default reader options.</summary>
      <p pad-after='yes' no-indent='yes'>Default reader options.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='defWriterOptions' id='defWriterOptions' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Default writer options.</summary>
      <p pad-after='yes' no-indent='yes'>Default writer options.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='defScannerOptions' id='defScannerOptions' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Default scanner options: interpret boolean, set, and string values, and signed integer values.</summary>
      <p pad-after='yes' no-indent='yes'>Default scanner options: interpret boolean, set, and string values, and signed integer values.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='maxLengthEol' id='maxLengthEol' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Maximum length of an end of line character sequence.</summary>
      <p pad-after='yes' no-indent='yes'>Maximum length of an end of line character sequence.  This value is system dependent, and always larger or equal to 2.</p>
    </oberon-doc>
  </const-decl>
  <type-decl name='String' id='String' export='yes'>
    <type>
      <array>
        <length/>
        <element-type>
          <type-name module='#predef' name='CHAR'/>
        </element-type>
      </array>
    </type>
  </type-decl>
  <import-decl name='-RT0' id='-RT0' export='no' module='RT0'/>
  <import-decl name='-Object' id='-Object' export='no' module='Object'/>
  <import-decl name='-Exception' id='-Exception' export='no' module='Exception'/>
  <class name='Reader'>
    <type-decl name='Reader' id='Reader' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ReaderDesc' href='#ReaderDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ReaderDesc' id='ReaderDesc' export='yes'>
      <type>
        <record>
          <field-decl name='res' id='ReaderDesc.res' export='yes'>
            <type>
              <type-name module='Msg' name='Msg' href='Msg#Msg'/>
            </type>
          </field-decl>
          <field-decl name='opt' id='ReaderDesc.opt' export='read-only'>
            <oberon-doc>
              <summary>Current reader options.</summary>
              <p pad-after='yes' no-indent='yes'>Current reader options.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='SET'/>
            </type>
          </field-decl>
          <field-decl name='byteReader' id='ReaderDesc.byteReader' export='read-only'>
            <oberon-doc>
              <summary>Binary reader underneath this text reader.</summary>
              <p pad-after='yes' no-indent='yes'>Binary reader underneath this text reader.  This field should only be used by extensions of this type.</p>
            </oberon-doc>
            <type>
              <type-name module='Channel' name='Reader' href='Channel#Reader'/>
            </type>
          </field-decl>
          <field-decl name='base' id='ReaderDesc.base' export='read-only'>
            <oberon-doc>
              <summary>The channel on which this reader is operating.</summary>
              <p pad-after='yes' no-indent='yes'>The channel on which this reader is operating.</p>
            </oberon-doc>
            <type>
              <type-name module='Channel' name='Channel' href='Channel#Channel'/>
            </type>
          </field-decl>
          <field-decl name='eol' id='ReaderDesc.eol' export='read-only'>
            <oberon-doc>
              <summary>Character sequence of the end of line marker.</summary>
              <p pad-after='yes' no-indent='yes'>Character sequence of the end of line marker.  All characters have a code less than <samp>20X</samp>.  The end of line marker may contain the character <samp>0X</samp>, which means its length must be stored in a separate field.  The eol marker cannot be empty, and it is required to contain control characters with an ASCII code in <samp>00X..1FX</samp>.</p>
            </oberon-doc>
            <type>
              <array>
                <length/>
                <element-type>
                  <type-name module='#predef' name='CHAR'/>
                </element-type>
              </array>
            </type>
          </field-decl>
          <field-decl name='eolLen' id='ReaderDesc.eolLen' export='read-only'>
            <oberon-doc>
              <summary>Number of characters in <oberon-field href='#ReaderDesc.eol'>eol</oberon-field>.</summary>
              <p pad-after='yes' no-indent='yes'>Number of characters in <oberon-field href='#ReaderDesc.eol'>eol</oberon-field>.  <samp>-1</samp> means auto detect, which is the default.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='INTEGER'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='Pos' id='ReaderDesc.Pos' export='yes'>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.Pos.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ClearError' id='ReaderDesc.ClearError' export='yes'>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ClearError.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <procedure name='Available' id='ReaderDesc.Available' export='yes'>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.Available.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='SetPos' id='ReaderDesc.SetPos' export='yes'>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.SetPos.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='newPos' id='ReaderDesc.SetPos.newPos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetOpts' id='ReaderDesc.SetOpts' export='yes'>
      <oberon-doc>
        <summary>Set the reader options <oberon-field href='#ReaderDesc.opt'>r.opt</oberon-field>.</summary>
        <p pad-after='yes' no-indent='yes'>Set the reader options <oberon-field href='#ReaderDesc.opt'>r.opt</oberon-field>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.SetOpts.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='opts' id='ReaderDesc.SetOpts.opts' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='SET'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetEol' id='ReaderDesc.SetEol' export='yes'>
      <oberon-doc>
        <summary>Sets new end of line marker.</summary>
        <p pad-after='yes' no-indent='yes'>Sets new end of line marker.  If the passed string marker does not fit into the field <oberon-field href='#ReaderDesc.eol'>r.eol</oberon-field>, or it does contain a character greater or equal to space (<samp> </samp>), then <oberon-field href='#ReaderDesc.res'>r.res</oberon-field> is set to <oberon-const href='#invalidFormat'>invalidFormat</oberon-const>.</p>
        <p pad-after='yes' no-indent='no'>A marker length <samp>markerLen=-1</samp> enables auto detection of the end-of-line convention used by the channel.  The channel is required to use one of the following eol markers:</p>
        <table pad-after='yes'>
          <table-row pad-after='yes'>
            <table-first-column pad-after='no'><code>LF</code></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'>used by Unix</p>
            </item>
          </table-row>
          <table-row pad-after='yes'>
            <table-first-column pad-after='no'><code>CR</code></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'>used by MacOS</p>
            </item>
          </table-row>
          <table-row pad-after='no'>
            <table-first-column pad-after='no'><code>CR/LF</code></table-first-column>
            <item pad-after='no'>
              <p pad-after='no' no-indent='yes'>used by MS-DOS and Windows</p>
            </item>
          </table-row>
        </table>
        <p pad-after='yes' no-indent='no'>Enabling auto detection introduces a (small) inconsistency: if the first line of the channel ends with a <code>CR</code>, then skipping over the complete eol marker of this line is not done at once iff the next character is a <code>LF</code>.  All reading procedures except for <oberon-proc href='#ReaderDesc.ReadChar'>Reader.ReadChar</oberon-proc> will automatically skip the spurious <code>LF</code>.</p>
        <p pad-after='yes' no-indent='no'>Example: Input is <samp>line1<code>CR</code><code>LF</code>line2</samp>.  The first <oberon-proc href='#ReaderDesc.ReadLine'>Reader.ReadLine</oberon-proc> leaves the reading position between <code>CR</code> and <code>LF</code>, and a second <oberon-proc href='#ReaderDesc.ReadLine'>Reader.ReadLine</oberon-proc> skips automagically the <code>LF</code> and returns <samp>line2</samp>.  But if the second operation is a <oberon-proc href='#ReaderDesc.ReadChar'>Reader.ReadChar</oberon-proc>, it will return <code>LF</code>, not <samp>l</samp>.</p>
        <p pad-after='yes' no-indent='no'>The reason for this is that <oberon-proc href='#ReaderDesc.ReadChar'>Reader.ReadChar</oberon-proc> is the only operation that can look at parts of an multi-byte end-of-line marker, while such a marker is an atomic entity for all other read operations if the channel is read sequentially.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'>(r.Res() = done) &amp; ((markerLen = -1) OR (1 &lt;= markerLen &lt; LEN (marker))) &amp; (markerLen &lt;= maxLengthEol) &amp; (for all i: marker[i] &lt; 20X)</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.SetEol.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='marker' id='ReaderDesc.SetEol.marker' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <parameter-decl name='markerLen' id='ReaderDesc.SetEol.markerLen' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='INTEGER'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadChar' id='ReaderDesc.ReadChar' export='yes'>
      <oberon-doc>
        <summary>Read a character.</summary>
        <p pad-after='yes' no-indent='yes'>Read a character.  <emph>Note</emph>: No new characters will be read if an error has occurred.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadChar.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='ch' id='ReaderDesc.ReadChar.ch' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='CHAR'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='Eol' id='ReaderDesc.Eol' export='yes'>
      <oberon-doc>
        <summary>Return <code>TRUE</code> if the character at the current position is the system-dependent end-of-line character sequence or the last character has been read.</summary>
        <p pad-after='yes' no-indent='yes'>Return <code>TRUE</code> if the character at the current position is the system-dependent end-of-line character sequence or the last character has been read.  If <samp>r.res # done</samp>, then result is TRUE.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.Eol.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='BOOLEAN'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ReadLn' id='ReaderDesc.ReadLn' export='yes'>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadLn.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadString' id='ReaderDesc.ReadString' export='yes'>
      <oberon-doc>
        <summary>Reads an Oberon-2 string literal.</summary>
        <p pad-after='yes' no-indent='yes'>Reads an Oberon-2 string literal.  Illegal chars terminate with <oberon-const href='#invalidFormat'>invalidFormat</oberon-const>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>input = [whitespace] '"' {char} '"' | [whitespace] "'" {char} "'"</samp>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadString.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='s' id='ReaderDesc.ReadString.s' export='no' variable-parameter='yes'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadLine' id='ReaderDesc.ReadLine' export='yes'>
      <oberon-doc>
        <summary>Reads characters until an end of line character is encountered, or the array <oberon-param href='#ReaderDesc.ReadLine.s'>s</oberon-param> is full.</summary>
        <p pad-after='yes' no-indent='yes'>Reads characters until an end of line character is encountered, or the array <oberon-param href='#ReaderDesc.ReadLine.s'>s</oberon-param> is full.  <emph>Caution</emph>: If reading multiple lines of input and an integer, real, etc. has just been read, the channel may be positioned at a eol character and this method will return an empty string.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadLine.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='s' id='ReaderDesc.ReadLine.s' export='no' variable-parameter='yes'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadIdentifier' id='ReaderDesc.ReadIdentifier' export='yes'>
      <oberon-doc>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>input = [whitespace] letter {letter | digit}</samp></p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadIdentifier.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='s' id='ReaderDesc.ReadIdentifier.s' export='no' variable-parameter='yes'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadBool' id='ReaderDesc.ReadBool' export='yes'>
      <oberon-doc>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>input=[whitespace] ["TRUE"|"FALSE"]</samp></p>
        </pre-cond>
        <post-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>bool=TRUE</samp> iff input equals <samp>TRUE</samp> and <samp>bool=FALSE</samp> iff input equals <samp>FALSE</samp>.  Result is undefined otherwise.</p>
        </post-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadBool.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='bool' id='ReaderDesc.ReadBool.bool' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='BOOLEAN'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadLInt' id='ReaderDesc.ReadLInt' export='yes'>
      <oberon-doc>
        <summary>Returns the long integer constant <oberon-param href='#ReaderDesc.ReadLInt.lint'>lint</oberon-param> at the current position according to the format: <samp>IntConst = [whitespace] ["+"|"-"] digit {digit}</samp>.</summary>
        <p pad-after='yes' no-indent='yes'>Returns the long integer constant <oberon-param href='#ReaderDesc.ReadLInt.lint'>lint</oberon-param> at the current position according to the format: <samp>IntConst = [whitespace] ["+"|"-"] digit {digit}</samp>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadLInt.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='lint' id='ReaderDesc.ReadLInt.lint' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadHex' id='ReaderDesc.ReadHex' export='yes'>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadHex.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='lint' id='ReaderDesc.ReadHex.lint' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadInt' id='ReaderDesc.ReadInt' export='yes'>
      <oberon-doc>
        <summary>As <oberon-proc href='#ReaderDesc.ReadLInt'>Reader.ReadLInt</oberon-proc>.</summary>
        <p pad-after='yes' no-indent='yes'>As <oberon-proc href='#ReaderDesc.ReadLInt'>Reader.ReadLInt</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadInt.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='int' id='ReaderDesc.ReadInt.int' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='INTEGER'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadSInt' id='ReaderDesc.ReadSInt' export='yes'>
      <oberon-doc>
        <summary>As <oberon-proc href='#ReaderDesc.ReadLInt'>Reader.ReadLInt</oberon-proc>.</summary>
        <p pad-after='yes' no-indent='yes'>As <oberon-proc href='#ReaderDesc.ReadLInt'>Reader.ReadLInt</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadSInt.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='sint' id='ReaderDesc.ReadSInt.sint' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='SHORTINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadLReal' id='ReaderDesc.ReadLReal' export='yes'>
      <oberon-doc>
        <summary>Returns the long real constant <oberon-param href='#ReaderDesc.ReadLReal.lreal'>lreal</oberon-param> at the current position according to the format <samp>LongRealConst = [whitespace] ["+" | "-"] digit {digit} ["." {digit} [exponent]]</samp> where <samp>exponent = ("E" | "D") ("+" | "-") digit {digit}</samp>.</summary>
        <p pad-after='yes' no-indent='yes'>Returns the long real constant <oberon-param href='#ReaderDesc.ReadLReal.lreal'>lreal</oberon-param> at the current position according to the format <samp>LongRealConst = [whitespace] ["+" | "-"] digit {digit} ["." {digit} [exponent]]</samp> where <samp>exponent = ("E" | "D") ("+" | "-") digit {digit}</samp>.</p>
        <p pad-after='yes' no-indent='no'>Note: Because of implementation restrictions, a real representation with more than 1023 characters causes an <oberon-const href='#invalidFormat'>invalidFormat</oberon-const> error.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadLReal.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='lreal' id='ReaderDesc.ReadLReal.lreal' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='LONGREAL'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadReal' id='ReaderDesc.ReadReal' export='yes'>
      <oberon-doc>
        <summary>As <oberon-proc href='#ReaderDesc.ReadLReal'>Reader.ReadLReal</oberon-proc>.</summary>
        <p pad-after='yes' no-indent='yes'>As <oberon-proc href='#ReaderDesc.ReadLReal'>Reader.ReadLReal</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadReal.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='real' id='ReaderDesc.ReadReal.real' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='REAL'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadSet' id='ReaderDesc.ReadSet' export='yes'>
      <oberon-doc>
        <summary>Read a set described in Oberon-2 set notation into <oberon-param href='#ReaderDesc.ReadSet.s'>s</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Read a set described in Oberon-2 set notation into <oberon-param href='#ReaderDesc.ReadSet.s'>s</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadSet.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='s' id='ReaderDesc.ReadSet.s' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='SET'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='InitReader' id='InitReader' export='yes'>
      <formal-parameters>
        <parameter-decl name='r' id='InitReader.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </parameter-decl>
        <parameter-decl name='ch' id='InitReader.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='Channel' name='Channel' href='Channel#Channel'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ConnectReader' id='ConnectReader' export='yes'>
      <formal-parameters>
        <parameter-decl name='ch' id='ConnectReader.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='Channel' name='Channel' href='Channel#Channel'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='Reader' href='#Reader'/>
        </result-type>
      </formal-parameters>
    </procedure>
  </class>
  <class name='Writer'>
    <type-decl name='Writer' id='Writer' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='WriterDesc' href='#WriterDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='WriterDesc' id='WriterDesc' export='yes'>
      <type>
        <record>
          <field-decl name='res' id='WriterDesc.res' export='yes'>
            <type>
              <type-name module='Msg' name='Msg' href='Msg#Msg'/>
            </type>
          </field-decl>
          <field-decl name='opt' id='WriterDesc.opt' export='read-only'>
            <oberon-doc>
              <summary>Current writer options.</summary>
              <p pad-after='yes' no-indent='yes'>Current writer options.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='SET'/>
            </type>
          </field-decl>
          <field-decl name='byteWriter' id='WriterDesc.byteWriter' export='read-only'>
            <oberon-doc>
              <summary>Binary writer underneath this text writer.</summary>
              <p pad-after='yes' no-indent='yes'>Binary writer underneath this text writer.  This field should only be used by extensions of this type.</p>
            </oberon-doc>
            <type>
              <type-name module='Channel' name='Writer' href='Channel#Writer'/>
            </type>
          </field-decl>
          <field-decl name='base' id='WriterDesc.base' export='read-only'>
            <oberon-doc>
              <summary>The channel on which this writer is operating.</summary>
              <p pad-after='yes' no-indent='yes'>The channel on which this writer is operating.</p>
            </oberon-doc>
            <type>
              <type-name module='Channel' name='Channel' href='Channel#Channel'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='Pos' id='WriterDesc.Pos' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.Pos.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='SetPos' id='WriterDesc.SetPos' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.SetPos.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='newPos' id='WriterDesc.SetPos.newPos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ClearError' id='WriterDesc.ClearError' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.ClearError.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetOpts' id='WriterDesc.SetOpts' export='yes'>
      <oberon-doc>
        <summary>Set the writer options <oberon-field href='#WriterDesc.opt'>w.opt</oberon-field>.</summary>
        <p pad-after='yes' no-indent='yes'>Set the writer options <oberon-field href='#WriterDesc.opt'>w.opt</oberon-field>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.SetOpts.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='opts' id='WriterDesc.SetOpts.opts' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='SET'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetEol' id='WriterDesc.SetEol' export='yes'>
      <oberon-doc>
        <summary>Sets new end of line marker.</summary>
        <p pad-after='yes' no-indent='yes'>Sets new end of line marker.  If the passed string marker does not fit into the writer's field <samp>w.eol</samp>, then <oberon-field href='#WriterDesc.res'>w.res</oberon-field> is set to <oberon-const href='#invalidFormat'>invalidFormat</oberon-const>.  The empty marker is permitted.  The default value for newly created writer is <oberon-var href='CharClass#systemEol'>CharClass.systemEol</oberon-var>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'>(w.res = done) &amp; (0 &lt;= markerLen &lt; LEN (marker)) &amp; (markerLen &lt;= maxLengthEol)</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.SetEol.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='marker' id='WriterDesc.SetEol.marker' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <parameter-decl name='markerLen' id='WriterDesc.SetEol.markerLen' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='INTEGER'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteString' id='WriterDesc.WriteString' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteString.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='s' id='WriterDesc.WriteString.s' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteObject' id='WriterDesc.WriteObject' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteObject.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='obj' id='WriterDesc.WriteObject.obj' export='no' variable-parameter='no'>
          <type>
            <type-name module='Object' name='Object' href='Object#Object'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteBool' id='WriterDesc.WriteBool' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteBool.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='bool' id='WriterDesc.WriteBool.bool' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='BOOLEAN'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteChar' id='WriterDesc.WriteChar' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteChar.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='ch' id='WriterDesc.WriteChar.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='CHAR'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteLInt' id='WriterDesc.WriteLInt' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteLInt.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='lint' id='WriterDesc.WriteLInt.lint' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='n' id='WriterDesc.WriteLInt.n' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteSInt' id='WriterDesc.WriteSInt' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteSInt.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='sint' id='WriterDesc.WriteSInt.sint' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='SHORTINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='n' id='WriterDesc.WriteSInt.n' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteInt' id='WriterDesc.WriteInt' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteInt.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='int' id='WriterDesc.WriteInt.int' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='INTEGER'/>
          </type>
        </parameter-decl>
        <parameter-decl name='n' id='WriterDesc.WriteInt.n' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteHex' id='WriterDesc.WriteHex' export='yes'>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteHex.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='lint' id='WriterDesc.WriteHex.lint' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='d' id='WriterDesc.WriteHex.d' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteLReal' id='WriterDesc.WriteLReal' export='yes'>
      <oberon-doc>
        <summary>Writes the value <oberon-param href='#WriterDesc.WriteLReal.lreal'>lreal</oberon-param> in the format produced by <oberon-proc href='LRealStr#RealToFloat'>LRealStr.RealToFloat</oberon-proc>.</summary>
        <p pad-after='yes' no-indent='yes'>Writes the value <oberon-param href='#WriterDesc.WriteLReal.lreal'>lreal</oberon-param> in the format produced by <oberon-proc href='LRealStr#RealToFloat'>LRealStr.RealToFloat</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteLReal.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='lreal' id='WriterDesc.WriteLReal.lreal' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGREAL'/>
          </type>
        </parameter-decl>
        <parameter-decl name='n' id='WriterDesc.WriteLReal.n' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='k' id='WriterDesc.WriteLReal.k' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteReal' id='WriterDesc.WriteReal' export='yes'>
      <oberon-doc>
        <summary>As <oberon-proc href='#WriterDesc.WriteLReal'>Writer.WriteLReal</oberon-proc>.</summary>
        <p pad-after='yes' no-indent='yes'>As <oberon-proc href='#WriterDesc.WriteLReal'>Writer.WriteLReal</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteReal.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='real' id='WriterDesc.WriteReal.real' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='REAL'/>
          </type>
        </parameter-decl>
        <parameter-decl name='n' id='WriterDesc.WriteReal.n' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='k' id='WriterDesc.WriteReal.k' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteLRealFix' id='WriterDesc.WriteLRealFix' export='yes'>
      <oberon-doc>
        <summary>Writes the value <oberon-param href='#WriterDesc.WriteLRealFix.lreal'>lreal</oberon-param> in the format produced by <oberon-proc href='LRealStr#RealToFixed'>LRealStr.RealToFixed</oberon-proc>.</summary>
        <p pad-after='yes' no-indent='yes'>Writes the value <oberon-param href='#WriterDesc.WriteLRealFix.lreal'>lreal</oberon-param> in the format produced by <oberon-proc href='LRealStr#RealToFixed'>LRealStr.RealToFixed</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteLRealFix.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='lreal' id='WriterDesc.WriteLRealFix.lreal' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='LONGREAL'/>
          </type>
        </parameter-decl>
        <parameter-decl name='n' id='WriterDesc.WriteLRealFix.n' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='k' id='WriterDesc.WriteLRealFix.k' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteRealFix' id='WriterDesc.WriteRealFix' export='yes'>
      <oberon-doc>
        <summary>As <oberon-proc href='#WriterDesc.WriteLRealFix'>Writer.WriteLRealFix</oberon-proc>.</summary>
        <p pad-after='yes' no-indent='yes'>As <oberon-proc href='#WriterDesc.WriteLRealFix'>Writer.WriteLRealFix</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteRealFix.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='real' id='WriterDesc.WriteRealFix.real' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='REAL'/>
          </type>
        </parameter-decl>
        <parameter-decl name='n' id='WriterDesc.WriteRealFix.n' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='k' id='WriterDesc.WriteRealFix.k' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteLRealEng' id='WriterDesc.WriteLRealEng' export='yes'>
      <oberon-doc>
        <summary>Writes the value <oberon-param href='#WriterDesc.WriteLRealEng.lreal'>lreal</oberon-param> in the format produced by <oberon-proc href='LRealStr#RealToEng'>LRealStr.RealToEng</oberon-proc>.</summary>
        <p pad-after='yes' no-indent='yes'>Writes the value <oberon-param href='#WriterDesc.WriteLRealEng.lreal'>lreal</oberon-param> in the format produced by <oberon-proc href='LRealStr#RealToEng'>LRealStr.RealToEng</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteLRealEng.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='lreal' id='WriterDesc.WriteLRealEng.lreal' export='no' variable-parameter='yes'>
          <type>
            <type-name module='#predef' name='LONGREAL'/>
          </type>
        </parameter-decl>
        <parameter-decl name='n' id='WriterDesc.WriteLRealEng.n' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='k' id='WriterDesc.WriteLRealEng.k' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteRealEng' id='WriterDesc.WriteRealEng' export='yes'>
      <oberon-doc>
        <summary>As <oberon-proc href='#WriterDesc.WriteLRealEng'>Writer.WriteLRealEng</oberon-proc>.</summary>
        <p pad-after='yes' no-indent='yes'>As <oberon-proc href='#WriterDesc.WriteLRealEng'>Writer.WriteLRealEng</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteRealEng.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='real' id='WriterDesc.WriteRealEng.real' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='REAL'/>
          </type>
        </parameter-decl>
        <parameter-decl name='n' id='WriterDesc.WriteRealEng.n' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='k' id='WriterDesc.WriteRealEng.k' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteSet' id='WriterDesc.WriteSet' export='yes'>
      <oberon-doc>
        <summary>Write <oberon-param href='#WriterDesc.WriteSet.s'>s</oberon-param> in Oberon-2 set notation.</summary>
        <p pad-after='yes' no-indent='yes'>Write <oberon-param href='#WriterDesc.WriteSet.s'>s</oberon-param> in Oberon-2 set notation.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteSet.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='s' id='WriterDesc.WriteSet.s' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='SET'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteLn' id='WriterDesc.WriteLn' export='yes'>
      <oberon-doc>
        <summary>Write a newline.</summary>
        <p pad-after='yes' no-indent='yes'>Write a newline.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteLn.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <procedure name='InitWriter' id='InitWriter' export='yes'>
      <formal-parameters>
        <parameter-decl name='w' id='InitWriter.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </parameter-decl>
        <parameter-decl name='ch' id='InitWriter.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='Channel' name='Channel' href='Channel#Channel'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ConnectWriter' id='ConnectWriter' export='yes'>
      <formal-parameters>
        <parameter-decl name='ch' id='ConnectWriter.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='Channel' name='Channel' href='Channel#Channel'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='Writer' href='#Writer'/>
        </result-type>
      </formal-parameters>
    </procedure>
  </class>
  <class name='Scanner'>
    <type-decl name='Scanner' id='Scanner' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ScannerDesc' href='#ScannerDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ScannerDesc' id='ScannerDesc' export='yes'>
      <type>
        <record>
          <field-decl name='res' id='ScannerDesc.res' export='yes'>
            <type>
              <type-name module='Msg' name='Msg' href='Msg#Msg'/>
            </type>
          </field-decl>
          <field-decl name='r' id='ScannerDesc.r' export='read-only'>
            <oberon-doc>
              <summary>Text reader underneath this scanner.</summary>
              <p pad-after='yes' no-indent='yes'>Text reader underneath this scanner.  This field should only be used by extensions of this type.</p>
            </oberon-doc>
            <type>
              <type-name name='Reader' href='#Reader'/>
            </type>
          </field-decl>
          <field-decl name='base' id='ScannerDesc.base' export='read-only'>
            <type>
              <type-name module='Channel' name='Channel' href='Channel#Channel'/>
            </type>
          </field-decl>
          <field-decl name='opt' id='ScannerDesc.opt' export='read-only'>
            <oberon-doc>
              <summary>Current scanner options.</summary>
              <p pad-after='yes' no-indent='yes'>Current scanner options.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='SET'/>
            </type>
          </field-decl>
          <field-decl name='type' id='ScannerDesc.type' export='read-only'>
            <oberon-doc>
              <summary>Type of the most recently scanned token.</summary>
              <p pad-after='yes' no-indent='yes'>Type of the most recently scanned token.  One of <oberon-const href='#char'>char</oberon-const>, <oberon-const href='#string'>string</oberon-const>, <oberon-const href='#int'>int</oberon-const>, <oberon-const href='#real'>real</oberon-const>, <oberon-const href='#bool'>bool</oberon-const>, <oberon-const href='#set'>set</oberon-const>, <oberon-const href='#tab'>tab</oberon-const>, <oberon-const href='#line'>line</oberon-const>, <oberon-const href='#ident'>ident</oberon-const>, <oberon-const href='#error'>error</oberon-const>, or <oberon-const href='#invalid'>invalid</oberon-const>.  Please note that depending on the scanner options, some input data is reported under different types.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='INTEGER'/>
            </type>
          </field-decl>
          <field-decl name='pos' id='ScannerDesc.pos' export='read-only'>
            <oberon-doc>
              <summary>Position of current token in the channel.</summary>
              <p pad-after='yes' no-indent='yes'>Position of current token in the channel.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='LONGINT'/>
            </type>
          </field-decl>
          <field-decl name='lines' id='ScannerDesc.lines' export='read-only'>
            <oberon-doc>
              <summary>Total of scanned eol markers.</summary>
              <p pad-after='yes' no-indent='yes'>Total of scanned eol markers.  Counting starts at zero.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='LONGINT'/>
            </type>
          </field-decl>
          <field-decl name='int' id='ScannerDesc.int' export='read-only'>
            <oberon-doc>
              <summary>Integer from channel.</summary>
              <p pad-after='yes' no-indent='yes'>Integer from channel.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='LONGINT'/>
            </type>
          </field-decl>
          <field-decl name='real' id='ScannerDesc.real' export='read-only'>
            <oberon-doc>
              <summary>Real from channel.</summary>
              <p pad-after='yes' no-indent='yes'>Real from channel.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='LONGREAL'/>
            </type>
          </field-decl>
          <field-decl name='char' id='ScannerDesc.char' export='read-only'>
            <oberon-doc>
              <summary>Char from channel.</summary>
              <p pad-after='yes' no-indent='yes'>Char from channel.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='CHAR'/>
            </type>
          </field-decl>
          <field-decl name='string' id='ScannerDesc.string' export='read-only'>
            <oberon-doc>
              <summary>String from channel.</summary>
              <p pad-after='yes' no-indent='yes'>String from channel.</p>
            </oberon-doc>
            <type>
              <type-name name='String' href='#String'/>
            </type>
          </field-decl>
          <field-decl name='set' id='ScannerDesc.set' export='read-only'>
            <oberon-doc>
              <summary>Set from channel.</summary>
              <p pad-after='yes' no-indent='yes'>Set from channel.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='SET'/>
            </type>
          </field-decl>
          <field-decl name='bool' id='ScannerDesc.bool' export='read-only'>
            <oberon-doc>
              <summary>Boolean from channel.</summary>
              <p pad-after='yes' no-indent='yes'>Boolean from channel.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='BOOLEAN'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='Pos' id='ScannerDesc.Pos' export='yes'>
      <oberon-doc>
        <summary>Return position of the look-ahead character.</summary>
        <p pad-after='yes' no-indent='yes'>Return position of the look-ahead character.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='ScannerDesc.Pos.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Scanner' href='#Scanner'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ClearError' id='ScannerDesc.ClearError' export='yes'>
      <formal-parameters>
        <receiver-decl name='s' id='ScannerDesc.ClearError.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Scanner' href='#Scanner'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <procedure name='Available' id='ScannerDesc.Available' export='yes'>
      <formal-parameters>
        <receiver-decl name='s' id='ScannerDesc.Available.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Scanner' href='#Scanner'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='SetPos' id='ScannerDesc.SetPos' export='yes'>
      <formal-parameters>
        <receiver-decl name='s' id='ScannerDesc.SetPos.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Scanner' href='#Scanner'/>
          </type>
        </receiver-decl>
        <parameter-decl name='pos' id='ScannerDesc.SetPos.pos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='Scan' id='ScannerDesc.Scan' export='yes'>
      <formal-parameters>
        <receiver-decl name='s' id='ScannerDesc.Scan.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Scanner' href='#Scanner'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetOpts' id='ScannerDesc.SetOpts' export='yes'>
      <formal-parameters>
        <receiver-decl name='s' id='ScannerDesc.SetOpts.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Scanner' href='#Scanner'/>
          </type>
        </receiver-decl>
        <parameter-decl name='opts' id='ScannerDesc.SetOpts.opts' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='SET'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetEol' id='ScannerDesc.SetEol' export='yes'>
      <formal-parameters>
        <receiver-decl name='s' id='ScannerDesc.SetEol.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Scanner' href='#Scanner'/>
          </type>
        </receiver-decl>
        <parameter-decl name='marker' id='ScannerDesc.SetEol.marker' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='#predef' name='CHAR'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <parameter-decl name='markerLen' id='ScannerDesc.SetEol.markerLen' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='INTEGER'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='InitScanner' id='InitScanner' export='yes'>
      <formal-parameters>
        <parameter-decl name='s' id='InitScanner.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Scanner' href='#Scanner'/>
          </type>
        </parameter-decl>
        <parameter-decl name='ch' id='InitScanner.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='Channel' name='Channel' href='Channel#Channel'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ConnectScanner' id='ConnectScanner' export='yes'>
      <formal-parameters>
        <parameter-decl name='ch' id='ConnectScanner.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='Channel' name='Channel' href='Channel#Channel'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='Scanner' href='#Scanner'/>
        </result-type>
      </formal-parameters>
    </procedure>
  </class>
  <class name='ErrorContext'>
    <type-decl name='ErrorContext' id='ErrorContext' export='no'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ErrorContextDesc' href='#ErrorContextDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ErrorContextDesc' id='ErrorContextDesc' export='yes'>
      <oberon-doc>
        <summary>This record is exported, so that extensions of Channel can access the error descriptions by extending <oberon-type href='#ErrorContextDesc'>ErrorContextDesc</oberon-type>.</summary>
        <p pad-after='yes' no-indent='yes'>This record is exported, so that extensions of Channel can access the error descriptions by extending <oberon-type href='#ErrorContextDesc'>ErrorContextDesc</oberon-type>.</p>
      </oberon-doc>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='GetTemplate' id='ErrorContextDesc.GetTemplate' export='yes'>
      <doc-inherited-from module='Msg' name='GetTemplate' class='Context' href='Msg#ContextDesc.GetTemplate'/>
      <oberon-doc>
        <summary>Returns a template string for the message <oberon-param href='#ErrorContextDesc.GetTemplate.msg'>msg</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Returns a template string for the message <oberon-param href='#ErrorContextDesc.GetTemplate.msg'>msg</oberon-param>.  The string may contain attribute references.  Instead of the reference <samp>${foo}</samp>, the procedure <oberon-proc href='Msg#MsgDesc.GetText'>Msg.GetText</oberon-proc> will insert the textual representation of the attribute with the name <samp>foo</samp>.  The special reference <samp>${MSG_CONTEXT}</samp> is replaced by the value of <oberon-field href='Msg#ContextDesc.id'>context.id</oberon-field>, and <samp>${MSG_CODE}</samp> with <oberon-field href='Msg#MsgDesc.code'>msg.code</oberon-field>.</p>
        <p pad-after='yes' no-indent='no'>The default implementation returns this string:</p>
        <example pad-after='yes'>MSG_CONTEXT: ${MSG_CONTEXT}
MSG_CODE: ${MSG_CODE}
attribute_name: ${attribute_name}
</example>
        <p pad-after='yes' no-indent='no'>The last line is repeated for every attribute name.  The lines are separated by <oberon-const href='CharClass#eol'>CharClass.eol</oberon-const>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#ErrorContextDesc.GetTemplate.msg'>msg</oberon-param> is not <code>NIL</code>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='context' id='ErrorContextDesc.GetTemplate.context' export='no' variable-parameter='no'>
          <type>
            <type-name name='ErrorContext' href='#ErrorContext'/>
          </type>
        </receiver-decl>
        <parameter-decl name='msg' id='ErrorContextDesc.GetTemplate.msg' export='no' variable-parameter='no'>
          <type>
            <type-name module='Msg' name='Msg' href='Msg#Msg'/>
          </type>
        </parameter-decl>
        <parameter-decl name='templ' id='ErrorContextDesc.GetTemplate.templ' export='no' variable-parameter='yes'>
          <type>
            <type-name module='Msg' name='LString' href='Msg#LString'/>
          </type>
        </parameter-decl>
      </formal-parameters>
      <redefined-method module='Msg' name='GetTemplate' class='Context' href='Msg#ContextDesc.GetTemplate'/>
    </procedure>
    <base-class module='Msg' class='Context' href='Msg#Context'>
      <inherited-method module='Msg' name='GetTemplate' class='Context' href='Msg#ContextDesc.GetTemplate'/>
      <inherited-field module='Msg' name='id' class='Context' href='Msg#ContextDesc.id'/>
    </base-class>
  </class>
  <module-ref name='Object'>
    <ref-target type='html' relative-uri='Object.html'/>
  </module-ref>
  <module-ref name='Msg'>
    <ref-target type='html' relative-uri='Msg.html'/>
  </module-ref>
  <module-ref name='LRealStr'>
    <ref-target type='html' relative-uri='LRealStr.html'/>
  </module-ref>
  <module-ref name='Channel'>
    <ref-target type='html' relative-uri='Channel.html'/>
  </module-ref>
  <module-ref name='CharClass'>
    <ref-target type='html' relative-uri='CharClass.html'/>
  </module-ref>
</interface-description>
