/*  */

/* Example of using Utility Library functions 

    FILTERTAGCHANGES()
    FILTERTAGITEMS()
    REFRESHTAGITEMCLONES()
    
*/

 x = addlib("apig.library",0,-30,0)

 call set_apig_globals()

 taglist  = ALLOCATETAGITEMS(20)    /* allocate twenty slots */
 taglist2 = ALLOCATETAGITEMS(20)    /* allocate twenty slots */

 call SETTAGSLOT(taglist,0,'80080001'x,'n',100)
 call SETTAGSLOT(taglist,1,'80080002'x,'n',200)
 call SETTAGSLOT(taglist,2,'80080003'x,'n',300)
 call SETTAGSLOT(taglist,3,'80080004'x,'n',400)
 call SETTAGSLOT(taglist,4,'80080005'x,'n',500)
 call SETTAGSLOT(taglist,5,'80080006'x,'n',600)
 call SETTAGSLOT(taglist,6,'80080007'x,'n',700)
 call SETTAGSLOT(taglist,7,'80080008'x,'n',800)
 call SETTAGSLOT(taglist,8,'80080009'x,'n',900)
 call SETTAGSLOT(taglist,9,'80080010'x,'n',1000)
 call SETTAGSLOT(taglist,10,TAG_DONE,'n',0)
 origtaglist  = CLONETAGITEMS(taglist)           /* used to REFRESH */
 clonetaglist = CLONETAGITEMS(taglist)

 call SETTAGSLOT(taglist2,0,'80080001'x,'n',110) /* different data value */
 call SETTAGSLOT(taglist2,1,'80080002'x,'n',200)
 call SETTAGSLOT(taglist2,2,'80080003'x,'n',320) /* different data value */
 call SETTAGSLOT(taglist2,3,'80080004'x,'n',400)
 call SETTAGSLOT(taglist2,4,'80080005'x,'n',500)
 call SETTAGSLOT(taglist2,5,'80080006'x,'n',600)
 call SETTAGSLOT(taglist2,6,'80080007'x,'n',720) /* different data value */
 call SETTAGSLOT(taglist2,7,'80080008'x,'n',800)
 call SETTAGSLOT(taglist2,8,'80080009'x,'n',900)
 call SETTAGSLOT(taglist2,9,'80080010'x,'n',1000)
 call SETTAGSLOT(taglist2,10,TAG_DONE,'n',0)
 clonelist2 = CLONETAGITEMS(taglist2)

 call show2taglist("   Changes",taglist2,"  Original",taglist)

 call FILTERTAGCHANGES(taglist2,taglist,0)  /* 0 - do not APPLY changes */

 say " After FILTERCHANGES "
 call show2taglist("   Changes",taglist2,"  Original",taglist)


 call FILTERTAGCHANGES(clonelist2,clonetaglist,1) /* 1 - APPLY changes */

 say " After FILTERCHANGES with changes APPLIED to Original "
 call show2taglist("   Changes",clonelist2,"  Original",clonetaglist)

 
/* REFRESHTAGITEMCLONES -- changes were applied to 'clonetaglist' */

 call REFRESHTAGITEMCLONES(clonetaglist,origtaglist) /* original values back */

 say "Refreshed List -- with old Original values "
 call show2taglist("   ORIGINAL",origtaglist,"  REFRESHED",clonetaglist)



/* FILTERTAGITEMS */

 tagarray = ALLOCMEM(80,MEMF_CLEAR)   /* twenty array slots */

 orig2taglist  = CLONETAGITEMS(origtaglist)

 call SETVALUE(tagarray,0,4,'p','80080002'x) /* the ones to keep or */
 call SETVALUE(tagarray,4,4,'p','80080003'x) /* not keep            */
 call SETVALUE(tagarray,8,4,'p','80080007'x)
 call SETVALUE(tagarray,12,4,'p','80080009'x)
 call SETVALUE(tagarray,16,4,'p',TAG_DONE)

 say ""
 call FILTERTAGITEMS(orig2taglist,tagarray,0)
 say "Filtered with TAGFILTER_AND ... "
 say " if tag in taglist AND in tagarry -- keep it"
 say ""
 call show2taglist("   ORIGINAL",origtaglist,"  FILTERED",orig2taglist)

 call REFRESHTAGITEMCLONES(orig2taglist,origtaglist)
 say ""
 call FILTERTAGITEMS(orig2taglist,tagarray,1)
 say "Filtered with TAGFILTER_NOT ... "
 say " if tag in taglist but NOT in tagarray -- keep it"
 say ""
 call show2taglist("   ORIGINAL",origtaglist,"  FILTERED",orig2taglist)


 call FREETAGITEMS(taglist)
 call FREETAGITEMS(clonetaglist)
 call FREETAGITEMS(origtaglist)
 call FREETAGITEMS(orig2taglist)
 call FREETAGITEMS(clonelist2)
 call FREETAGITEMS(taglist2)
 call FREEMEM(tagarray,80)

exit

/* -------------------------------------- */
show2taglist: procedure expose MEMF_CLEAR
/* -------------------------------------- */

parse arg L1heading,list1,L2heading,list2

   tstate1 = ALLOCMEM(4,MEMF_CLEAR)   /* needed, since NEXTTAGITEM wants   */
                                      /* it as doubly-indirected reference */

   tstate2 = ALLOCMEM(4,MEMF_CLEAR)  

   if list1 ~= null() then 
      call export(tstate1,list1,4)     /* copy list1 pointer into tstate1 */

   if list2 ~= null() then 
      call export(tstate2,list2,4)     /* copy list2 pointer into tstate2 */

   say copies(' ',8) L1heading copies(' ',25-length(L1heading)) L2heading

   do forever

      t1 = copies(' ',20)
      if tag1 ~= null() then 
         do
            tag1 = NEXTTAGITEM(tstate1)
            if tag1 ~= null() then
               do
                  tagval  = GETVALUE(tag1,0,4,'p')
                  tagdata = GETVALUE(tag1,4,4,'n')
                  t1 = '(' || c2x(tagval) || ':' || tagdata || ')'
               end
         end
      
      t2 = ''
      if tag2 ~= null() then 
         do
            tag2 = NEXTTAGITEM(tstate2)
            if tag2 ~= null() then
               do
                  tagval  = GETVALUE(tag2,0,4,'p')
                  tagdata = GETVALUE(tag2,4,4,'n')
                  t2 = copies(' ',25-length(t1))
                  t2 = t2 || '(' || c2x(tagval) || ':' || tagdata || ')'
               end
         end
      
      if (tag1 = null()) & (tag2 = null()) then leave

      say copies(' ',8) t1 t2
      
   end

   say ""
   call FREEMEM(tstate1,4)
   call FREEMEM(tstate2,4)

return 1
