<?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='Msg' id=''>
  <oberon-doc>
    <p pad-after='yes' no-indent='yes'/>
    <p pad-after='yes' no-indent='no'>This module combines several concepts: messages, message attributes, message contexts, and message lists.  This four aspects make this module a little bit involved, but at the core it is actually very simple.</p>
    <p pad-after='yes' no-indent='no'>The topics attributes and contexts are primarily of interest for modules that generate messages.  They determine the content of the message, and how it can be translated into readable text.  A user will mostly be in the position of message consumer, and will be handed filled in message objects.  For a user, the typical operation will be to convert a message into descriptive text (see methods <oberon-proc href='#MsgDesc.GetText'>Msg.GetText</oberon-proc> and <oberon-proc href='#MsgDesc.GetLText'>Msg.GetLText</oberon-proc>).</p>
    <p pad-after='yes' no-indent='no'>Message lists are a convenience feature for modules like parsers, which normally do not abort after a single error message.  Usually, they try to continue their work after an error, looking for more problems and possibly emitting more error messages.</p>
    <p pad-after='yes' no-indent='no'/>
  </oberon-doc>
  <import-decl name='CharClass' id='CharClass' export='no' module='CharClass'/>
  <const-decl name='sizeAttrName' id='sizeAttrName' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Maximum length of the attribute name for <oberon-proc href='#InitAttribute'>InitAttribute</oberon-proc>, <oberon-proc href='#NewIntAttrib'>NewIntAttrib</oberon-proc>, <oberon-proc href='#NewStringAttrib'>NewStringAttrib</oberon-proc>, <oberon-proc href='#NewLStringAttrib'>NewLStringAttrib</oberon-proc>, or <oberon-proc href='#NewMsgAttrib'>NewMsgAttrib</oberon-proc>.</summary>
      <p pad-after='yes' no-indent='yes'>Maximum length of the attribute name for <oberon-proc href='#InitAttribute'>InitAttribute</oberon-proc>, <oberon-proc href='#NewIntAttrib'>NewIntAttrib</oberon-proc>, <oberon-proc href='#NewStringAttrib'>NewStringAttrib</oberon-proc>, <oberon-proc href='#NewLStringAttrib'>NewLStringAttrib</oberon-proc>, or <oberon-proc href='#NewMsgAttrib'>NewMsgAttrib</oberon-proc>.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='sizeAttrReplacement' id='sizeAttrReplacement' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Maximum length of an attribute's replacement text.</summary>
      <p pad-after='yes' no-indent='yes'>Maximum length of an attribute's replacement text.</p>
    </oberon-doc>
  </const-decl>
  <type-decl name='Char' id='Char' export='yes'>
    <type>
      <type-name module='#predef' name='CHAR'/>
    </type>
  </type-decl>
  <type-decl name='String' id='String' export='yes'>
    <type>
      <array>
        <element-type>
          <type-name module='#predef' name='Char'/>
        </element-type>
      </array>
    </type>
  </type-decl>
  <type-decl name='StringPtr' id='StringPtr' export='yes'>
    <type>
      <pointer>
        <pointer-base>
          <type-name name='String' href='#String'/>
        </pointer-base>
      </pointer>
    </type>
  </type-decl>
  <type-decl name='LChar' id='LChar' export='yes'>
    <type>
      <type-name module='#predef' name='LONGCHAR'/>
    </type>
  </type-decl>
  <type-decl name='LString' id='LString' export='yes'>
    <type>
      <array>
        <element-type>
          <type-name module='#predef' name='LChar'/>
        </element-type>
      </array>
    </type>
  </type-decl>
  <type-decl name='LStringPtr' id='LStringPtr' export='yes'>
    <type>
      <pointer>
        <pointer-base>
          <type-name name='LString' href='#LString'/>
        </pointer-base>
      </pointer>
    </type>
  </type-decl>
  <type-decl name='Code' id='Code' export='yes'>
    <oberon-doc>
      <summary>Identifier for a message's content.</summary>
      <p pad-after='yes' no-indent='yes'>Identifier for a message's content.  Together with the message context, this value uniquely identifies the type of the message.</p>
    </oberon-doc>
    <type>
      <type-name module='#predef' name='LONGINT'/>
    </type>
  </type-decl>
  <procedure name='GetStringPtr' id='GetStringPtr' export='yes'>
    <oberon-doc>
      <summary>Creates a copy of <oberon-param href='#GetStringPtr.str'>str</oberon-param> on the heap and returns a pointer to it.</summary>
      <p pad-after='yes' no-indent='yes'>Creates a copy of <oberon-param href='#GetStringPtr.str'>str</oberon-param> on the heap and returns a pointer to it.</p>
    </oberon-doc>
    <formal-parameters>
      <parameter-decl name='str' id='GetStringPtr.str' export='no' variable-parameter='no'>
        <type>
          <type-name name='String' href='#String'/>
        </type>
      </parameter-decl>
      <result-type>
        <type-name name='StringPtr' href='#StringPtr'/>
      </result-type>
    </formal-parameters>
  </procedure>
  <procedure name='GetLStringPtr' id='GetLStringPtr' export='yes'>
    <oberon-doc>
      <summary>Creates a copy of <oberon-param href='#GetLStringPtr.str'>str</oberon-param> on the heap and returns a pointer to it.</summary>
      <p pad-after='yes' no-indent='yes'>Creates a copy of <oberon-param href='#GetLStringPtr.str'>str</oberon-param> on the heap and returns a pointer to it.</p>
    </oberon-doc>
    <formal-parameters>
      <parameter-decl name='str' id='GetLStringPtr.str' export='no' variable-parameter='no'>
        <type>
          <type-name name='LString' href='#LString'/>
        </type>
      </parameter-decl>
      <result-type>
        <type-name name='LStringPtr' href='#LStringPtr'/>
      </result-type>
    </formal-parameters>
  </procedure>
  <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='Attribute'>
    <type-decl name='Attribute' id='Attribute' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='AttributeDesc' href='#AttributeDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='AttributeDesc' id='AttributeDesc' export='yes'>
      <oberon-doc>
        <summary>An attribute is a <samp>(name, value)</samp> tuple, which can be associated with a message.</summary>
        <p pad-after='yes' no-indent='yes'>An attribute is a <samp>(name, value)</samp> tuple, which can be associated with a message.  When a message is tranlated into its readable version through the <oberon-proc href='#MsgDesc.GetText'>Msg.GetText</oberon-proc> function, the value part is first converted to some textual representation, and then inserted into the message's text.  Within a message, an attribute is uniquely identified by its name.</p>
      </oberon-doc>
      <type>
        <record>
          <field-decl name='nextAttrib' id='AttributeDesc.nextAttrib' export='read-only'>
            <oberon-doc>
              <summary>Points to the next attribute in the message's attribute list.</summary>
              <p pad-after='yes' no-indent='yes'>Points to the next attribute in the message's attribute list.</p>
            </oberon-doc>
            <type>
              <type-name name='Attribute' href='#Attribute'/>
            </type>
          </field-decl>
          <field-decl name='name' id='AttributeDesc.name' export='read-only'>
            <oberon-doc>
              <summary>The attribute name.</summary>
              <p pad-after='yes' no-indent='yes'>The attribute name.  Note that it is restricted to <oberon-const href='#sizeAttrName'>sizeAttrName</oberon-const> characters.</p>
            </oberon-doc>
            <type>
              <type-name name='StringPtr' href='#StringPtr'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='InitAttribute' id='InitAttribute' export='yes'>
      <oberon-doc>
        <summary>Initializes attribute object and sets its name.</summary>
        <p pad-after='yes' no-indent='yes'>Initializes attribute object and sets its name.</p>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='attr' id='InitAttribute.attr' export='no' variable-parameter='no'>
          <type>
            <type-name name='Attribute' href='#Attribute'/>
          </type>
        </parameter-decl>
        <parameter-decl name='name' id='InitAttribute.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReplacementText' id='AttributeDesc.ReplacementText' export='yes'>
      <oberon-doc>
        <summary>Converts attribute value into some textual representation.</summary>
        <p pad-after='yes' no-indent='yes'>Converts attribute value into some textual representation.  The length of the resulting string must not exceed <oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const> characters: <oberon-proc href='#MsgDesc.GetLText'>Msg.GetLText</oberon-proc> calls this procedure with a text buffer of <samp><oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const>+1</samp> bytes.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='attr' id='AttributeDesc.ReplacementText.attr' export='no' variable-parameter='no'>
          <type>
            <type-name name='Attribute' href='#Attribute'/>
          </type>
        </receiver-decl>
        <parameter-decl name='text' id='AttributeDesc.ReplacementText.text' export='no' variable-parameter='yes'>
          <type>
            <type-name name='LString' href='#LString'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
  </class>
  <class name='Context'>
    <type-decl name='Context' id='Context' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ContextDesc' href='#ContextDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ContextDesc' id='ContextDesc' export='yes'>
      <oberon-doc>
        <summary>Describes the context under which messages are converted into their textual representation.</summary>
        <p pad-after='yes' no-indent='yes'>Describes the context under which messages are converted into their textual representation.  Together, a message's context and its code identify the message type.  As a debugging aid, an identification string can be associated with a context object (see procedure <oberon-proc href='#InitContext'>InitContext</oberon-proc>).</p>
      </oberon-doc>
      <type>
        <record>
          <field-decl name='id' id='ContextDesc.id' export='read-only'>
            <oberon-doc>
              <summary>The textual id associated with the context instance.</summary>
              <p pad-after='yes' no-indent='yes'>The textual id associated with the context instance.  See procedure <oberon-proc href='#InitContext'>InitContext</oberon-proc>.</p>
            </oberon-doc>
            <type>
              <type-name name='StringPtr' href='#StringPtr'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='InitContext' id='InitContext' export='yes'>
      <oberon-doc>
        <summary>The string argument <oberon-param href='#InitContext.id'>id</oberon-param> should describe the message context to the programmer.</summary>
        <p pad-after='yes' no-indent='yes'>The string argument <oberon-param href='#InitContext.id'>id</oberon-param> should describe the message context to the programmer.  It should not appear in output generated for a program's user, or at least it should not be necessary for a user to interpret ths string to understand the message.  It is a good idea to use the module name of the context variable for the identifier.  If this is not sufficient to identify the variable, add the variable name to the string.</p>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='context' id='InitContext.context' export='no' variable-parameter='no'>
          <type>
            <type-name name='Context' href='#Context'/>
          </type>
        </parameter-decl>
        <parameter-decl name='id' id='InitContext.id' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='GetTemplate' id='ContextDesc.GetTemplate' export='yes'>
      <oberon-doc>
        <summary>Returns a template string for the message <oberon-param href='#ContextDesc.GetTemplate.msg'>msg</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Returns a template string for the message <oberon-param href='#ContextDesc.GetTemplate.msg'>msg</oberon-param>.  The string may contain attribute references.  Instead of the reference <samp>${foo}</samp>, the procedure <oberon-proc href='#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='#ContextDesc.id'>context.id</oberon-field>, and <samp>${MSG_CODE}</samp> with <oberon-field href='#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='#ContextDesc.GetTemplate.msg'>msg</oberon-param> is not <code>NIL</code>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='context' id='ContextDesc.GetTemplate.context' export='no' variable-parameter='no'>
          <type>
            <type-name name='Context' href='#Context'/>
          </type>
        </receiver-decl>
        <parameter-decl name='msg' id='ContextDesc.GetTemplate.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </parameter-decl>
        <parameter-decl name='templ' id='ContextDesc.GetTemplate.templ' export='no' variable-parameter='yes'>
          <type>
            <type-name name='LString' href='#LString'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
  </class>
  <class name='Msg'>
    <type-decl name='Msg' id='Msg' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='MsgDesc' href='#MsgDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='MsgDesc' id='MsgDesc' export='yes'>
      <oberon-doc>
        <summary>A message is an object that can be converted to human readable text and presented to a program's user.</summary>
        <p pad-after='yes' no-indent='yes'>A message is an object that can be converted to human readable text and presented to a program's user.  Within the OOC library, messages are used to store errors in the I/O modules, and the XML library uses them to create an error list when parsing an XML document.</p>
        <p pad-after='yes' no-indent='no'>A message's type is uniquely identified by its context and its code.  Using these two attributes, a message can be converted to text.  The text may contain placeholders, which are filled by the textual representation of attribute values associated with the message.</p>
      </oberon-doc>
      <type>
        <record>
          <field-decl name='nextMsg' id='MsgDesc.nextMsg' export='read-only'>
            <type>
              <type-name name='Msg' href='#Msg'/>
            </type>
          </field-decl>
          <field-decl name='prevMsg' id='MsgDesc.prevMsg' export='read-only'>
            <oberon-doc>
              <summary>Used by <oberon-type href='#MsgList'>MsgList</oberon-type>.</summary>
              <p pad-after='yes' no-indent='yes'>Used by <oberon-type href='#MsgList'>MsgList</oberon-type>.  Initialized to <code>NIL</code>.</p>
            </oberon-doc>
            <type>
              <type-name name='Msg' href='#Msg'/>
            </type>
          </field-decl>
          <field-decl name='code' id='MsgDesc.code' export='read-only'>
            <oberon-doc>
              <summary>The message code.</summary>
              <p pad-after='yes' no-indent='yes'>The message code.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='Code'/>
            </type>
          </field-decl>
          <field-decl name='context' id='MsgDesc.context' export='read-only'>
            <oberon-doc>
              <summary>The context in which the message was created.</summary>
              <p pad-after='yes' no-indent='yes'>The context in which the message was created.  Within a given context, the message code <oberon-field href='#MsgDesc.code'>code</oberon-field> uniquely identifies the message type.</p>
            </oberon-doc>
            <type>
              <type-name name='Context' href='#Context'/>
            </type>
          </field-decl>
          <field-decl name='attribList' id='MsgDesc.attribList' export='read-only'>
            <oberon-doc>
              <summary>The list of attributes associated with the message.</summary>
              <p pad-after='yes' no-indent='yes'>The list of attributes associated with the message.  They are sorted by name.</p>
            </oberon-doc>
            <type>
              <type-name name='Attribute' href='#Attribute'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='New' id='New' export='yes'>
      <oberon-doc>
        <summary>Creates a new message object for the given context, using the specified message code.</summary>
        <p pad-after='yes' no-indent='yes'>Creates a new message object for the given context, using the specified message code.  The message's attribute list is empty.</p>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='context' id='New.context' export='no' variable-parameter='no'>
          <type>
            <type-name name='Context' href='#Context'/>
          </type>
        </parameter-decl>
        <parameter-decl name='code' id='New.code' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='Code'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='Msg' href='#Msg'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='SetAttribute' id='MsgDesc.SetAttribute' export='yes'>
      <oberon-doc>
        <summary>Appends an attribute to the message's attribute list.</summary>
        <p pad-after='yes' no-indent='yes'>Appends an attribute to the message's attribute list.  If an attribute of the same name exists already, it is replaced by the new one.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>Length(attr.name^)&lt;=sizeAttrName</samp> and <oberon-param href='#MsgDesc.SetAttribute.attr'>attr</oberon-param> has not been attached to any other message.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='msg' id='MsgDesc.SetAttribute.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </receiver-decl>
        <parameter-decl name='attr' id='MsgDesc.SetAttribute.attr' export='no' variable-parameter='no'>
          <type>
            <type-name name='Attribute' href='#Attribute'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='GetAttribute' id='MsgDesc.GetAttribute' export='yes'>
      <oberon-doc>
        <summary>Returns the attribute <oberon-param href='#MsgDesc.GetAttribute.name'>name</oberon-param> of the message object.</summary>
        <p pad-after='yes' no-indent='yes'>Returns the attribute <oberon-param href='#MsgDesc.GetAttribute.name'>name</oberon-param> of the message object.  If no such attribute exists, the value <code>NIL</code> is returned.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='msg' id='MsgDesc.GetAttribute.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </receiver-decl>
        <parameter-decl name='name' id='MsgDesc.GetAttribute.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='Attribute' href='#Attribute'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='GetLText' id='MsgDesc.GetLText' export='yes'>
      <oberon-doc>
        <summary>Converts a message into a string.</summary>
        <p pad-after='yes' no-indent='yes'>Converts a message into a string.  The basic format of the string is determined by calling <oberon-proc href='#ContextDesc.GetTemplate'>msg.context.GetTemplate</oberon-proc>.  Then the attributes are inserted into the template string: the placeholder string <samp>${foo}</samp> is replaced with the textual representation of attribute.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>LEN(<oberon-param href='#MsgDesc.GetLText.text'>text</oberon-param>) &lt; 2^15</samp></p>
        </pre-cond>
        <p pad-after='yes' no-indent='no'>Note: Behaviour is undefined if replacement text of attribute contains an attribute reference.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='msg' id='MsgDesc.GetLText.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </receiver-decl>
        <parameter-decl name='text' id='MsgDesc.GetLText.text' export='no' variable-parameter='yes'>
          <type>
            <type-name name='LString' href='#LString'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='GetText' id='MsgDesc.GetText' export='yes'>
      <oberon-doc>
        <summary>Like <oberon-proc href='#MsgDesc.GetLText'>Msg.GetLText</oberon-proc>, but the message text is truncated to ISO-Latin1 characters.</summary>
        <p pad-after='yes' no-indent='yes'>Like <oberon-proc href='#MsgDesc.GetLText'>Msg.GetLText</oberon-proc>, but the message text is truncated to ISO-Latin1 characters.  All characters that are not part of ISO-Latin1 are mapped to question marks <samp>?</samp>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='msg' id='MsgDesc.GetText.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </receiver-decl>
        <parameter-decl name='text' id='MsgDesc.GetText.text' export='no' variable-parameter='yes'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetIntAttrib' id='MsgDesc.SetIntAttrib' export='yes'>
      <formal-parameters>
        <receiver-decl name='msg' id='MsgDesc.SetIntAttrib.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </receiver-decl>
        <parameter-decl name='name' id='MsgDesc.SetIntAttrib.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <parameter-decl name='value' id='MsgDesc.SetIntAttrib.value' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetStringAttrib' id='MsgDesc.SetStringAttrib' export='yes'>
      <formal-parameters>
        <receiver-decl name='msg' id='MsgDesc.SetStringAttrib.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </receiver-decl>
        <parameter-decl name='name' id='MsgDesc.SetStringAttrib.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <parameter-decl name='value' id='MsgDesc.SetStringAttrib.value' export='no' variable-parameter='no'>
          <type>
            <type-name name='StringPtr' href='#StringPtr'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetLStringAttrib' id='MsgDesc.SetLStringAttrib' export='yes'>
      <formal-parameters>
        <receiver-decl name='msg' id='MsgDesc.SetLStringAttrib.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </receiver-decl>
        <parameter-decl name='name' id='MsgDesc.SetLStringAttrib.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <parameter-decl name='value' id='MsgDesc.SetLStringAttrib.value' export='no' variable-parameter='no'>
          <type>
            <type-name name='LStringPtr' href='#LStringPtr'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetMsgAttrib' id='MsgDesc.SetMsgAttrib' export='yes'>
      <formal-parameters>
        <receiver-decl name='msg' id='MsgDesc.SetMsgAttrib.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </receiver-decl>
        <parameter-decl name='name' id='MsgDesc.SetMsgAttrib.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <parameter-decl name='value' id='MsgDesc.SetMsgAttrib.value' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
  </class>
  <class name='MsgList'>
    <type-decl name='MsgList' id='MsgList' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='MsgListDesc' href='#MsgListDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='MsgListDesc' id='MsgListDesc' export='yes'>
      <oberon-doc>
        <summary>A message list is an often used contruct to collect several error messages that all refer to the same resource.</summary>
        <p pad-after='yes' no-indent='yes'>A message list is an often used contruct to collect several error messages that all refer to the same resource.  For example within a parser, multiple messages are collected before aborting processing and presenting all messages to the user.</p>
      </oberon-doc>
      <type>
        <record>
          <field-decl name='msgCount' id='MsgListDesc.msgCount' export='read-only'>
            <oberon-doc>
              <summary>The number of messages in the list.</summary>
              <p pad-after='yes' no-indent='yes'>The number of messages in the list.  An empty list has a <oberon-field href='#MsgListDesc.msgCount'>msgCount</oberon-field> of zero.</p>
            </oberon-doc>
            <type>
              <type-name module='#predef' name='LONGINT'/>
            </type>
          </field-decl>
          <field-decl name='msgList' id='MsgListDesc.msgList' export='read-only'>
            <type>
              <type-name name='Msg' href='#Msg'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='InitMsgList' id='InitMsgList' export='yes'>
      <formal-parameters>
        <parameter-decl name='l' id='InitMsgList.l' export='no' variable-parameter='no'>
          <type>
            <type-name name='MsgList' href='#MsgList'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='NewMsgList' id='NewMsgList' export='yes'>
      <formal-parameters>
        <result-type>
          <type-name name='MsgList' href='#MsgList'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='Append' id='MsgListDesc.Append' export='yes'>
      <oberon-doc>
        <summary>Appends the message <oberon-param href='#MsgListDesc.Append.msg'>msg</oberon-param> to the list <oberon-param href='#MsgListDesc.Append.l'>l</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Appends the message <oberon-param href='#MsgListDesc.Append.msg'>msg</oberon-param> to the list <oberon-param href='#MsgListDesc.Append.l'>l</oberon-param>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#MsgListDesc.Append.msg'>msg</oberon-param> is not part of another message list.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='l' id='MsgListDesc.Append.l' export='no' variable-parameter='no'>
          <type>
            <type-name name='MsgList' href='#MsgList'/>
          </type>
        </receiver-decl>
        <parameter-decl name='msg' id='MsgListDesc.Append.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='AppendList' id='MsgListDesc.AppendList' export='yes'>
      <oberon-doc>
        <summary>Appends the messages of list <oberon-param href='#MsgListDesc.AppendList.source'>source</oberon-param> to <oberon-param href='#MsgListDesc.AppendList.l'>l</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Appends the messages of list <oberon-param href='#MsgListDesc.AppendList.source'>source</oberon-param> to <oberon-param href='#MsgListDesc.AppendList.l'>l</oberon-param>.  Afterwards, <oberon-param href='#MsgListDesc.AppendList.source'>source</oberon-param> is an empty list, and the elements of <oberon-param href='#MsgListDesc.AppendList.source'>source</oberon-param> can be found at the end of the list <oberon-param href='#MsgListDesc.AppendList.l'>l</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='l' id='MsgListDesc.AppendList.l' export='no' variable-parameter='no'>
          <type>
            <type-name name='MsgList' href='#MsgList'/>
          </type>
        </receiver-decl>
        <parameter-decl name='source' id='MsgListDesc.AppendList.source' export='no' variable-parameter='no'>
          <type>
            <type-name name='MsgList' href='#MsgList'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
  </class>
  <class name='IntAttribute'>
    <type-decl name='IntAttribute' id='IntAttribute' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='IntAttributeDesc' href='#IntAttributeDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='IntAttributeDesc' id='IntAttributeDesc' export='no'>
      <type>
        <record>
          <field-decl name='int' id='IntAttributeDesc.int' export='read-only'>
            <type>
              <type-name module='#predef' name='LONGINT'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='NewIntAttrib' id='NewIntAttrib' export='yes'>
      <formal-parameters>
        <parameter-decl name='name' id='NewIntAttrib.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <parameter-decl name='value' id='NewIntAttrib.value' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='IntAttribute' href='#IntAttribute'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ReplacementText' id='IntAttributeDesc.ReplacementText' export='yes'>
      <doc-inherited-from module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
      <oberon-doc>
        <summary>Converts attribute value into some textual representation.</summary>
        <p pad-after='yes' no-indent='yes'>Converts attribute value into some textual representation.  The length of the resulting string must not exceed <oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const> characters: <oberon-proc href='#MsgDesc.GetLText'>Msg.GetLText</oberon-proc> calls this procedure with a text buffer of <samp><oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const>+1</samp> bytes.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='attr' id='IntAttributeDesc.ReplacementText.attr' export='no' variable-parameter='no'>
          <type>
            <type-name name='IntAttribute' href='#IntAttribute'/>
          </type>
        </receiver-decl>
        <parameter-decl name='text' id='IntAttributeDesc.ReplacementText.text' export='no' variable-parameter='yes'>
          <type>
            <type-name name='LString' href='#LString'/>
          </type>
        </parameter-decl>
      </formal-parameters>
      <redefined-method module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
    </procedure>
    <base-class module='Msg' class='Attribute' href='#Attribute'>
      <inherited-method module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
      <inherited-field module='Msg' name='name' class='Attribute' href='#AttributeDesc.name'/>
      <inherited-field module='Msg' name='nextAttrib' class='Attribute' href='#AttributeDesc.nextAttrib'/>
    </base-class>
  </class>
  <class name='StringAttribute'>
    <type-decl name='StringAttribute' id='StringAttribute' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='StringAttributeDesc' href='#StringAttributeDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='StringAttributeDesc' id='StringAttributeDesc' export='no'>
      <type>
        <record>
          <field-decl name='string' id='StringAttributeDesc.string' export='read-only'>
            <type>
              <type-name name='StringPtr' href='#StringPtr'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='NewStringAttrib' id='NewStringAttrib' export='yes'>
      <formal-parameters>
        <parameter-decl name='name' id='NewStringAttrib.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <parameter-decl name='value' id='NewStringAttrib.value' export='no' variable-parameter='no'>
          <type>
            <type-name name='StringPtr' href='#StringPtr'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='StringAttribute' href='#StringAttribute'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ReplacementText' id='StringAttributeDesc.ReplacementText' export='yes'>
      <doc-inherited-from module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
      <oberon-doc>
        <summary>Converts attribute value into some textual representation.</summary>
        <p pad-after='yes' no-indent='yes'>Converts attribute value into some textual representation.  The length of the resulting string must not exceed <oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const> characters: <oberon-proc href='#MsgDesc.GetLText'>Msg.GetLText</oberon-proc> calls this procedure with a text buffer of <samp><oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const>+1</samp> bytes.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='attr' id='StringAttributeDesc.ReplacementText.attr' export='no' variable-parameter='no'>
          <type>
            <type-name name='StringAttribute' href='#StringAttribute'/>
          </type>
        </receiver-decl>
        <parameter-decl name='text' id='StringAttributeDesc.ReplacementText.text' export='no' variable-parameter='yes'>
          <type>
            <type-name name='LString' href='#LString'/>
          </type>
        </parameter-decl>
      </formal-parameters>
      <redefined-method module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
    </procedure>
    <base-class module='Msg' class='Attribute' href='#Attribute'>
      <inherited-method module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
      <inherited-field module='Msg' name='name' class='Attribute' href='#AttributeDesc.name'/>
      <inherited-field module='Msg' name='nextAttrib' class='Attribute' href='#AttributeDesc.nextAttrib'/>
    </base-class>
  </class>
  <class name='LStringAttribute'>
    <type-decl name='LStringAttribute' id='LStringAttribute' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='LStringAttributeDesc' href='#LStringAttributeDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='LStringAttributeDesc' id='LStringAttributeDesc' export='no'>
      <type>
        <record>
          <field-decl name='string' id='LStringAttributeDesc.string' export='read-only'>
            <type>
              <type-name name='LStringPtr' href='#LStringPtr'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='NewLStringAttrib' id='NewLStringAttrib' export='yes'>
      <formal-parameters>
        <parameter-decl name='name' id='NewLStringAttrib.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <parameter-decl name='value' id='NewLStringAttrib.value' export='no' variable-parameter='no'>
          <type>
            <type-name name='LStringPtr' href='#LStringPtr'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='LStringAttribute' href='#LStringAttribute'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ReplacementText' id='LStringAttributeDesc.ReplacementText' export='yes'>
      <doc-inherited-from module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
      <oberon-doc>
        <summary>Converts attribute value into some textual representation.</summary>
        <p pad-after='yes' no-indent='yes'>Converts attribute value into some textual representation.  The length of the resulting string must not exceed <oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const> characters: <oberon-proc href='#MsgDesc.GetLText'>Msg.GetLText</oberon-proc> calls this procedure with a text buffer of <samp><oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const>+1</samp> bytes.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='attr' id='LStringAttributeDesc.ReplacementText.attr' export='no' variable-parameter='no'>
          <type>
            <type-name name='LStringAttribute' href='#LStringAttribute'/>
          </type>
        </receiver-decl>
        <parameter-decl name='text' id='LStringAttributeDesc.ReplacementText.text' export='no' variable-parameter='yes'>
          <type>
            <type-name name='LString' href='#LString'/>
          </type>
        </parameter-decl>
      </formal-parameters>
      <redefined-method module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
    </procedure>
    <base-class module='Msg' class='Attribute' href='#Attribute'>
      <inherited-method module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
      <inherited-field module='Msg' name='name' class='Attribute' href='#AttributeDesc.name'/>
      <inherited-field module='Msg' name='nextAttrib' class='Attribute' href='#AttributeDesc.nextAttrib'/>
    </base-class>
  </class>
  <class name='MsgAttribute'>
    <type-decl name='MsgAttribute' id='MsgAttribute' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='MsgAttributeDesc' href='#MsgAttributeDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='MsgAttributeDesc' id='MsgAttributeDesc' export='no'>
      <type>
        <record>
          <field-decl name='msg' id='MsgAttributeDesc.msg' export='read-only'>
            <type>
              <type-name name='Msg' href='#Msg'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='NewMsgAttrib' id='NewMsgAttrib' export='yes'>
      <formal-parameters>
        <parameter-decl name='name' id='NewMsgAttrib.name' export='no' variable-parameter='no'>
          <type>
            <type-name name='String' href='#String'/>
          </type>
        </parameter-decl>
        <parameter-decl name='value' id='NewMsgAttrib.value' export='no' variable-parameter='no'>
          <type>
            <type-name name='Msg' href='#Msg'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='MsgAttribute' href='#MsgAttribute'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='ReplacementText' id='MsgAttributeDesc.ReplacementText' export='yes'>
      <doc-inherited-from module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
      <oberon-doc>
        <summary>Converts attribute value into some textual representation.</summary>
        <p pad-after='yes' no-indent='yes'>Converts attribute value into some textual representation.  The length of the resulting string must not exceed <oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const> characters: <oberon-proc href='#MsgDesc.GetLText'>Msg.GetLText</oberon-proc> calls this procedure with a text buffer of <samp><oberon-const href='#sizeAttrReplacement'>sizeAttrReplacement</oberon-const>+1</samp> bytes.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='attr' id='MsgAttributeDesc.ReplacementText.attr' export='no' variable-parameter='no'>
          <type>
            <type-name name='MsgAttribute' href='#MsgAttribute'/>
          </type>
        </receiver-decl>
        <parameter-decl name='text' id='MsgAttributeDesc.ReplacementText.text' export='no' variable-parameter='yes'>
          <type>
            <type-name name='LString' href='#LString'/>
          </type>
        </parameter-decl>
      </formal-parameters>
      <redefined-method module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
    </procedure>
    <base-class module='Msg' class='Attribute' href='#Attribute'>
      <inherited-method module='Msg' name='ReplacementText' class='Attribute' href='#AttributeDesc.ReplacementText'/>
      <inherited-field module='Msg' name='name' class='Attribute' href='#AttributeDesc.name'/>
      <inherited-field module='Msg' name='nextAttrib' class='Attribute' href='#AttributeDesc.nextAttrib'/>
    </base-class>
  </class>
  <module-ref name='CharClass'>
    <ref-target type='html' relative-uri='CharClass.html'/>
  </module-ref>
</interface-description>
