Portal | Manuals | References | Downloads | Info | Programs | JCLs | Master the Mainframes
IBM Mainframe Computers Forums Index
 
Register
 
IBM Mainframe Computers Forums Index Mainframe: Search IBM Mainframe Forum: FAQ Memberlist Usergroups Profile Log in to check your private messages Log in
 

 

.XMI file record structure
Goto page 1, 2  Next
 
Post new topic   Reply to topic    IBMMAINFRAMES.com Support Forums -> All Other Mainframe Topics
View previous topic :: :: View next topic  
Author Message
vasanthz

Global Moderator


Joined: 28 Aug 2007
Posts: 1445
Location: Azeroth

PostPosted: Tue Sep 04, 2012 9:42 am    Post subject: .XMI file record structure
Reply with quote

Hi,
We can create .xmi files using XMIT command and restructure back the data using RECEIVE.

Could you please point me to the "record layout logic" of a xmi file so it can be parsed in a user written program like REXX or SAS on mainframe.

XMIT manager is a nice application on PC to view .xmi files, but unfortunately its not open source :S
Google leads to XML Metadata Interchange formats which I guess is something totally different.

Thanks in advance,
Back to top
View user's profile Send private message

Bill Woodger

DFSORT Moderator


Joined: 09 Mar 2011
Posts: 7223

PostPosted: Tue Sep 04, 2012 12:23 pm    Post subject: Reply to: .XMI file record structure
Reply with quote

Why don't you create a file of that format on the mainframe and "browse" it?

It is a pretty simple format.
Back to top
View user's profile Send private message
PeterHolland

Global Moderator


Joined: 27 Oct 2009
Posts: 2422
Location: Netherlands, Amstelveen

PostPosted: Tue Sep 04, 2012 1:11 pm    Post subject:
Reply with quote

Quote:
Google leads to XML Metadata Interchange formats which I guess is something totally different.


No its not, read :

http://en.wikipedia.org/wiki/XML_Metadata_Interchange
Back to top
View user's profile Send private message
PeterHolland

Global Moderator


Joined: 27 Oct 2009
Posts: 2422
Location: Netherlands, Amstelveen

PostPosted: Tue Sep 04, 2012 1:43 pm    Post subject:
Reply with quote

The record layout for Transmit/Receive files can be found in :

z/OS TSO/E Customization SA22-7783-09
Back to top
View user's profile Send private message
enrico-sorichetti

Global Moderator


Joined: 14 Mar 2007
Posts: 10201
Location: italy

PostPosted: Tue Sep 04, 2012 2:02 pm    Post subject: Reply to: .XMI file record structure
Reply with quote

Vasanth is talking not about XML, but about XMI
TSO/E SEND/RECEIVE and the structure of the IDTF File
which is described very well in the tso/e manuals

here is the REXX script to RECEIVE an IDTF file
should work both for object rexx and regina rexx
and on windows,linux, APPLE snow leopard,lion, mountain lion

I currently use linux and the APPLE
I tested initially on windows and later on I quit testing the updates

right now i am testing the PDSE support


Code:
#!/opt/ooRexx/bin/rexx

/* Rexx - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Name : receive.rx                                                 */
/* Build:                                                            */
/*  from: /Users/enrico/tools_skels/receive.rx                       */
/* alias: ../tools/_receive                                          */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/* Copyright (c) 2005-2012 Enrico Sorichetti                         */
/* All rights reserved.                                              */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

-- included  /Users/enrico/include/receive.rxh
/*--help:start                                                        */
/*1Copyright (c) 2005-2012 Enrico Sorichetti                          */
/*1All rights reserved.                                               */
/*1 receive.rx                                                        */
/*2                                                                   */
/*1           -h        (IMMED) short help                            */
/*1           --help    (IMMED) long help                             */
/*2                                                                   */
/*1           --auto    (FLAG) same as --mode auto                    */
/*1           --text    (FLAG) same as --mode text                    */
/*1           --binary  (FLAG) same as --mode binary                  */
/*1           --update  (FLAG) same as --mode update                  */
/*2                                                                   */
/*1           --suffix  (PARM) string                                 */
/*2                        override for default suffix                */
/*2                        .txt for text files                        */
/*2                        .xmi for xmit files                        */
/*2                        .obj for object decks                      */
/*2                        .bin for binary files                      */
/*2                                                                   */
/*1           --junk    (FLAG) same as --dest junk                    */
/*1           --dest    (KEYW/PARM) (junk/[name])/path_name           */
/*2                     where to expand the source(XMI) content       */
/*2                     junk  same level of the source(XMI) file      */
/*2                     name  path with the name of the XMI container */
/*2                        ( cbt006.xmi ==> cbt006/)                  */
/*2                     path_name                                     */
/*2                        the name tells                             */
/*2                                                                   */
/*1           --mail    (KEYW) (show/save/[name])                     */
/*2                     how to process the message file               */
/*2                     show                                          */
/*2                       display only                                */
/*2                     save                                          */
/*2                       to "mail.txt" in the dest. path             */
/*2                     name                                          */
/*2                        ( cbt006.xmi ==> cbt006.mail.txt)          */
/*1                     *** not implemented yet ***                   */
/*2                                                                   */
/*1           --ispf    (KEYW) (show/save/[name])                     */
/*2                     how to process the ISPF statistics            */
/*2                     show                                          */
/*2                       display only                                */
/*2                     save                                          */
/*2                       to "ispf.txt" in the dest. path             */
/*2                     name                                          */
/*2                        ( cbt006.xmi ==> cbt006.ispf.txt)          */
/*1                     *** not implemented yet ***                   */
/*2                                                                   */
/*1           -M                                                      */
/*1           --member  (PARM) string                                 */
/*2                        members to extracted                       */
/*2                        the option can be repeated as needed       */
/*2                        can be  a simple pattern like pref*        */
/*1                     *** not implemented yet ***                   */
/*2                                                                   */
/*1           --dump    (FLAG)                                        */
/*2                        hex dump of the control and data records   */
/*2                     *** no extraction will take place ***         */
/*2                                                                   */
/*1           --info    (FLAG)                                        */
/*2                        display the INMRxx keys and values         */
/*2                     *** no extraction will take place ***         */
/*2                                                                   */
/*1           --list    (FLAG)                                        */
/*2                        only list the PDS members                  */
/*2                     *** no extraction will take place ***         */
/*2                                                                   */
/*--help:end                                                          */
Trace "O"
parse arg __stdargs
__stdargs = strip(__stdargs)
call      __setup

__strch   = "."; __arbfr = " -"; __arbto = "fffe"x
__optopts = "3;"__strch";"__arbfr";"__arbto
__optshrt = "h;M:"
__optlong = "help;" || ,
            ";auto;text;binary;update;suffix:;dest:" || ,
            ";mail:;ispf:;member:;dump;info;list;"
args = _getopt( __optopts, __optshrt, __optlong, __stdargs )
argc = words(args)
if   lower(left(args,5)) = "--err" then do
   call __log args
   exit
end

_mode_      = "auto"
_MODEsave_  = _mode_
_asis_      = "."
_ASISsave_  = _asis_
_suff_      = "."
_SUFFsave_   = _suff_

_dest_      = "name"
__DATAfile  = "data.txt"
__DATAsuff  = ".txt"
__TXTfile   = "data.txt"
__TXTsuff   = ".txt"
__BINfile   = "data.bin"
__BINsuff   = ".bin"


_mail_      = "name"
__MAILfile  = "mail.txt"
__MAILsuff  = ".mail.txt"

_ispf_      = "name"
__ISPFfile  = "ispf.txt"
__ISPFsuff  = ".ispf.txt"

_mbrs_      = ""

__dump      = 0
__info       = 0
__list      = 0
__extr      = 1

do iarg = 1 to argc while ( word(args,1) \= "--" )
   optchar = word(args,1); optarg  = word(args,2);

   if optchar = "-h" | ,
      optchar = "--help" then do
      call __hlp 2
      exit
   end

   if   optchar = "--auto" then do
      _mode_ = "auto"
      args   = delword(args, 1, 1)
      iterate iarg
   end
   if   optchar = "--text" then do
      _mode_ = "text"
      args   = delword(args, 1, 1)
      iterate iarg
   end
   if   optchar = "--binary" then do
      say "binary at getopt"
      _mode_ = "binary"
      args   = delword(args, 1, 1)
      iterate iarg
   end
   if   optchar = "--update" then do
      _mode_ = "update"
      args   = delword(args, 1, 1)
      iterate iarg
   end

   if   optchar = "--suffix" then do
      if   left(optarg,1) = "-" then do
         call __log  "getopt: option requires an argument : "optchar
         exit
      end
      _suff_ = lower(optarg)
      args   = delword(args, 1, 2)
      iterate iarg
   end

   if   optchar = "--junk" then do
      _dest_ = "junk"
      args   = delword(args, 1, 1)
      iterate iarg
   end

   if   optchar = "--dest" then do
      if   left(optarg,1) = "-" then do
         call __log  "getopt: option requires an argument : "optchar
         exit
      end
      _dest_   = lower(optarg)
      args   = delword(args, 1, 2)
      iterate iarg
   end

   if   optchar = "--mail" then do
      if   left(optarg,1) = "-" then do
         _mail_ = "name"
         args   = delword(args, 1, 1)
         iterate iarg
      end
      _mail_ = lower(optarg)
      if wordpos(_mail_,"show save name") = 0 then do
         call __log  "invalid mail option '"_mail_"' (show/save/name)"
         exit
      end
      args   = delword(args, 1, 2)
      iterate iarg
   end

   if   optchar = "--ispf" then do
      if   left(optarg,1) = "-" then do
         _ispf_ = "name"
         args   = delword(args, 1, 1)
         iterate iarg
      end
      _ispf_ = optarg
      if wordpos(_ispf_,"show save name") = 0 then do
         call __log  "invalid ispf option '"_ispf_"' (show/save/name)"
         exit
      end
      args   = delword(args, 1, 2)
      iterate iarg
   end

   if   optchar = "-M" | ,
      optchar = "--member" then do
      if   left(optarg,1) = "-" then do
         call __log  "getopt: option requires an argument : "optchar
         exit
      end
      _mbrs_ = _mbrs_ || " " || lower(optarg)
      args   = delword(args, 1, 2)
      iterate iarg
   end

   if   optchar = "--dump" then do
      __dump   = 1
      __extr   = 0
      args   = delword(args, 1, 1)
      iterate iarg
   end

   if  optchar = "--info" then do
      __info   = 1
      __extr   = 0
      args   = delword(args, 1, 1)
      iterate iarg
   end

   if   optchar = "--list" then do
      __list    = 1
      __extr   = 0
      args   = delword(args, 1, 1)
      iterate iarg
   end
   call __log "****************************"
   call __log "Should not occur args      >"args"<"
   call __log "Should not occur argc      >"argc"<"
   call __log "Should not occur iarg      >"iarg"<"
   call __log "Should not occur optchar   >"optchar"<"
   call __log "Should not occur optarg    >"optarg"<"
   call __log "****************************"
   exit
end
args = space(delword(args, 1, 1))
argc = words(args)

/* --mode     _mode_ */
_asis_ = word(". 0 1 1"   ,wordpos(_mode_,"auto text binary update"))

/* --suffix   _suff_ */
if   _suff_ \= "." then do
   if   _mode_  = "auto" then do
      call __log  "suffix '"_suff_"' conflicts with mode '"_mode_"' "
      exit
   end
   else ,
      _suff_ = "." || lower(strip(_suff_,,"."))
end
else ,
   _suff_ = word(".    .txt .bin xxx",wordpos(_mode_,"auto text binary update"))

if   argc = 0 then do
   call __log  "need an argument! "
   call __hlp 1
   exit
end

args = _nodups(args)
argc = words(args)

call __log _align("Started") __sdate __stime

if   __dump then ,
   call __log  "'--dump' specified, all other options will be ignored"
else ,
if   __info then ,
   call __log  "'--info' specified, all other options will be ignored"
else ,
if   __list then ,
   call __log  "'--list' specified, all other options will be ignored"

__XMIheadr   = "E0C9D5D4D9F0F1"x
__POEheadr  = "01CA6D0F"x
__PDSheadr  = "00CA6D0F"x
__R1offset   = 2
__R2offset   = 12

__ESDheadr   = "02C5E2C4"x
__TXTheadr   = "02E3E7E3"x
__RLDheadr_ = "02D9D3C4"x
__ENDheadr  = "02C5D5C4"x

__TXTsuffx   = ".txt"
__BINsuffx   = ".bin"
__XMIsuffx   = ".xmi"
__OBJsuffx   = ".obj"

_MODEsave_  = _mode_
_ASISsave_  = _asis_
_SUFFsave_   = _suff_

do iarg = 1 to argc

   _mode_   = _MODEsave_
   _asis_   = _ASISsave_
   _suff_   = _SUFFsave_

   sysut1 = strip(word(args,iarg))
   if   pos(".",sysut1) = 0 then ,
      sysut1 = sysut1 || ".xmi"
   p = lastpos(__PSEP__,sysut1)
   interpret "parse var sysut1 with 1 xpath1 "p" . "p+1" xfile1"
   parse var xfile1  xname1 "." .
   if   \exists(sysut1) then do
      call __log _align("file not found") "'"sysut1"'"
      iterate iarg
   end
   if   \open(sysut1,"rb") then do
      call __log _align("error opening") "'"sysut1"'"
      iterate iarg
   end

   header = charin(sysut1,2,7)
   call close sysut1
   if header \= __XMIheadr then do
      call __log _align("not a valid XMIT file") "'"sysut1"'"
      iterate iarg
   end
   if   \open(sysut1,"r") then do
      call __log _align("error on 2nd open of") "'"sysut1"'"
      iterate iarg
   end

   call __log
   call __log _align("processing") || "'"sysut1"'"

   call    inminit

   __init    = 0
   __open    = 0
   __skip   = 0

   xfseq      = 0
   sysut2   = ""

   __HAVEpath   = 0
   path      = ""

   do   iget = 1 while ( chars(sysut1) > 0 )
      xbuff = xfget(sysut1)
      xflag = substr(xbuff,1,1)

      if '20'x = bitand(xflag,'20'x) then do
         __open   = 0
         __init   = 0
         if sysut2 \= "" then do
            call close sysut2
            call __log _align(member)"records("right(recds2,8)") file("sysut2")"
            __open = 0
            member = ""
            sysut2 = ""
            recds2 = 0
         end

         if   __dump then do
            call _EBCdmp xbuff
            iterate iget
         end

         xtype = __e2a(substr(xbuff, 2, 6))
         if   xtype    = "INMR01" then do
            inmr01c   = inmr01c + 1
            i      = inmr01c
            list    = ""
            xbuff   = substr(xbuff, 8 )
            call    process_INMR01_03
            iterate iget
         end
         else ,
         if xtype    = "INMR02" then do
            inmr02c   = inmr02c + 1
            i      = inmr02c
            inmr02.i.inmfseq = c2d(substr(xbuff, 8, 4))
            list   = "INMR02." || i || ".inmfseq"
            xbuff   = substr(xbuff,12)
            call    process_INMR01_03
            if   inmr02.i.inmdsorg = "?" then do
               call __log  _align(" ") || ": dsorg '"c2x(dsorg)"' not supp."
               __skip = 1
            end
            if   inmr02.i.inmrecfm = "?" then do
               call __log _align(" ") || ": recfm '"c2x(recfm)"' not supp."
               __skip = 1
            end
            iterate iget
         end
         else ,
         if   xtype   = "INMR03" then do
            xfseq   = xfseq + 1
            if   xfseq \= INMR02.xfseq.inmfseq then ,
               signal logic_error
            __init    = 0
            __open    = 0
            recds2   = 0
            if __extr then ,
            if   __HAVEpath   = 0 then do
               do   i = 1 to inmr02c
                  if   symbol("INMR02."i."inmdsnam") = "VAR" then do
                     rname = inmr02.i.inmdsnam
--                     if   inmr02.i.inmrecfm = "V" & ,
--                     inmr02.i.inmdsorg = "PO" then do
                     if   inmr02.i.inmrecfm = "V" then do
                        _mode_ = "text"
                        _ASISsave_  = 0
                        _asis_ = 0
                        _suff_ = __TXTsuffx
                        call __log "text mode forced for 'RECFM=V' dataset" rname
                     end
                     if   _dest_ = "junk" then ,
                        path = ""
                     else ,
                     if   _dest_ = "name" then ,
                        path = xname1
                     else ,
                        path = _dest_
                     if   \__skip &,
                        path \= "" then do
                        path = strip(path,"T",__PSEP__)
                        if   __UNIX__ then do
                           "mkdir -p    '"path"' "
                        end
                        else ,
                           "mkdir       " path
                        path = path || __PSEP__
                     end
                     __HAVEpath   = 1
                     leave i
                  end
               end
            end

            inmr03c   = inmr03c + 1
            i      = inmr03c
            list    = ""
            xbuff   = substr(xbuff, 8 )
            call    process_INMR01_03
            iterate iget
         end

         call process_INMR04_08

         if   xtype = "INMR06" then ,
            leave iget

         iterate iget
      end

      if   __dump then
         call _EBCdmp xbuff

      if   __dump | ,
         __info then ,
         iterate iget

      if   __skip then ,
         iterate iget

      if   \__init then ,
         call xinit

      if   __skip then ,
         iterate iget

      if   \__open then ,
         call xopen

      if   __skip then ,
         iterate iget

      call xfput

   end

   call close sysut1

end

__edate = date()
__etime = time()
__elaps = time("E")
parse var __elaps secs "." usec
call __log
call __log _align("ended") __etime" elapsed :" secs%60":"secs//60"."usec

exit

logic_error:
call __log  "*********************************"
call __log  "**                             **"
call __log  "** logic error ** at line " || right(sigl,4) || " **"
call __log  "**                             **"
call __log  "*********************************"
exit

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*                                                                    */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
inminit:
   drop   inmr01.
   drop   inmr02.
   drop   inmr03.
   drop   inmr04.
   drop   inmr05.
   drop   inmr06.
   drop   inmr07.
   drop   inmr08.
   drop   __MBR__.
   drop   __SPF__.

   inmr01c = 0 ; inmr01.0 = 0 ;list01  = ""
   inmr02c = 0 ; inmr02.0 = 0 ;list02  = ""
   inmr03c = 0 ; inmr03.0 = 0 ;list03  = ""
   inmr04c = 0 ; inmr04.0 = 0 ;list04  = ""
   inmr05c = 0 ; inmr05.0 = 0 ;list05  = ""
   inmr06c = 0 ; inmr06.0 = 0 ;list06  = ""
   inmr07c = 0 ; inmr07.0 = 0 ;list07  = ""
   inmr08c = 0 ; inmr08.0 = 0 ;list08  = ""

   inmtokn.1  = '0001'x; inmname.1  = "inmddnam"; inmconv.1   = "c";
   inmtokn.2  = '0002'x; inmname.2  = "inmdsnam"; inmconv.2   = "c";
   inmtokn.3  = '0003'x; inmname.3  = "inmmembr"; inmconv.3   = "c";
   inmtokn.4  = '000B'x; inmname.4  = "inmsecnd"; inmconv.4   = "d";
   inmtokn.5  = '000C'x; inmname.5  = "inmdir"  ; inmconv.5   = "d";
   inmtokn.6  = '0022'x; inmname.6  = "inmexpdt"; inmconv.6   = "c";
   inmtokn.7  = '0028'x; inmname.7  = "inmterm" ; inmconv.7   = "c";
   inmtokn.8  = '0030'x; inmname.8  = "inmblksz"; inmconv.8   = "d";
   inmtokn.9  = '003C'x; inmname.9  = "inmdsorg"; inmconv.9   = "x";
   inmtokn.10 = '0042'x; inmname.10 = "inmlrecl"; inmconv.10  = "d";
   inmtokn.11 = '0049'x; inmname.11 = "inmrecfm"; inmconv.11  = "x";
   inmtokn.12 = '1001'x; inmname.12 = "inmtnode"; inmconv.12  = "c";
   inmtokn.13 = '1002'x; inmname.13 = "inmtuid" ; inmconv.13  = "c";
   inmtokn.14 = '1011'x; inmname.14 = "inmfnode"; inmconv.14  = "c";
   inmtokn.15 = '1012'x; inmname.15 = "inmfuid" ; inmconv.15  = "c";
   inmtokn.16 = '1020'x; inmname.16 = "inmlref" ; inmconv.16  = "c";
   inmtokn.17 = '1021'x; inmname.17 = "inmlchg" ; inmconv.17  = "c";
   inmtokn.18 = '1022'x; inmname.18 = "inmcreat"; inmconv.18  = "c";
   inmtokn.19 = '1023'x; inmname.19 = "inmfvers"; inmconv.19  = "c";
   inmtokn.20 = '1024'x; inmname.20 = "inmftime"; inmconv.20  = "c";
   inmtokn.21 = '1025'x; inmname.21 = "inmttime"; inmconv.21  = "c";
   inmtokn.22 = '1026'x; inmname.22 = "inmfack" ; inmconv.22  = "c";
   inmtokn.23 = '1027'x; inmname.23 = "inmerrcd"; inmconv.23  = "c";
   inmtokn.24 = '1028'x; inmname.24 = "inmutiln"; inmconv.24  = "c";
   inmtokn.25 = '1029'x; inmname.25 = "inmuserp"; inmconv.25  = "c";
   inmtokn.26 = '102A'x; inmname.26 = "inmrecct"; inmconv.26  = "c";
   inmtokn.27 = '102C'x; inmname.27 = "inmsize" ; inmconv.27  = "d";
   inmtokn.28 = '102F'x; inmname.28 = "inmnumf" ; inmconv.28  = "d";
   inmtokn.29 = '8012'x; inmname.29 = "inmtype" ; inmconv.29  = "x";

   inmkeys      = 29

   inmdsnam_   = '0002'x
   inmdsorg_   = '003C'x
   inmrecfm_   = '0049'x

   inmutiln_   = '1028'x

   return

return -99

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*                                                                    */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
xfget:
   bleng = charin(sysut1,,1)
   bflag = charin(sysut1,,1)
   buffr = bflag || Charin(sysut1,,c2d(bleng)-2)

   do  while '00'x = Bitand(bflag,'40'x)
      bleng = charin(sysut1,,1)
      bflag = charin(sysut1,,1)
      buffr = buffr || Charin(sysut1,,c2d(bleng)-2)
   end
   return buffr
return -99

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*                                                                    */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
process_INMR04_08:
   if __info then do
      call __log  copies("- ",30)
      call __log  xtype
   end
   return
return -99

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*                                                                    */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
process_INMR01_03:
   do while ( length(xbuff)  > 0 )
      next = inmkey(xbuff)
      nfnd = 1
      select
         when tokn = inmdsorg_ then do
            dsorg = substr(value.1,1,1)
            if dsorg = '02'x then ,
               call value xtype"."i".inmdsorg" , "PO"
            else ,
            if dsorg = '40'x then ,
               call value xtype"."i".inmdsorg" , "PS"
            else ,
               call value xtype"."i".inmdsorg" , "?"
            list = strip(list) || " " || xtype"."i".inmdsorg"
            nfnd = 0
         end

         when tokn = inmrecfm_ then do
            recfm = substr(value.1,1,1)
            if   bitand(recfm,'C0'x) = 'C0'x then ,
               call value xtype"."i".inmrecfm" , "?"
            else ,
            if   bitand(recfm,'80'x) = '80'x then ,
               call value xtype"."i".inmrecfm" , "F"
             else ,
            if   bitand(recfm,'40'x) = '40'x then ,
               call value xtype"."i".inmrecfm" , "V"
            else ,
               call value xtype"."i".inmrecfm" , "?"
            list = strip(list) || " " || xtype"."i".inmrecfm"
            nfnd = 0
         end

         when tokn = inmdsnam_ then do
            dsnam =  __e2a(value.1)
            do   v = 2 to value.0
               dsnam =   dsnam || "." || __e2a(value.v)
            end
            dsnam   = lower(dsnam)
            call value xtype"."i".inmdsnam", dsnam
            list = strip(list) || " " || xtype"."i".inmdsnam"
            nfnd = 0
         end

         otherwise ,
            do   k = 1 to inmkeys
               if   tokn = inmtokn.k then do
                  nfnd = 0
                  knam  = xtype"."i"."inmname.k
                  list  = strip(list) || " " || knam
                  if   value.0 = 0 then ,
                     kval = ""
                  else,
                  if    inmconv.k = "d" then ,
                     kval = c2d(value.1)
                  else ,
                  if   inmconv.k = "x" then ,
                     kval = c2x(value.1)
                  else ,
                     kval = __e2a(value.1)
                  interpret knam "= '"kval"'"
                  leave
               end
            end
      end
      if nfnd then ,
         call __log xtype "unsupported key" c2x(substr(xbuff, 3+1,16))

      xbuff = substr(xbuff,next)
   end

   if __info then do
      call __log  copies("- ",30)
      call __log  xtype i
      do v = 1 to words(list)
         knam = word(list,v)
         kval = value(word(list,v))
          call __log  left(knam,20) || "=" kval
      end
   end
   return

return -99

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*                                                                    */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
inmkey:
   tokn   = substr(xbuff,1  ,2)
   coun    = c2d(substr(xbuff,1+2,2))
   value.0 = coun
   wptr   = 5
   do    v = 1 to coun
      wlen    = c2d(substr(xbuff,wptr  ,2))
        value.v =     substr(xbuff,wptr+2,wlen)
        wptr    = wptr + wlen + 2
   end
   return wptr
return -99

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*                                                                    */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
_EBCdmp:
    parse      arg EBC_buffr
   EBC_fillr   = copies(" ",7)
   EBC_delta   = 1
   say EBC_fillr || ">>" || copies("1234567890",8) || "<<"
   do  while ( EBC_buffr \= "" )
      parse var EBC_buffr with 1 EBC_chunk 81 EBC_buffr
      say left(right(EBC_delta,6),7) || ">>" || __e2a(EBC_chunk) || "<<"
      EBC_chunk = c2x(EBC_chunk)
      EBC_line0 = ""
      EBC_line1 = ""
      do   i = 1 to length(EBC_chunk) - 1 by 2
         EBC_line0 = EBC_line0 || substr(EBC_chunk, i    , 1 )
         EBC_line1 = EBC_line1 || substr(EBC_chunk, i + 1, 1 )
      end
      say EBC_fillr || ">>" || EBC_line0 || "<<"
      say EBC_fillr || ">>" || EBC_line1 || "<<"
      say
      EBC_delta = EBC_delta + 80
   end
   return
return -99

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*                                                                    */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
xinit:
   __init   = 1
   if   inmr02.xfseq.inmutiln = "INMCOPY" then do
      if   inmr02.xfseq.inmdsorg \= "PS" then do
         call __log  "xinit: mismatched utilid:" xfseq inmr02.xfseq.inmutiln
         call __log  "                  dsorg :" xfseq inmr02.xfseq.inmdsorg
         __skip = 1
         return
      end
      return
   end
   else ,
   if   inmr02.xfseq.inmutiln = "IEBCOPY" then do
      if   inmr02.xfseq.inmdsorg \= "PO" then do
         call __log  "xinit: mismatched utilid:" xfseq inmr02.xfseq.inmutiln
         call __log  "                  dsorg :" xfseq inmr02.xfseq.inmdsorg
         __skip = 1
         return
      end
      /* IEBCOPY first control record */
      __R1offset = 2
      if   ( substr(xbuff, __R1offset, 4) \= __PDSheadr ) then do
         call __log  "xinit: header (expected) '"upper(c2x(__PDSheadr))"'x "
         call __log  "xinit:       (found)    '"upper(c2x(substr(xbuff,__R1offset,4)))"'x "
         __skip = 1
         return
      end
      r1dsorg  = c2x(substr(xbuff, __R1offset+4 ,2))
      r1blksz  = c2d(substr(xbuff, __R1offset+6 ,2))
      r1lrecl  = c2d(substr(xbuff, __R1offset+8 ,2))
      LRECL    = c2d(substr(xbuff, __R1offset+8 ,2))
      r1recfm  = c2x(substr(xbuff, __R1offset+10,2))
      r1tblksz = c2x(substr(xbuff, __R1offset+14,2))
      r1devtyp = c2x(substr(xbuff, __R1offset+16,20))
      TRKSXCYL = c2d(substr(xbuff, __R1offset+26,2))

      /* get a data buffer for the next stage */
      xbuff   = xfget(sysut1)

      /* IEBCOPY secnd control record */
      __R2offset    = 2
      deb_ptr      = __R2offset
      deb_count   = c2d(substr(xbuff, deb_ptr, 1))
      deb_reltrk   = 0
      do  i = 1 to deb_count
         deb_ptr      = deb_ptr + 16
         deb_start   = c2d(substr(xbuff, deb_ptr+6 ,2)) * trksxcyl  + ,
                       c2d(substr(xbuff, deb_ptr+8 ,2))
         deb_end      = c2d(substr(xbuff, deb_ptr+10,2)) * trksxcyl  + ,
                       c2d(substr(xbuff, deb_ptr+12,2))
         deb_trks      = c2d(substr(xbuff, deb_ptr+14,2))

         deb_size   = deb_end   - deb_start + 1

         if   deb_size \= deb_trks then do
            call __log "shit oh shit oh debshit"
            exit
         end

         deb_tabl.i.1   = deb_start
         deb_tabl.i.2   = deb_end
         deb_tabl.i.3   = deb_reltrk
         deb_tabl.i.4   = deb_reltrk + deb_trks
         deb_reltrk      = deb_reltrk + deb_trks
      end
      deb_tabl.0 = deb_count

      /* get a data buffer for the next stage */

      /* IEBCOPY directory control records */
      __R3offset    = 2

      /* Process PDS directory */
      do   dir = 1
         xbuff = xfget(sysut1)
         xbuff = substr(xbuff,__R3offset)
         do while (xbuff \= "")
            len = c2d(substr(xbuff,21,2))
            parse var xbuff 1 key 23 blk 277 xbuff

            do ent = 1 while ( blk \= "" )
               if   length(blk) < 12 then ,
                  leave ent
               if   substr(blk,1,8) = "ffffffffffffffff"x then ,
                  leave dir
               ttr   =  lower(c2x(substr(blk, 9,3)))
               flg   =     bitand(substr(blk,12,1),'80'x)
               udl   = c2d(bitand(substr(blk,12,1),'1F'x))

               if   flg = '00'x then do
                  __MBR__.ttr = strip(__e2a(substr(blk,1,8)))
                  if    udl > 99 then do
                     __SPF__.ttr = substr(blk,13,(udl * 2))
                     say left(__MBR__.ttr,8) _spfstats(substr(blk,13,(udl * 2)))
                  end
               end

               len = 12 + udl * 2
               blk = substr(blk,len + 1)
            end
         end
      end

      /* get a data buffer for the next stage */
      xbuff = xfget(sysut1)
      return 0
   end
   else do
      call __log  "xinit: invalid utilid   :" xfseq inmr02.xfseq.inmutiln
      __skip = 1
      return
   end

return -99

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*                                                                    */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
xopen:
   member = ""
   sysut2 = ""
   if   inmr02.xfseq.inmutiln = "INMCOPY" then do
      if   symbol("inmr02."xfseq".inmterm") = "VAR" then do
         if   _mail_ = "save" then ,
            sysut2 = lower( path || __MAILfile)
         else ,
         if   _mail_ = "name" then ,
            sysut2 = lower(xname1 || __MAILsuff)
         else ,
            return
      end
      else do
         sysut2 = lower(path || __TXTfile)
         if _asis_ then ,
            sysut2 = lower(path || __BINfile)
      end
      if   __extr then do
         if   \open(sysut2,"wr") then do
            call __log _align("error opening") "'"sysut2"'"
            call __log _align(" ")  "* * * TERMINATING * * *"
            exit
         end
      end
      recds2   = 0
      __open = 1
      return
   end
   else,
   if   inmr02.xfseq.inmutiln = "IEBCOPY" then do

      /* MEMBER control data */

      __R4offset    = 2

      r4mbrcc   = c2d(substr(xbuff, __R4offset+4,2))
      r4mbrhh = c2d(substr(xbuff, __R4offset+6,2))
      r4mbrr  = c2x(substr(xbuff, __R4offset+8,1))
      trk     = r4mbrcc * TRKSXCYL  + r4mbrhh

      do   i = 1 to deb_tabl.0
         if ( trk >= deb_tabl.i.1 ) & ( trk <= deb_tabl.i.2 ) then ,
            leave
      end

      ttr     = lower(right(d2x(trk - deb_tabl.i.1 + deb_tabl.i.3),4,'0') || r4mbrr)
      member = lower(strip(__MBR__.ttr))
      __open = 1
      return
   end
   else ,
      signal logic_error

return -99

/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/*                                                                    */
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
xfput:
   if   inmr02.xfseq.inmutiln = "INMCOPY" then do
      if   __extr then do
         if _asis_ then ,
            call charout sysut2, substr(xbuff,2)
         else ,
            call lineout sysut2, __e2a(substr(xbuff,2))
      end
      recds2 = recds2 + 1
      return
   end
   else ,
   if   inmr02.xfseq.inmutiln = "IEBCOPY" then do
      xoffs = 2
      if    inmr02.xfseq.inmrecfm = "F" then do
         do while xoffs < length(xbuff)
            blksz = c2d(substr(xbuff,xoffs+10,2))
            if blksz = 0 then do
               if   __extr & ,
                   sysut2 \= "" then ,
                  call close sysut2
               call __log _align(member)"records("right(recds2,8)") file("sysut2")"
               __open = 0
               member = ""
               sysut2 = ""
               recds2 = 0
               leave
            end

            xoffs = xoffs + 12
            do    blksz % LRECL
               if __extr then do
                  if  sysut2 = "" then do
                     if _mode_ = "auto" then do
                        if   substr(xbuff,xoffs+1,7) = __XMIheadr then do
                           _suff_ = __XMIsuffx
                           _asis_ = 1
                        end
                        else ,
                        if   substr(xbuff,xoffs,4) = __ESDheadr | ,
                           substr(xbuff,xoffs,4) = __TXTheadr | ,
                           substr(xbuff,xoffs,4) = __RLDheadr then do
                           _suff_ = __OBJsuffx
                           _asis_ = 1
                        end
                        else do
                           _suff_ = __TXTsuffx
                           _asis_ = 0
                        end
                     end
                     sysut2 = lower(path || member || _suff_)

                     if   \open(sysut2,"wr") then do
                        call __log _align("error opening") "'"sysut2"'" "for("member") "
                        call __log   "* * * TERMINATING * * *"
                        exit
                     end
                     recds2  = 0
                  end
                  if _asis_ then ,
                     call charout sysut2, substr(xbuff,xoffs,LRECL)
                  else ,
                     call lineout sysut2, __e2a(substr(xbuff,xoffs,LRECL))
               end
               recds2  = recds2  + 1
               xoffs = xoffs + LRECL
            end
         end
         return 0
      end
      else ,
      if inmr02.xfseq.inmrecfm = "V" then do
         do while xoffs < length(xbuff)
            blksz = c2d(substr(xbuff,xoffs+10,2))
            if blksz = 0 then do
               if   __extr& ,
                   sysut2 \= "" then ,
                  call close sysut2
               call __log _align(member)"records("right(recds2,8)") file("sysut2")"
               __open = 0
               member = ""
               sysut2 = ""
               recds2 = 0
               leave
            end

            xoffs    = xoffs + 12
            r3limit = xoffs + c2d(substr(xbuff,xoffs,2))
            xoffs    = xoffs + 4
            do while ( xoffs < r3limit)
               LRECL = c2d(substr(xbuff,xoffs,2))
               if   __extr then do
                  if  sysut2 = "" then do
                     sysut2 = lower(path || member || _suff_)
                     if   \open(sysut2,"wr") then do
                        call __log   "error opening :"sysut2 "for :"member
                        call __log   "* * * TERMINATING * * *"
                        exit
                     end
                     recds2  = 0
                  end
                  call lineout sysut2, __e2a(substr(xbuff,xoffs+4,LRECL-4))
               end
               recds2  = recds2  + 1
               xoffs = xoffs + LRECL
            end
         end
         return 0
      end
      else ,
         signal logic_error
   end
   else ,
      signal logic_error

return -99


-- included  /Users/enrico/include/__setup.rxh
__setup:
   __sdate   = date()
   __stime   = time()
   __elaps   = time("E")
   __error   = 0
   __abort   = 0
   __debug   = 0
   __trace   = 0

   parse version _?version
   parse var _?version __RXvers "_" .

   parse source  _?source
   parse lower var _?source _?opsys _?envir _?commnd .
   if   abbrev(_?opsys,"windows") then do
      __PSEP__   = "\"
      __UNIX__   = 0
   end
   else do
      __PSEP__   = "/"
      __UNIX__   = 1
   end

   __MYself = filespec("n",_?commnd)
   parse   var __MYself  __MYself "." .

   return

return -99

-- included  /Users/enrico/include/__utils.rxh
_nodups:procedure
   parse arg dups
   args = ""
   do   i = 1 to words(dups)
      argw = word(dups,i)
      if   wordpos(argw,args) > 0 then ,
         iterate
      args = args argw
   end
   return space(args)
return -99

_align:
   return left(arg(1),15)

-- included  /Users/enrico/include/__cmpat.rxh
exists:
   if __RXvers = "REXX-ooRexx" then do
      if SysIsFile(arg(1)) then return 1
      if SysIsFileDirectory(arg(1)) then return 1
      return 0
   end
   else ,
   if __RXvers = "REXX-Regina" then do
      if stream(arg(1), "c", "query exists") \= "" then return 1
      return 0
   end
   else ,
      return 0
return -99

isFile:
   if __RXvers = "REXX-ooRexx" then do
      if SysIsFile(arg(1)) then return 1
      return 0
   end
   else ,
   if __RXvers = "REXX-Regina" then do
      _?fstat = stream(arg(1), "c", "fstat")
      if wordpos("RegularFile",_?fstat) > 0 then return 1
      return 0
   end
   else ,
      return 0
return -99

isPath:
   if __RXvers = "REXX-ooRexx" then do
      if SysIsFileDirectory(arg(1)) then return 1
      return 0
   end
   else ,
   if __RXvers = "REXX-Regina" then do
      _?fstat = stream(arg(1), "c", "fstat")
      if wordpos("Directory",_?fstat) > 0 then return 1
      return 0
   end
   else ,
      return 0
return -99

open:
   if arg() < 2 then ,
      return 0
   if lower(arg(2)) = "r" then ,
      _?parms = " open read "
   else ,
   if lower(arg(2)) = "rb" then ,
      _?parms = " open read binary"
   else ,
    if   lower(arg(2)) = "w" then ,
      _?parms = " open write"
   else ,
    if   lower(arg(2)) = "wr" then ,
      _?parms = " open write replace"
   else ,
      return 0
   if arg() = 3 then do
      if \datatype(arg(3),"n") then ,
         return 0
      _?parms = _?parms || " reclenght " arg(3)
   end
   return ( stream(arg(1),"c", _?parms) = "READY:" )
return -99

close:
   _?parms = " close"
   return ( stream(arg(1),"c", _?parms) = "READY:" )
return -99

getenv:
   return VALUE(arg(1),,"ENVIRONMENT")
return -99

setenv:
   call VALUE arg(1),arg(2),"ENVIRONMENT"
   return 0
return -99

unsetenv:
   if __RXvers = "REXX-Regina" then ,
      return -1
   if __RXvers = "REXX-ooRexx" then do
      call VALUE arg(1), .NIL, "ENVIRONMENT"
      return 0
   end
   else ,
      return -1
return -99

-- included  /Users/enrico/include/__log.rxh
__log:
   __syslog = ""
   if arg() = 1 then ,
      call lineout __syslog, left(__MYself, 10) || "- " || strip(arg(1),"T")
   else ,
      call lineout __syslog, ""
   return
return -99

-- included  /Users/enrico/include/__hlp.rxh
__hlp:
   HLP_mode = arg(1)
   HLP_flag = 0
   do   i = 1 to sourceline()
      HLP_line = sourceline(i)
      if   strip(HLP_line) = "" then ,
         iterate
      HLP_line = strip(strip(strip(HLP_line),,"/"),,"*")
      if   strip(HLP_line) = "--help:end" then ,
         leave
      if   strip(HLP_line) = "--help:start" then do
         HLP_flag = 1
         iterate i
      end
      if   \HLP_flag then ,
         iterate i
      parse var HLP_line with 1 HLP_levl 2 HLP_line
      if   HLP_levl > HLP_mode then ,
         iterate
      call __log strip(HLP_line,"T")
   end
   exit 0
return -99

-- included  /Users/enrico/include/__a2p.rxh
__a2p:procedure
   return translate(arg(1), ,
   /*0*/ "................" || ,
   /*1*/ "................" || ,
   /*2*/ "202122232425262728292a2b2c2d2e2f"x || ,
   /*3*/ "303132333435363738393a3b3c3d3e3f"x || ,
   /*4*/ "404142434445464748494a4b4c4d4e4f"x || ,
   /*5*/ "505152535455565758595a5b5c5d5e5f"x || ,
   /*6*/ "606162636465666768696a6b6c6d6e6f"x || ,
   /*7*/ "707172737475767778797a7b7c7d7e7f"x || ,
   /*8*/ "................" || ,
   /*9*/ "................" || ,
   /*a*/ "................" || ,
   /*b*/ "................" || ,
   /*c*/ "................" || ,
   /*d*/ "................" || ,
   /*e*/ "................" || ,
   /*f*/ "................" )
   /*     0123456789abcdef*/
return -99

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
/* E2A simple EBCdic to ascii for printable                          */
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
__e2a:
                            /*0123456789abcdef*/
   return translate(arg(1), ,
               /*0*/    "................" || ,
               /*1*/    "................" || ,   
               /*2*/    "................" || ,   
               /*3*/    "................" || ,   
               /*4*/    " ...........<(+." || ,
               /*5*/    "&.........!$*);." || ,   
               /*6*/    "-/.........,%_>?" || ,   
               /*7*/    "..........:#@" || "'" || '="' || ,
               /*8*/    ".abcdefghi......" || ,
               /*9*/    ".jklmnopqr......" || ,
               /*a*/    "..stuvwxyz......" || ,
               /*b*/    "..........[]...." || ,
               /*c*/    "{ABCDEFGHI......" || ,
               /*d*/    "}JKLMNOPQR......" || ,
               /*e*/    "\.STUVWXYZ......" || ,
               /*f*/    "0123456789......" )
                            /*0123456789abcdef*/
return -99


-- included  /Users/enrico/include/__e2a.rxh
__e2a_dummy:procedure
   return translate(arg(1), ,
   "000102039C09867F978D8E0B0C0D0E0F"x || ,
   "101112139D0A08871819928F1C1D1E1F"x || ,
   "808182838485171B88898A8B8C050607"x || ,
   "909116939495960498999A9B14159E1A"x || ,
   "20A0E2E4E0E1E3E5E7F1A22E3C282B7C"x || ,
   "26E9EAEBE8EDEEEFECDF21242A293B5E"x || ,
   "2D2FC2C4C0C1C3C5C7D1A62C255F3E3F"x || ,
   "F8C9CACBC8CDCECFCC603A2340273D22"x || ,
   "D8616263646566676869ABBBF0FDFEB1"x || ,
   "B06A6B6C6D6E6F707172AABAE6B8C6A4"x || ,
   "B57E737475767778797AA1BFD05BDEAE"x || ,
   "ACA3A5B7A9A7B6BCBDBEDDA8AF5DB4D7"x || ,
   "7B414243444546474849ADF4F6F2F3F5"x || ,
   "7D4A4B4C4D4E4F505152B9FBFCF9FAFF"x || ,
   "5CF7535455565758595AB2D4D6D2D3D5"x || ,
   "30313233343536373839B3DBDCD9DA9F"x)
return -99

-- included  /Users/enrico/include/_getopt.rxh
_getopt:

   parse arg OPT_opts, OPT_shrt, OPT_long, OPT_args

   parse var OPT_opts OPT_abbr ";" OPT_strc ";" OPT_arbf ";" OPT_arbt

   /* fixing short options */
   OPT_shrt = translate(OPT_shrt," ",";")

   /* fixing long options */
   OPT_long = translate(OPT_long," ",";")

   /* fixing args for multi word parameters */
   if   OPT_strc \= "." then do
      f = 0
      do   i = 1 to length(OPT_args)
         if   substr(opt_args,i,1) = OPT_strc then ,
            f = 1 - f
         OPT_arbx = verify(OPT_arbf,substr(opt_args,i,1),"M")

         if   f & ,
            OPT_arbx > 0 then ,
            OPT_args = overlay(substr(OPT_arbt,OPT_arbx,1),OPT_args,i,1)

/*
            else ,
            if  substr(opt_args,i,1) = "-" then ,
               OPT_args = overlay("+",OPT_args,i,1)
*/
      end
   end

   /* fixing args for contiguous opt separators*/
   OPT_args = " " || OPT_args || " "
   OPT_argp = 1
   do   forever
      OPT_argp = pos("-", OPT_args, OPT_argp)
      if   OPT_argp = 0 then ,
         leave
      if   substr(OPT_args, OPT_argp-1, 1) \= " " &,
           substr(OPT_args, OPT_argp-1, 1) \= "-" then ,
         OPT_args = left(OPT_args,OPT_argp-1) || " " || substr(OPT_args,OPT_argp)
         OPT_argp = OPT_argp + 1
   end
   OPT_args = space(OPT_args)
   OPT_argc = words(OPT_args)

   OPT_newargs = ""
   OPT_newopts = ""

   OPT_argf = 0
   OPT_flush = 0
   do   OPT_iarg = 1 to OPT_argc
       OPT_tokn = word(OPT_args,OPT_iarg)

      if   OPT_flush then do
         OPT_newargs = OPT_newargs || " " || OPT_tokn
         iterate OPT_iarg
      end

      if   OPT_tokn = "--" then do
         OPT_flush = 1
         iterate OPT_iarg
      end

      if   left(OPT_tokn,2) = "--" then do
         OPT_argf = 0
         OPT_tokn = substr(OPT_tokn,3)
         OPT_fleq = ( pos("=",OPT_tokn) > 0 )
         parse var OPT_tokn OPT_wopt "=" OPT_warg
         OPT_nfnd = 1
         do   OPT_iopt = 1 to words(OPT_long) while(OPT_nfnd)
            if    abbrev(word(OPT_long,OPT_iopt),OPT_wopt,OPT_abbr) then do
               OPT_nfnd = 0
               OPT_newopts = OPT_newopts || " --" || strip(word(OPT_long,OPT_iopt),"t",":")
               leave OPT_iopt
            end
         end
         if   OPT_nfnd then ,
            return "--err invalid option : --"OPT_tokn
         if   \OPT_fleq then do
            OPT_argf = (right(word(OPT_long,OPT_iopt),1) = ":" )
            iterate OPT_iarg
         end
         if   OPT_warg = "" then ,
            return "--err invalid format : --"OPT_tokn
         OPT_newopts = OPT_newopts || " " || OPT_warg
         iterate OPT_iarg
      end

      if   left(OPT_tokn,1) = "-" then do
         OPT_argf = 0
         OPT_tokn = strip(substr(OPT_tokn,2))
         do   while OPT_tokn \= ""
            OPT_wopt = left(OPT_tokn,1)
            OPT_tokn = strip(substr(OPT_tokn,2))
            OPT_nfnd = 1
            do   OPT_iopt = 1 to words(OPT_shrt) while(OPT_nfnd)
               if    abbrev(word(OPT_shrt,OPT_iopt),OPT_wopt,1) then do
                  OPT_nfnd = 0
                  OPT_newopts = OPT_newopts || " -" || strip(word(OPT_shrt,OPT_iopt),"t",":")
                  leave OPT_iopt
               end
            end
            if   OPT_nfnd then ,
               return "--err invalid option : -"OPT_wopt
            OPT_argf = (right(word(OPT_shrt,OPT_iopt),1) = ":" )

            if    OPT_tokn = "" then ,
               iterate OPT_iarg

            if   OPT_argf then do
               OPT_newopts = OPT_newopts || " " || OPT_tokn
               OPT_argf = 0
               iterate OPT_iarg
            end

/*
            if   OPT_argf then ,
               return "--err invalid option sequence : -"OPT_wopt"/-"OPT_tokn
*/

         end

      end

      if   OPT_argf = 1 then do
         OPT_newopts = OPT_newopts || " " || OPT_tokn
         OPT_argf = 0
         iterate OPT_iarg
      end
      else do
         OPT_newargs = OPT_newargs || " " || OPT_tokn
         OPT_argf = 0
         iterate OPT_iarg
      end

   end

   OPT_result = space(OPT_newopts || " -- " || OPT_newargs)
   return OPT_result

return -99


-- included  /Users/enrico/include/_ebcdmp.rxh
_EBCdmp:
   parse arg EBC_buffr
   EBC_fillr = copies(" ",7)
   EBC_delta = 1
   say EBC_fillr || ">>" || copies("1234567890",8) || "<<"
   do  while ( EBC_buffr \= "" )
      parse var EBC_buffr with 1 EBC_chunk 81 EBC_buffr
      say left(right(EBC_delta,6),7) || ">>" || __e2a(EBC_chunk) || "<<"
      EBC_chunk = c2x(EBC_chunk)
      EBC_line0 = ""
      EBC_line1 = ""
      do   i = 1 to length(EBC_chunk) - 1 by 2
         EBC_line0 = EBC_line0 || substr(EBC_chunk, i    , 1 )
         EBC_line1 = EBC_line1 || substr(EBC_chunk, i + 1, 1 )
      end
      say EBC_fillr || ">>" || EBC_line0 || "<<"
      say EBC_fillr || ">>" || EBC_line1 || "<<"
      say
      EBC_delta = EBC_delta + 80
   end
   return
return -99


the script was power tested on ALL the CBT file, up to the lowest nesting level
( some CBT XMI files contain other XMITted files )
the script will ( ONLY for PDS ) check the first record
and determine the type and process accordingly

shortly I will post a cleaned up version, after many years of use most of the parameters are just plain useless
Back to top
View user's profile Send private message
PeterHolland

Global Moderator


Joined: 27 Oct 2009
Posts: 2422
Location: Netherlands, Amstelveen

PostPosted: Tue Sep 04, 2012 2:17 pm    Post subject:
Reply with quote

Enrico,

the TS was talking about .XMI and that is known format in the PC world, XML is not. Beside that just before your post is mentioned already the
manual that describes the Transmit/Receive reocrd lay-out.
Back to top
View user's profile Send private message
enrico-sorichetti

Global Moderator


Joined: 14 Mar 2007
Posts: 10201
Location: italy

PostPosted: Tue Sep 04, 2012 2:26 pm    Post subject: Reply to: .XMI file record structure
Reply with quote

Quote:
It is a pretty simple format.

mild disagreement icon_wink.gif
there are a few quirks on the headers and data record sequence

and the IEBCOPY and PDSE part is nowhere documented
Back to top
View user's profile Send private message
enrico-sorichetti

Global Moderator


Joined: 14 Mar 2007
Posts: 10201
Location: italy

PostPosted: Tue Sep 04, 2012 2:34 pm    Post subject: Reply to: .XMI file record structure
Reply with quote

Quote:
of a xmi file so it can be parsed in a user written program like REXX or SAS on mainframe.


why the need to parse it on the MF
insn' t enough the RECEIVE INDATASET ?
Back to top
View user's profile Send private message
vasanthz

Global Moderator


Joined: 28 Aug 2007
Posts: 1445
Location: Azeroth

PostPosted: Tue Sep 04, 2012 9:31 pm    Post subject:
Reply with quote

Hello,
Quote:
Why don't you create a file of that format on the mainframe and "browse" it?

I could give that a try and assume some logic from it, but it would only be my convenient assumption and may deviate from the actual standard :S
Quote:
z/OS TSO/E Customization SA22-7783-09

Thanks for this, I got the doc from http://www-05.ibm.com/e-business/linkweb/publications/servlet/pbi.wss?CTY=US&FNC=SRX&PBL=SA22-7783-03#

Enrico, Thank you for the complete code, looks GREAT.!! exactly what I was looking for.
I'm intimidated by the length/complexity of the code, So would take quite some time to get a hang of how things are handled in the program.
Quote:
why the need to parse it on the MF
insn' t enough the RECEIVE INDATASET ?

I mean no disrespect, but I would not like to disclose the reason for the requirement now. Will definitely post it here if all things work out as planned.

Thanks & Regards,
Back to top
View user's profile Send private message
dbzTHEdinosauer

Global Moderator


Joined: 20 Oct 2006
Posts: 6966
Location: porcelain throne

PostPosted: Tue Sep 04, 2012 9:44 pm    Post subject:
Reply with quote

Quote:
I mean no disrespect, but I would not like to disclose the reason for the requirement now.


Don't tell us, you are making a tool. icon_lol.gif
Back to top
View user's profile Send private message
vasanthz

Global Moderator


Joined: 28 Aug 2007
Posts: 1445
Location: Azeroth

PostPosted: Tue Sep 04, 2012 10:19 pm    Post subject:
Reply with quote

Quote:
Don't tell us, you are making a tool.

Im not talking :-)
Back to top
View user's profile Send private message
dick scherrer

Site Director


Joined: 23 Nov 2006
Posts: 19270
Location: Inside the Matrix

PostPosted: Tue Sep 04, 2012 10:20 pm    Post subject: Reply to: .XMI file record structure
Reply with quote

I suspect fighting a "fire" . . . icon_smile.gif

But we firefighters often use tools . . . icon_wink.gif

d
Back to top
View user's profile Send private message
vasanthz

Global Moderator


Joined: 28 Aug 2007
Posts: 1445
Location: Azeroth

PostPosted: Tue Sep 04, 2012 11:02 pm    Post subject:
Reply with quote

Here is me at work :-)
Back to top
View user's profile Send private message
enrico-sorichetti

Global Moderator


Joined: 14 Mar 2007
Posts: 10201
Location: italy

PostPosted: Tue Sep 04, 2012 11:05 pm    Post subject: Reply to: .XMI file record structure
Reply with quote

that link is pretty outdated,
at least one more key is present ( 8018) !

but sincerely processing on Your own an xmitted <thing> is really reinventing the wheel

and a waste of Your employer resources

I wrote the script when I started using linux and mac because xmitmgr was available only on windoze and even there it had some limitations

also beware that since the mainframe is EBCDIC most of the translate stuff will not be needed

also ...
remember answering is on our own time and free of charge
and since we are spending time helping the least You should do is to post the requirement from the beginning
so that we can judge the quality of the requirement and decide if to help or not to help

nuff said
Back to top
View user's profile Send private message
vasanthz

Global Moderator


Joined: 28 Aug 2007
Posts: 1445
Location: Azeroth

PostPosted: Tue Sep 04, 2012 11:17 pm    Post subject:
Reply with quote

Hello,
Quote:
waste of Your employer resources
Nope, I use my PC.

I was planning to write an android app to view xmi files as a hobby project.
I wanted to test out the logics using SAS since I am little familiar with SAS and then planned to convert it into Java for android.

I did not want to say it initially since I don't know if it was possible for me and show off without actually doing anything :S
Back to top
View user's profile Send private message
Nic Clouston

Global Moderator


Joined: 10 May 2007
Posts: 1712
Location: UK

PostPosted: Tue Sep 04, 2012 11:18 pm    Post subject:
Reply with quote

I think the solution is to get a smaller fire! icon_lol.gif
Back to top
View user's profile Send private message
prino

Active Member


Joined: 07 Feb 2009
Posts: 982
Location: Oostende, Belgium

PostPosted: Tue Sep 04, 2012 11:56 pm    Post subject:
Reply with quote

Try to make it a bit smaller than the unXmit monster...

FWIW, a Windows exe of just 39k is already available on the CBT site, with the full C source.
Back to top
View user's profile Send private message
enrico-sorichetti

Global Moderator


Joined: 14 Mar 2007
Posts: 10201
Location: italy

PostPosted: Wed Sep 05, 2012 12:11 am    Post subject: Reply to: .XMI file record structure
Reply with quote

rexx runs on android ( Regina ) icon_wink.gif

anyway I will post here the result of my last mods / simplifications / fixes
Back to top
View user's profile Send private message
enrico-sorichetti

Global Moderator


Joined: 14 Mar 2007
Posts: 10201
Location: italy

PostPosted: Wed Sep 05, 2012 2:41 pm    Post subject: Reply to: .XMI file record structure
Reply with quote

You can check also here

http://www.planetmvs.com/unxmit/

and ...
what happened when You googled for android xmit icon_wink.gif
You should have found
https://play.google.com/store/apps/details?id=de.roland.scholz.xmit&hl=en
Back to top
View user's profile Send private message
vasanthz

Global Moderator


Joined: 28 Aug 2007
Posts: 1445
Location: Azeroth

PostPosted: Wed Sep 05, 2012 11:09 pm    Post subject:
Reply with quote

Quote:
what happened when You googled for android xmit icon_wink.gif

Omg :-( It did not show up when I looked it up sometime back.
I was thrilled that im going to try something new related to mainframes, but someone already did it 3 months back.. bummer

anyway good its already there, installing it right away.

Thanks,
Is anyone aware of a good 3270 emulator for android - non commercial use? TN3270 paid version looks good but it has bad reviews(2.2 stars), so hesitant to buy it. ConnectBot, rove mobile admin and VXConnectBot apps only provide basic telnet connectivity.
Back to top
View user's profile Send private message
View previous topic :: :: View next topic  
Post new topic   Reply to topic    IBMMAINFRAMES.com Support Forums -> All Other Mainframe Topics All times are GMT + 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 

Search our Forum:

Similar Topics
Topic Author Forum Replies Posted
No new posts Add PD field from 2nd file to PD in 1st Sushant Garje DFSORT/ICETOOL 6 Thu Dec 01, 2016 4:32 pm
No new posts File Aid to File Manager conversion murali3955 IBM Tools 4 Thu Nov 24, 2016 3:41 pm
No new posts How to convert the VBM file to VB or... Sulabh Agrawal JCL & VSAM 4 Fri Nov 18, 2016 1:04 pm
No new posts CICS Roll back partially - Need to re... dwijadas CICS 4 Wed Nov 16, 2016 4:30 pm
No new posts Problem in writing Output file vickey_dw COBOL Programming 5 Mon Nov 14, 2016 11:14 pm


Facebook
Back to Top
 
Mainframe Wiki | Forum Rules | Bookmarks | Subscriptions | FAQ | Tutorials | Contact Us