<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=XXXDOM</id>
	<title>XXXDOM - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=XXXDOM"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=XXXDOM&amp;action=history"/>
	<updated>2026-04-28T22:12:00Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=XXXDOM&amp;diff=2477&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=XXXDOM&amp;diff=2477&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:56Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;To bypass a memory leak with the XDOM functions in Universe 10.2.0 on AIX 5.3, I simulated some key functions as subroutines.  They were about 30% slower than the native functions &amp;amp; do not attempt to recreate all the functionality, but they are infinitely more reliable, because they don&amp;#039;t leak memory.  YMMV. &lt;br /&gt;
&lt;br /&gt;
For reference, here are some things that didn&amp;#039;t help:&lt;br /&gt;
* XDOMClose() didn&amp;#039;t close the XDOM objects.&lt;br /&gt;
* The issues fixed in the release notes for UV 10.2.7 &amp;amp; 10.2.12 were not specific enough for the company&amp;#039;s appetite for an upgrade.&lt;br /&gt;
&lt;br /&gt;
Contents: &lt;br /&gt;
* &amp;lt;nowiki&amp;gt;XXXDOMInclude&amp;lt;/nowiki&amp;gt; - declare constants used by the other routines&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;XXXDOMWrite&amp;lt;/nowiki&amp;gt; - simulate &amp;lt;nowiki&amp;gt;XDOMWrite&amp;lt;/nowiki&amp;gt;(), returns status code in first argument&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;XXXDOMClose&amp;lt;/nowiki&amp;gt; - simulate &amp;lt;nowiki&amp;gt;XDOMClose&amp;lt;/nowiki&amp;gt;(), returns status code in first argument&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;XXXDOMCreateNode&amp;lt;/nowiki&amp;gt; - simulate &amp;lt;nowiki&amp;gt;XDOMCreateNode&amp;lt;/nowiki&amp;gt;(), returns status code in first argument&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;XXXDOMAddChild&amp;lt;/nowiki&amp;gt; - simulate &amp;lt;nowiki&amp;gt;XDOMAddChild&amp;lt;/nowiki&amp;gt;(), returns status code in first argument&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;XXXDOMCreateRoot&amp;lt;/nowiki&amp;gt; - simulate &amp;lt;nowiki&amp;gt;XDOMCreateRoot&amp;lt;/nowiki&amp;gt;(), returns status code in first argument&lt;br /&gt;
&lt;br /&gt;
To deploy: Save the 6 programs in the same source code file.  Compile &amp;amp; catalog the subroutines.&lt;br /&gt;
&lt;br /&gt;
To use: Call each subroutine with the same arguments as you would use each referenced function, except that the status code is returned in the first subroutine argument.  &lt;br /&gt;
&lt;br /&gt;
Please note the limitations in the comments of each program.  This is not a replacement for the XDOM functions, and the node variables are not compatible with the internal structures produced by XDOM functions.  It&amp;#039;s just a workaround that worked for us, and will be easy to extend or replace.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
! NAME&lt;br /&gt;
!    XXXDOMInclude&lt;br /&gt;
!&lt;br /&gt;
! HISTORY&lt;br /&gt;
! 2008-Oct-20 dhochman Initial version&lt;br /&gt;
*&lt;br /&gt;
      EQU XXXDOM.NODE.TYPE TO 1          ; * Type&lt;br /&gt;
      EQU XXXDOM.NODE.NAME TO 2          ; * Node name&lt;br /&gt;
      EQU XXXDOM.NODE.ATTR.KEY TO 3      ; * Attribute names for sorting (mv)&lt;br /&gt;
      EQU XXXDOM.NODE.ATTR.NAME TO 4     ; * Attribute names (mv, assoc with 3)&lt;br /&gt;
      EQU XXXDOM.NODE.ATTR.VALUE TO 5    ; * Attribute values (mv, assoc with 3)&lt;br /&gt;
      EQU XXXDOM.NODE.CHILD.TYPE TO 6    ; * Child type (mv)&lt;br /&gt;
      EQU XXXDOM.NODE.VALUE TO 7         ; * Child elements and text, starting point&lt;br /&gt;
      EQU ASCII.AMP TO &amp;#039;&amp;amp;&amp;#039;&lt;br /&gt;
      EQU ASCII.LT TO &amp;#039;&amp;lt;&amp;#039;&lt;br /&gt;
      EQU ASCII.GT TO &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
      EQU ASCII.QUOT TO &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
      EQU ASCII.CR TO CHAR(13)&lt;br /&gt;
      EQU ASCII.LF TO CHAR(10)&lt;br /&gt;
      EQU ASCII.CRLF TO ASCII.CR:ASCII.LF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      SUBROUTINE XXXDOMWrite(XDOMStatus, node, document, destination)&lt;br /&gt;
! NAME&lt;br /&gt;
!    XXXDOMWrite&lt;br /&gt;
!&lt;br /&gt;
! TODO&lt;br /&gt;
!  - Handle XML.TO.FILE&lt;br /&gt;
!  - Handle more types&lt;br /&gt;
*&lt;br /&gt;
      INCLUDE XXXDOMInclude&lt;br /&gt;
      INCLUDE UNIVERSE.INCLUDE XML.H&lt;br /&gt;
      *&lt;br /&gt;
      XDOMStatus = XML.SUCCESS&lt;br /&gt;
      document = &amp;quot;&amp;quot;&lt;br /&gt;
      type = node&amp;lt;XXXDOM.NODE.TYPE&amp;gt;&lt;br /&gt;
      *&lt;br /&gt;
      BEGIN CASE&lt;br /&gt;
         CASE destination EQ XML.TO.STRING&lt;br /&gt;
            BEGIN CASE&lt;br /&gt;
               CASE type EQ XDOM.ATTR.NODE&lt;br /&gt;
                  document = node&amp;lt;XXXDOM.NODE.NAME, 1&amp;gt;&lt;br /&gt;
                  document := &amp;#039;=&amp;quot;&amp;#039;:node&amp;lt;XXXDOM.NODE.VALUE, 1&amp;gt;:&amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
                  *&lt;br /&gt;
               CASE type EQ XDOM.ELEMENT.NODE&lt;br /&gt;
                  IF (XXXDOM.NODE.NAME NE &amp;#039;&amp;#039;) THEN&lt;br /&gt;
                     document := ASCII.LT:node&amp;lt;XXXDOM.NODE.NAME&amp;gt;&lt;br /&gt;
                  END&lt;br /&gt;
                  IF (node&amp;lt;XXXDOM.NODE.ATTR.NAME&amp;gt; NE &amp;quot;&amp;quot;) THEN&lt;br /&gt;
                     attrCount = DCOUNT(node&amp;lt;XXXDOM.NODE.ATTR.NAME&amp;gt;, @VM)&lt;br /&gt;
                     FOR attrCtr = 1 TO attrCount&lt;br /&gt;
                        document := &amp;#039; &amp;#039;:node&amp;lt;XXXDOM.NODE.ATTR.NAME, attrCtr&amp;gt;&lt;br /&gt;
                        document := &amp;#039;=&amp;quot;&amp;#039;:node&amp;lt;XXXDOM.NODE.ATTR.VALUE, attrCtr&amp;gt;:&amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
                     NEXT attrCtr&lt;br /&gt;
                  END&lt;br /&gt;
                  value = FIELD(node,@AM,XXXDOM.NODE.VALUE,99999)&lt;br /&gt;
                  IF (value EQ &amp;quot;&amp;quot;) THEN&lt;br /&gt;
                     document := &amp;#039;/&amp;#039;:ASCII.GT&lt;br /&gt;
                  END ELSE&lt;br /&gt;
                     value = CHANGE(value, @AM, ASCII.LF)&lt;br /&gt;
                     document := ASCII.GT&lt;br /&gt;
                     IF (value[1,1] EQ ASCII.LT) THEN&lt;br /&gt;
                        value = CHANGE(value, &amp;#039;  &amp;#039;:ASCII.LT, &amp;#039;    &amp;#039;:ASCII.LT)&lt;br /&gt;
                        value = CHANGE(value, ASCII.LF:ASCII.LT, ASCII.LF:&amp;#039;  &amp;#039;:ASCII.LT)&lt;br /&gt;
                        value = &amp;#039;  &amp;#039;:value&lt;br /&gt;
                        document := ASCII.LF : value : ASCII.LF&lt;br /&gt;
                     END ELSE&lt;br /&gt;
                        document := value&lt;br /&gt;
                     END&lt;br /&gt;
                     IF (XXXDOM.NODE.NAME NE &amp;#039;&amp;#039;) THEN&lt;br /&gt;
                        document := ASCII.LT:&amp;#039;/&amp;#039;:node&amp;lt;XXXDOM.NODE.NAME&amp;gt;:ASCII.GT&lt;br /&gt;
                     END&lt;br /&gt;
                  END&lt;br /&gt;
                  *&lt;br /&gt;
               CASE type EQ XDOM.TEXT.NODE&lt;br /&gt;
                  value = FIELD(node,@AM,XXXDOM.NODE.VALUE,99999)&lt;br /&gt;
                  document = value&lt;br /&gt;
                  *&lt;br /&gt;
               CASE type EQ XDOM.DOC.NODE&lt;br /&gt;
                  document = FIELD(node,@AM,XXXDOM.NODE.VALUE,99999)&lt;br /&gt;
                  *&lt;br /&gt;
               CASE 1&lt;br /&gt;
                  XDOMStatus = XML.ERROR&lt;br /&gt;
            END CASE&lt;br /&gt;
            *&lt;br /&gt;
         CASE 1&lt;br /&gt;
            XDOMStatus = XML.ERROR&lt;br /&gt;
            *&lt;br /&gt;
         CASE destination EQ XML.TO.FILE&lt;br /&gt;
            NULL&lt;br /&gt;
      END CASE&lt;br /&gt;
      RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      SUBROUTINE XXXDOMClose(XDOMStatus, node)&lt;br /&gt;
! NAME&lt;br /&gt;
!    XXXDOMClose&lt;br /&gt;
*&lt;br /&gt;
      INCLUDE XXXDOMInclude&lt;br /&gt;
      INCLUDE UNIVERSE.INCLUDE XML.H&lt;br /&gt;
      *&lt;br /&gt;
      XDOMStatus = XML.SUCCESS&lt;br /&gt;
      node = &amp;quot;&amp;quot;&lt;br /&gt;
      RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      SUBROUTINE [[XXXDOMCreateNode]](XDOMStatus, domHandle, label, value, type, node)&lt;br /&gt;
! NAME&lt;br /&gt;
!    [[XXXDOMCreateNode]]&lt;br /&gt;
!&lt;br /&gt;
! DESCRIPTION&lt;br /&gt;
!    Constructs an XDOM-like object.&lt;br /&gt;
!&lt;br /&gt;
! TODO&lt;br /&gt;
!  - Handle domHandle&lt;br /&gt;
!  - Handle more types&lt;br /&gt;
*&lt;br /&gt;
      INCLUDE XXXDOMInclude&lt;br /&gt;
      INCLUDE UNIVERSE.INCLUDE XML.H&lt;br /&gt;
      *&lt;br /&gt;
      XDOMStatus = XML.SUCCESS&lt;br /&gt;
      node = &amp;#039;&amp;#039;&lt;br /&gt;
      node&amp;lt;XXXDOM.NODE.TYPE&amp;gt; = type&lt;br /&gt;
      *&lt;br /&gt;
      BEGIN CASE&lt;br /&gt;
         CASE type EQ XDOM.ATTR.NODE     ; * label &amp;amp; value&lt;br /&gt;
            node&amp;lt;XXXDOM.NODE.NAME&amp;gt; = label&amp;lt;1&amp;gt;&lt;br /&gt;
            temp = value&lt;br /&gt;
            IF INDEX(temp,ASCII.AMP,1) THEN temp = CHANGE(temp, ASCII.AMP, &amp;#039;&amp;amp;amp;&amp;#039;)&lt;br /&gt;
            IF INDEX(temp,ASCII.QUOT,1) THEN temp = CHANGE(temp, ASCII.QUOT, &amp;#039;&amp;amp;quot;&amp;#039;)&lt;br /&gt;
            IF INDEX(temp,ASCII.LT,1) THEN temp = CHANGE(temp, ASCII.LT, &amp;#039;&amp;amp;lt;&amp;#039;)&lt;br /&gt;
            IF INDEX(temp,ASCII.GT,1) THEN temp = CHANGE(temp, ASCII.GT, &amp;#039;&amp;amp;gt;&amp;#039;)&lt;br /&gt;
            node&amp;lt;XXXDOM.NODE.VALUE&amp;gt; = temp&lt;br /&gt;
         CASE type EQ XDOM.ELEMENT.NODE  ; * label only&lt;br /&gt;
            node&amp;lt;XXXDOM.NODE.NAME&amp;gt; = label&amp;lt;1&amp;gt;&lt;br /&gt;
         CASE type EQ XDOM.TEXT.NODE     ; * value only&lt;br /&gt;
            temp = value&lt;br /&gt;
            IF INDEX(temp,ASCII.AMP,1) THEN temp = CHANGE(temp, ASCII.AMP, &amp;#039;&amp;amp;amp;&amp;#039;)&lt;br /&gt;
            IF INDEX(temp,ASCII.QUOT,1) THEN temp = CHANGE(temp, ASCII.QUOT, &amp;#039;&amp;amp;quot;&amp;#039;)&lt;br /&gt;
            IF INDEX(temp,ASCII.LT,1) THEN temp = CHANGE(temp, ASCII.LT, &amp;#039;&amp;amp;lt;&amp;#039;)&lt;br /&gt;
            IF INDEX(temp,ASCII.GT,1) THEN temp = CHANGE(temp, ASCII.GT, &amp;#039;&amp;amp;gt;&amp;#039;)&lt;br /&gt;
            node&amp;lt;XXXDOM.NODE.VALUE&amp;gt; = temp&lt;br /&gt;
         CASE type EQ XDOM.DOC.NODE      ; * document root&lt;br /&gt;
         CASE 1&lt;br /&gt;
            XDOMStatus = XML.ERROR&lt;br /&gt;
            node = &amp;#039;&amp;#039;&lt;br /&gt;
      END CASE&lt;br /&gt;
      *&lt;br /&gt;
      RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      SUBROUTINE [[XXXDOMAddChild]](XDOMStatus, parentNode, xpath, namespace, node, dupFlag)&lt;br /&gt;
! NAME&lt;br /&gt;
!    [[XXXDOMAddChild]]&lt;br /&gt;
!&lt;br /&gt;
! TODO&lt;br /&gt;
!  - Handle xpath&lt;br /&gt;
!  - Handle namespace&lt;br /&gt;
!  - Handle more types&lt;br /&gt;
!  - Handle dupFlag&lt;br /&gt;
*&lt;br /&gt;
      INCLUDE XXXDOMInclude&lt;br /&gt;
      INCLUDE UNIVERSE.INCLUDE XML.H&lt;br /&gt;
      *&lt;br /&gt;
      XDOMStatus = XML.SUCCESS&lt;br /&gt;
      type = node&amp;lt;XXXDOM.NODE.TYPE&amp;gt;&lt;br /&gt;
      *&lt;br /&gt;
      BEGIN CASE&lt;br /&gt;
         CASE type EQ XDOM.ATTR.NODE&lt;br /&gt;
            attrName = node&amp;lt;XXXDOM.NODE.NAME, 1&amp;gt;&lt;br /&gt;
            attrValue = node&amp;lt;XXXDOM.NODE.VALUE, 1&amp;gt;&lt;br /&gt;
            attrKey = LEN(attrName):&amp;quot; &amp;quot;:attrName&lt;br /&gt;
            LOCATE(attrKey, parentNode, XXXDOM.NODE.ATTR.KEY; attrCtr; &amp;quot;AR&amp;quot;) THEN&lt;br /&gt;
               parentNode&amp;lt;XXXDOM.NODE.ATTR.VALUE, attrCtr&amp;gt; = attrValue&lt;br /&gt;
            END ELSE&lt;br /&gt;
               parentNode = INSERT(parentNode, XXXDOM.NODE.ATTR.KEY, attrCtr, 0, attrKey)&lt;br /&gt;
               parentNode = INSERT(parentNode, XXXDOM.NODE.ATTR.NAME, attrCtr, 0, attrName)&lt;br /&gt;
               parentNode = INSERT(parentNode, XXXDOM.NODE.ATTR.VALUE, attrCtr, 0, attrValue)&lt;br /&gt;
            END&lt;br /&gt;
         CASE type EQ XDOM.ELEMENT.NODE&lt;br /&gt;
            CALL XXXDOMWrite(XDOMStatus, node, childString, XML.TO.STRING)&lt;br /&gt;
            IF NOT(XDOMStatus) THEN&lt;br /&gt;
               parentNode&amp;lt;XXXDOM.NODE.CHILD.TYPE, -1&amp;gt; = type&lt;br /&gt;
               parentNode&amp;lt;XXXDOM.NODE.VALUE&amp;gt; = parentNode&amp;lt;XXXDOM.NODE.VALUE&amp;gt;&lt;br /&gt;
               parentNode&amp;lt;-1&amp;gt; = childString&lt;br /&gt;
            END&lt;br /&gt;
         CASE type EQ XDOM.TEXT.NODE&lt;br /&gt;
            CALL XXXDOMWrite(XDOMStatus, node, childString, XML.TO.STRING)&lt;br /&gt;
            IF NOT(XDOMStatus) THEN&lt;br /&gt;
               parentNode&amp;lt;XXXDOM.NODE.CHILD.TYPE, -1&amp;gt; = type&lt;br /&gt;
               parentNode&amp;lt;XXXDOM.NODE.VALUE&amp;gt; = parentNode&amp;lt;XXXDOM.NODE.VALUE&amp;gt;&lt;br /&gt;
               parentNode&amp;lt;-1&amp;gt; = childString&lt;br /&gt;
            END&lt;br /&gt;
         CASE 1&lt;br /&gt;
            XDOMStatus = XML.ERROR&lt;br /&gt;
      END CASE&lt;br /&gt;
      *&lt;br /&gt;
      RETURN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
      SUBROUTINE [[XXXDOMCreateRoot]](XDOMStatus, node)&lt;br /&gt;
! NAME&lt;br /&gt;
!    [[XXXDOMCreateRoot]] - Constructs an XDOM-like document root node.&lt;br /&gt;
*&lt;br /&gt;
      INCLUDE XXXDOMInclude&lt;br /&gt;
      INCLUDE UNIVERSE.INCLUDE XML.H&lt;br /&gt;
      *&lt;br /&gt;
      CALL [[XXXDOMCreateNode]](XDOMStatus, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, XDOM.DOC.NODE, node)&lt;br /&gt;
      *&lt;br /&gt;
      RETURN &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>