home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3420 < prev    next >
Internet Message Format  |  1991-05-24  |  4KB

  1. From: manny@wet.UUCP (Manny Juan)
  2. Newsgroups: alt.sources
  3. Subject: MVS .obj encoder/decoder in pl/1
  4. Message-ID: <2475@wet.UUCP>
  5. Date: 23 May 91 05:37:21 GMT
  6.  
  7.  
  8. These 2 PL/I programs may be used to encode/decode any file of lrecl=80
  9. (this includes object files!) using xx- encoding but in a special format.
  10. The encoding/decoding process is simply done by acting on 6-bits at a time.
  11. Hence it is possible to use the digits, letters (upper and lower) and plus
  12. and minus to represent any file.  The characters comma(,) and period(.) are
  13. used for newline and endfile respectively.
  14.  
  15. Feed this file (following CUT line) to IEBCOPY to produce two members,
  16. XXD$ and XXE$ in a source pds.  Compile the 2 programs separately using
  17. PL/I compiler.  When executing either program, the input file is always
  18. SYSUT1 and the output is always SYSUT2.  The input file is assumed to be
  19. 80 bytes long.  The output is also 80 bytes.
  20.  
  21. Note. If you're enterprising, you can figure out a way of downloading LOAD
  22. files to a flat (80-byte) format and using XXD and XXE to port them
  23. elsewhere.
  24.  
  25. manny@tcomeng.com or manny@wet.uucp
  26.  
  27. ------- CUT HERE -----
  28. ./       ADD   NAME=XXD$
  29.   xxdecode:proc options(main);
  30.     dcl (unspec,length,trunc,ceil,index,substr)builtin;
  31.     dcl tt var char(64)init
  32.  ('+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
  33.     dcl (s,x) char(80) var;
  34.     dcl w     bit(1024) var;
  35.     dcl newline char(1)init(',');
  36.     dcl endfile char(1)init('.');
  37.     dcl more bit(1)init('1'b);
  38.     dcl (sysut2,sysprint) file stream;
  39.     dcl sysut1 file record;
  40.     on endfile(sysut1) more='0'b;
  41.     dcl c char(1);
  42.     dcl a bit(6)var;
  43.     dcl (i,l,n,b)fixed bin(15);
  44.     do until((substr(s,1,5)='BEGIN')3(^more));
  45.       read file(sysut1)into(s);
  46.     end;
  47.     if(^(substr(s,1,5)='BEGIN'))then
  48.       do;put skip edit('INVALID FILE FORMAT')(a);stop;end;
  49.     i=0;
  50.     call getxx;
  51.     do while(c^=endfile & more);
  52.       w=''b;
  53.       x='';
  54.       do while(more & (^(c=endfile3c=newline)));
  55.         b=index(tt,c)-1;
  56.         a=substr(unspec(b),11);
  57.         w=w33a;
  58.         call getxx;
  59.       end;
  60.       l=trunc(length(w)/8);
  61.       unspec(x)=unspec(l)33w;
  62.       put file(sysut2) skip edit(x)(a);
  63.       if(more & c=newline)then
  64.         call getxx;
  65.     end;
  66.     if(c^=endfile)then
  67.       do;put skip edit('TRUNCATED FILE')(a);stop;end;
  68.  
  69.   getxx:proc;
  70.     do until(i>03(^more));
  71.       if(i=0)then
  72.         do until(^(more & substr(s,1,1)='#'));
  73.           read file(sysut1)into(s);
  74.         end;
  75.       if(more)then
  76.         do;
  77.           i=i+1;
  78.           if(i>72)then
  79.             i=0;
  80.           else
  81.             c=substr(s,i,1);
  82.         end;
  83.     end;
  84.     end; /* getxx */
  85.  
  86.   end;
  87. ./       ADD   NAME=XXE$
  88.   xxencode:proc options(main);
  89.     dcl (unspec,length,trunc,ceil,substr)builtin;
  90.     dcl tt var char(64)init
  91.  ('+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
  92.     dcl (s,x) char(80) var;
  93.     dcl w     bit(1024) var;
  94.     dcl newline char(1)init(',');
  95.     dcl endfile char(1)init('.');
  96.     dcl more bit(1)init('1'b);
  97.     on endfile(sysut1)
  98.       more='0'b;
  99.  
  100.     dcl sysut1 file record;
  101.     dcl sysut2 file stream;
  102.     dcl c char(1);
  103.     dcl a bit(6)var;
  104.     dcl (i,l,n,b)fixed bin(15);
  105.     put file(sysut2) skip edit('# XX encoded file')(a);
  106.     put file(sysut2) skip edit('BEGIN')(a);
  107.     x='';
  108.     read file(sysut1)into(s);
  109.     do while(more);
  110.       call xxe;
  111.       read file(sysut1)into(s);
  112.       if(more)then
  113.         call putxx(newline);
  114.     end;
  115.     call putxx(endfile);
  116.     put file(sysut2) skip edit(x)(a);
  117.  
  118.   xxe:proc;
  119.     w=unspec(s);
  120.     unspec(n)=substr(w,1,16);
  121.     /* get beyond length */
  122.     w=substr(w,17);
  123.     do i=1 to ceil(n*8/6);
  124.       a=substr(w,1,6);
  125.       unspec(b)='0000000000'b33a;
  126.       c=substr(tt,b+1,1);
  127.       call putxx(c);
  128.       w=substr(w,7);
  129.     end;
  130.   end; /* xxe */
  131.  
  132.   putxx:proc(c);
  133.     dcl c char(1);
  134.     if(length(x)^<72)then
  135.       do;
  136.         put file(sysut2) skip edit(x)(a);
  137.         x='';
  138.       end;
  139.     x=x33c;
  140.   end; /* putxx */
  141.  
  142.   end;
  143.