/* REXX */
	NUMERIC DIGITS 18
	ZocCLS
MAIN:	DIR_PART="C:\_DUMPS" ; OUT_DIR=DIR_PART||"\"
	abst=GET_FILE("SELECT .CFS [.TXS] FILE")
	IN_FILE=F_READ(abst)
	T=0 
	i=pos("092881",IN_FILE,1)
	if i<>0 then T=1
	i=pos("020410",IN_FILE,1)
	if i<>0 then T=2
	if T=0 then do
	   say " UNKNOWN FILE FORMAT"
	   signal MAIN
	   end
	i=pos(x2c(0A),IN_FILE,1) 	   
	abst=""	; IN_FILE=delstr(IN_FILE,1,i)
	do i=1 to length(IN_FILE)
	   CHAR=substr(IN_FILE,i,1)
	   if T=1 then do
	      CHAR=REORGNIZER(CHAR)
	      end 
	   else do
	      CHAR=d2x(c2d(CHAR)+x2d(68))            
	      tmp=left(x2b(CHAR),4)                  
	      tmp=x2d(b2x(tmp)) -7                   
	      CHAR=x2d(CHAR)-tmp*x2d(20)             
	      CHAR=d2c(CHAR)
	      end  
	   abst=abst||CHAR
	end
	call F_WRITE OUT_DIR||F_NAME||".TXT",,1
	signal MAIN

/* ============================================================== */
F_SPEC:
	parse arg F_PART 
	k=lastpos("\",F_PART)
	if k<>0 then do
	   DIR_PART=left(F_PART,k-1)
	     F_PART=substr(F_PART,k+1,) 
	end
	_=translate(F_PART," ",".")
	F_NAME=word(_,1)
	F_EXT =word(_,2)
RETURN
/* ============================================================== */
F_CREATE:
	parse arg FILE
	call F_SPEC FILE

	if stream(DIR_PART,"C","QUERY EXISTS")="" then do
	   call ZocShell MD DIR_PART,1
	end
	_=DIR_PART||"\"||F_PART
	if stream(_,"C","QUERY EXISTS")<>"" then do
	   call ZocShell DEL _,1
	end
	call stream _,"C","OPEN WRITE"
RETURN _
/* ============================================================== */
F_CLOSE:
	parse arg _FILE,SILENT   
	call stream _FILE,"C","CLOSE" 
	if SILENT<>"" then
	   do	
	   say ""
	   say "SAVED TO:"
	   tmp=DIR_PART||"\"||F_PART
	   if length(tmp)<80 then say tmp
	   else do
	      say DIR_PART||"\"
	      say F_PART
	   end   
        end	
RETURN	
/* ============================================================== */
F_READ:
	parse arg FILE,LENGTH!
	call F_SPEC FILE
	if stream(FILE,"C","query exists")="" then 
	   do
	   say FILE||" NOT FOUND."
	   RETURN ""   
	end
	_=stream(FILE,"C","query size")
	if _=0 then
	   do
	   say "length "||FILE||" =0."
	   RETURN "" 
	end
	if LENGTH!="" then LENGTH!=_
	call stream FILE,"C","OPEN READ"
	_S =charin(FILE,1,LENGTH!)
	call stream FILE,"C","CLOSE" 

	DIGITS_FOR_OFFSET=length(d2x(length(_S)))
	if DIGITS_FOR_OFFSET < 4 then DIGITS_FOR_OFFSET=4       
RETURN _S	
/* ============================================================== */
F_WRITE:
	parse arg FILE,_str,P3                       
	if _str="" then _str=abst
	OUT_FILE=F_CREATE(FILE)
	call charout OUT_FILE,_str
	call F_CLOSE OUT_FILE,P3	
RETURN
/* ============================================================== */
GET_FILE:
	parse arg MSG
	if MSG="" then MSG="SELECT FILE:"
	
L0:	#= ZocGetFilename(MSG, DIR_PART||"\*.*")  
	if #="##CANCEL##" then 
	   do
	   say "BYE"
	   exit
	end
 	if stream(#,"C","QUERY EXISTS")="" then do
    	   say "["||#||"] NOT FOUND.RETRY"
	   signal L0
	end
/*	call F_SPEC # */
RETURN #	
/* ============================================================== */
REORGNIZER: 
	parse arg ?CHAR
	if c2d(?CHAR)>=x2d(66) then RETURN d2c(c2d(?CHAR)-5)
	if c2d(?CHAR)>=x2d(4A) then RETURN d2c(c2d(?CHAR)-9)
	if c2d(?CHAR)=x2d(42) then RETURN d2c(c2d(?CHAR)-3)
	if c2d(?CHAR)>=x2d(36) then RETURN d2c(c2d(?CHAR)-6)
RETURN ?CHAR
/* ============================================================== */
	