Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: HDISVM03

HDISVM03.m

Go to the documentation of this file.
  1. HDISVM03 ;BPFO/JRP,HRN/ART - UUENCODE;5/31/2007
  1. ;;1.0;HEALTH DATA & INFORMATICS;**7**;Feb 22, 2005;Build 33
  1. ;
  1. ENCODE(IN,OUT,ZERO) ;UUEncode contents of array
  1. ; Input: IN = Array containing lines of text to encode
  1. ; (FULL GLOBAL REFERENCE)
  1. ; IN(0) = File name for encoded text
  1. ; (used when uudecoding)
  1. ; IN(1..n) = Lines of text
  1. ; IN(n,1..m) = Continuation of text when length of line
  1. ; is longer than 245 characters
  1. ; OUT = Array to put uuencoded text into
  1. ; (FULL GLOBAL REFERENCE)
  1. ; ZERO = Flag indicating if the main nodes in the input array
  1. ; store their text on a zero node. A value of 1
  1. ; denotes that the text is stored in IN(node,0). A
  1. ; value of 0 denotes that the text is not. This only
  1. ; applies to the main nodes; IN(0) and continuation
  1. ; nodes are assumed to not use a zero node (i.e.
  1. ; IN(0,0) and IN(node,cont,0) are not valid).
  1. ; (DEFAULTS TO 0)
  1. ;
  1. ;Output: None
  1. ; OUT will be set as follows:
  1. ; OUT(1) = "begin 644 FILENAME"
  1. ; OUT(2..n) = UUEncoded line of text
  1. ; OUT(n+1) = "`"
  1. ; OUT(n+2) = "end"
  1. ;
  1. ; Notes: It is assumed that all input is defined
  1. ; : The OUT array will be initialized (KILLed) on input.
  1. ; : It is assumed that IN is not an empty arrary (i.e. there's
  1. ; data to be uuencoded in it).
  1. ; : A carriage return & line feed will be inserted between each
  1. ; line of text [after all continuation nodes have been
  1. ; appended].
  1. ; : FILENAME in node OUT(1) will be replaced by the value from
  1. ; input node IN(0). TEXT.TXT will be used as the filename
  1. ; if IN(0) is not defined or empty.
  1. ;
  1. NEW NODE,CONT,TEXT,WORKING,OUTNODE,CRLF
  1. KILL @OUT
  1. SET ZERO=+$GET(ZERO)
  1. SET CRLF=$CHAR(13,10)
  1. SET WORKING=""
  1. ;Append beginning uuencoding designation to output array
  1. SET TEXT=@IN@(0)
  1. SET:(TEXT="") TEXT="TEXT.TXT"
  1. SET @OUT@(1)="begin 644 "_TEXT
  1. SET OUTNODE=2
  1. ;Loop through input array
  1. SET NODE=0
  1. FOR SET NODE=+$ORDER(@IN@(NODE)) QUIT:('NODE) DO
  1. .SET TEXT=$SELECT(ZERO:@IN@(NODE,0),1:@IN@(NODE))
  1. .DO UUEWORK(TEXT,.WORKING,OUT,.OUTNODE)
  1. .;Loop through continuation nodes
  1. .SET CONT=0
  1. .FOR SET CONT=+$ORDER(@IN@(NODE,CONT)) QUIT:('CONT) DO
  1. ..SET TEXT=@IN@(NODE,CONT)
  1. ..DO UUEWORK(TEXT,.WORKING,OUT,.OUTNODE)
  1. ..QUIT
  1. .;Append CR-LF between main nodes
  1. .DO UUEWORK(CRLF,.WORKING,OUT,.OUTNODE)
  1. .QUIT
  1. ;Encode remaining text
  1. IF $LENGTH(WORKING) DO
  1. .SET @OUT@(OUTNODE)=$$UUE45(WORKING)
  1. .SET OUTNODE=OUTNODE+1
  1. .QUIT
  1. ;Append end uuencoding designation to output array
  1. SET @OUT@(OUTNODE)="`"
  1. SET @OUT@(OUTNODE+1)="end"
  1. QUIT
  1. ;
  1. ENCGRID(IN,OUT,DELIMITR) ;UUEncode contents of a grid
  1. ; Input: IN = Array containing grid cells of text to encode
  1. ; (FULL GLOBAL REFERENCE)
  1. ; IN(0) = File name for encoded text
  1. ; (used when uudecoding)
  1. ; IN(1..n,1..n) = Grid cells of text - IN(row,col)=value
  1. ; IN(n,n,1..m) = Continuation of text when length of line
  1. ; is longer than 245 characters
  1. ; OUT = Array to put uuencoded text into
  1. ; (FULL GLOBAL REFERENCE)
  1. ; DELIMITR = Delimiter character (DEFAULTS TO | (pipe))
  1. ;
  1. ;Output: None
  1. ; OUT will be set as follows:
  1. ; OUT(1) = "begin 644 FILENAME"
  1. ; OUT(2..n) = UUEncoded line of text
  1. ; OUT(n+1) = "`"
  1. ; OUT(n+2) = "end"
  1. ;
  1. ; Notes: It is assumed that all input is defined
  1. ; : The input grid array will be 1 based - no subscripts with value
  1. ; of zero (0), except IN(0) which contains the file name
  1. ; IN(0) and continuation nodes are assumed to not use a zero node
  1. ; (i.e. IN(0,0) and IN(row,col,cont,0) are not valid).
  1. ; : The input grid array must include empty cells - no missing nodes
  1. ; : If column headings are included, they must be in row 1 - IN(1,1..n)
  1. ; : The OUT array will be initialized (KILLed) on input.
  1. ; : It is assumed that IN is not an empty arrary (i.e. there's
  1. ; data to be uuencoded in it).
  1. ; : A carriage return & line feed will be inserted between each
  1. ; line of text [after all continuation nodes have been
  1. ; appended].
  1. ; : FILENAME in node OUT(1) will be replaced by the value from
  1. ; input node IN(0). TEXT.TXT will be used as the filename
  1. ; if IN(0) is not defined or empty.
  1. ;
  1. NEW RNODE,CNODE,CONT,TEXT,WORKING,OUTNODE,CRLF
  1. KILL @OUT
  1. SET:($G(DELIMITR)="") DELIMITR="|"
  1. SET CRLF=$CHAR(13,10)
  1. SET WORKING=""
  1. ;Append beginning uuencoding designation to output array
  1. SET TEXT=@IN@(0)
  1. SET:(TEXT="") TEXT="TEXT.TXT"
  1. SET @OUT@(1)="begin 644 "_TEXT
  1. SET OUTNODE=2
  1. ;Loop through input array
  1. SET RNODE=0
  1. FOR SET RNODE=+$ORDER(@IN@(RNODE)) QUIT:('RNODE) DO
  1. .SET CNODE=0
  1. .FOR SET CNODE=+$ORDER(@IN@(RNODE,CNODE)) QUIT:('CNODE) DO
  1. ..SET TEXT=@IN@(RNODE,CNODE)
  1. ..DO UUEWORK(TEXT,.WORKING,OUT,.OUTNODE)
  1. ..;Loop through continuation nodes
  1. ..SET CONT=0
  1. ..FOR SET CONT=+$ORDER(@IN@(RNODE,CNODE,CONT)) QUIT:('CONT) DO
  1. ...SET TEXT=@IN@(RNODE,CNODE,CONT)
  1. ...DO UUEWORK(TEXT,.WORKING,OUT,.OUTNODE)
  1. ...QUIT
  1. ..;Append delimiter between cell nodes
  1. ..DO UUEWORK(DELIMITR,.WORKING,OUT,.OUTNODE)
  1. ..QUIT
  1. .;Append CR-LF between main nodes
  1. .DO UUEWORK(CRLF,.WORKING,OUT,.OUTNODE)
  1. .QUIT
  1. ;Encode remaining text
  1. IF $LENGTH(WORKING) DO
  1. .SET @OUT@(OUTNODE)=$$UUE45(WORKING)
  1. .SET OUTNODE=OUTNODE+1
  1. .QUIT
  1. ;Append end uuencoding designation to output array
  1. SET @OUT@(OUTNODE)="`"
  1. SET @OUT@(OUTNODE+1)="end"
  1. QUIT
  1. ;
  1. UUEWORK(TEXT,WORKING,OUT,OUTNODE) ;UUEncode text & add to output
  1. ; Input: TEXT = Text to append to uuencoded output array
  1. ; WORKING = Text that hasn't been uuencoded yet as
  1. ; uuencoding is done against 45 characters
  1. ; at a time
  1. ; (PASS BY REFERENCE)
  1. ; OUT = Array to put uuencoded text into
  1. ; (FULL GLOBAL REFERENCE)
  1. ; OUTNODE = Node in OUT to store uuencoded text into
  1. ; (PASS BY REFERENCE)
  1. ;Output: None
  1. ; WORKING = Text that was not uuencoded
  1. ; OUTNODE = Next node in OUT to store uuencoded text into
  1. ; OUT will be set as follows:
  1. ; OUT(OUTNODE..n) = UUEncoded line of text
  1. ; Notes: It is assumed that all input is defined
  1. ;
  1. NEW STOP,LENWORK
  1. SET STOP=0
  1. ;UUEncode 45 characters at a time
  1. FOR DO QUIT:(STOP)
  1. .;Combine text with left over text to make 45 character string
  1. .SET LENWORK=$LENGTH(WORKING)
  1. .SET WORKING=WORKING_$EXTRACT(TEXT,1,(45-LENWORK))
  1. .SET TEXT=$EXTRACT(TEXT,(45-LENWORK+1),$LENGTH(TEXT))
  1. .IF $LENGTH(WORKING)<45 SET STOP=1 QUIT
  1. .;UUEncode and store in output array
  1. .SET @OUT@(OUTNODE)=$$UUE45(WORKING)
  1. .;Increment subscript value and reset left over text
  1. .SET OUTNODE=OUTNODE+1
  1. .SET WORKING=""
  1. .QUIT
  1. QUIT
  1. ;
  1. UUE45(TEXT) ;UUEncode a string of 45 characters
  1. ; Input: TEXT = String of text to uuencode (up to 45 characters)
  1. ;Output: UUEncoded text including length character
  1. ; Notes: It is assumed that all input is defined
  1. ; : It is assumed that TEXT will not be greater than 45
  1. ; characters in length.
  1. ;
  1. NEW LOOP,LENGTH,UUENC
  1. SET TEXT=$GET(TEXT)
  1. SET LENGTH=$LENGTH(TEXT)
  1. SET UUENC="" SET:(LENGTH=0) UUENC=$$UUE3("")
  1. FOR LOOP=1:3:LENGTH SET UUENC=UUENC_$$UUE3($EXTRACT(TEXT,LOOP,LOOP+2))
  1. QUIT $CHAR(32+LENGTH)_UUENC
  1. ;
  1. UUE3(CHARS) ;UUEncode 3 characters
  1. ; Input: CHARS = Characters to uuencode (up to 3 characters)
  1. ;Output: UUEncoded text
  1. ; Notes: It is assumed that all input is defined
  1. ; : It is assumed that CHARS will not be greater than 3
  1. ; characters in length.
  1. ; : CHARS will be right padded with spaces to make it 3
  1. ; characters in length.
  1. ;
  1. NEW DEC1,DEC2,DEC3,BIN1,BIN2,BIN3
  1. NEW BIN1A,BIN2A,BIN3A,BIN4A,DEC1A,DEC2A,DEC3A,DEC4A
  1. SET CHARS=$EXTRACT($GET(CHARS)_" ",1,3)
  1. SET DEC1=$ASCII($EXTRACT(CHARS,1))
  1. SET DEC2=$ASCII($EXTRACT(CHARS,2))
  1. SET DEC3=$ASCII($EXTRACT(CHARS,3))
  1. SET BIN1=$$RJ^XLFSTR($$CNV^XLFUTL(DEC1,2),8,"0")
  1. SET BIN1=$EXTRACT(BIN1,($LENGTH(BIN1)-7),$LENGTH(BIN1))
  1. SET BIN2=$$RJ^XLFSTR($$CNV^XLFUTL(DEC2,2),8,"0")
  1. SET BIN2=$EXTRACT(BIN2,($LENGTH(BIN2)-7),$LENGTH(BIN2))
  1. SET BIN3=$$RJ^XLFSTR($$CNV^XLFUTL(DEC3,2),8,"0")
  1. SET BIN3=$EXTRACT(BIN3,($LENGTH(BIN3)-7),$LENGTH(BIN3))
  1. SET BIN1A=$EXTRACT(BIN1,1,6)
  1. SET BIN2A=$EXTRACT(BIN1,7,8)_$EXTRACT(BIN2,1,4)
  1. SET BIN3A=$EXTRACT(BIN2,5,8)_$EXTRACT(BIN3,1,2)
  1. SET BIN4A=$EXTRACT(BIN3,3,8)
  1. SET DEC1A=$$DEC^XLFUTL(BIN1A,2)+32
  1. SET DEC2A=$$DEC^XLFUTL(BIN2A,2)+32
  1. SET DEC3A=$$DEC^XLFUTL(BIN3A,2)+32
  1. SET DEC4A=$$DEC^XLFUTL(BIN4A,2)+32
  1. QUIT $CHAR(DEC1A,DEC2A,DEC3A,DEC4A)