| [613] | 1 | LA7VHLU3 ;DALOI/JMC - HL7 Segment Utility ;01/19/99  13:48
 | 
|---|
 | 2 |  ;;5.2;AUTOMATED LAB INSTRUMENTS;**46,64**;Sep 27, 1994
 | 
|---|
 | 3 |  ;
 | 
|---|
 | 4 |  Q
 | 
|---|
 | 5 |  ;
 | 
|---|
 | 6 | NTE(LA7TXT,LA7TYP,LA7FS,LA7ECH,LA7NTESN) ; Build NTE segment -  notes and comments
 | 
|---|
 | 7 |  ; Call with  LA7TXT = text to send
 | 
|---|
 | 8 |  ;            LA7TYP = source of comment - HL table 0105
 | 
|---|
 | 9 |  ;                     Default to L (ancilliary/filler)
 | 
|---|
 | 10 |  ;             LA7FS = HL field separator
 | 
|---|
 | 11 |  ;            LA7ECH = HL encoding characters
 | 
|---|
 | 12 |  ;          LA7NTESN = segment SET ID (pass by reference)
 | 
|---|
 | 13 |  ;
 | 
|---|
 | 14 |  ; Returns LA7Y - built segment
 | 
|---|
 | 15 |  ;
 | 
|---|
 | 16 |  N LA7Y
 | 
|---|
 | 17 |  ;
 | 
|---|
 | 18 |  S LA7FS=$G(LA7FS),LA7TXT=$G(LA7TXT)
 | 
|---|
 | 19 |  ; Remove leading "~" from comments
 | 
|---|
 | 20 |  I $E(LA7TXT,1)="~" S LA7TXT=$$TRIM^XLFSTR(LA7TXT,"L","~")
 | 
|---|
 | 21 |  S LA7TXT=$$CHKDATA^LA7VHLU3(LA7TXT,LA7FS_LA7ECH)
 | 
|---|
 | 22 |  ;
 | 
|---|
 | 23 |  ; Update segment SET ID
 | 
|---|
 | 24 |  S LA7NTESN=$G(LA7NTESN)+1
 | 
|---|
 | 25 |  ;
 | 
|---|
 | 26 |  ; Default source of comment if undefined
 | 
|---|
 | 27 |  I $G(LA7TYP)="" S LA7TYP="L"
 | 
|---|
 | 28 |  ;
 | 
|---|
 | 29 |  S LA7Y="NTE"_LA7FS_LA7NTESN_LA7FS_LA7TYP_LA7FS_LA7TXT_LA7FS
 | 
|---|
 | 30 |  ;
 | 
|---|
 | 31 |  Q LA7Y
 | 
|---|
 | 32 |  ;
 | 
|---|
 | 33 |  ;
 | 
|---|
 | 34 | CHKDATA(LA7IN,LA7CH) ; Check data to be built into an HL7 field for characters that
 | 
|---|
 | 35 |  ; conflict with encoding characters. Convert conflicting character using HL7 escape encoding.
 | 
|---|
 | 36 |  ;
 | 
|---|
 | 37 |  ; Call with LA7IN = data to be checked
 | 
|---|
 | 38 |  ;           LA7CH = HL7 delimiters to check for
 | 
|---|
 | 39 |  ;
 | 
|---|
 | 40 |  ; Returns LA7OUT - checked data, converted if appropriate
 | 
|---|
 | 41 |  ;
 | 
|---|
 | 42 |  N J,LA7DLIM,LA7ESC,LA7LEN,LA7OUT,X
 | 
|---|
 | 43 |  ;
 | 
|---|
 | 44 |  S LA7IN=$G(LA7IN),LA7CH=$G(LA7CH)
 | 
|---|
 | 45 |  S LA7OUT=""
 | 
|---|
 | 46 |  ;
 | 
|---|
 | 47 |  I LA7IN=""!(LA7CH="") Q LA7OUT
 | 
|---|
 | 48 |  ;
 | 
|---|
 | 49 |  ; Build array of encoding characters to check
 | 
|---|
 | 50 |  S LA7LEN=$L(LA7CH)
 | 
|---|
 | 51 |  S LA7DLIM=$S(LA7LEN=5:"FSRET",1:"SRET")
 | 
|---|
 | 52 |  S LA7ESC=$E(LA7CH,LA7LEN-1)
 | 
|---|
 | 53 |  F J=1:1:LA7LEN S LA7CH($E(LA7CH,J))=$E(LA7DLIM,J)
 | 
|---|
 | 54 |  ;
 | 
|---|
 | 55 |  ; Check each character and convert if appropiate
 | 
|---|
 | 56 |  F J=1:1:$L(LA7IN) D
 | 
|---|
 | 57 |  . S X=$E(LA7IN,J)
 | 
|---|
 | 58 |  . I $D(LA7CH(X)) S X=$$ENESC(LA7CH(X),LA7ESC)
 | 
|---|
 | 59 |  . S LA7OUT=LA7OUT_X
 | 
|---|
 | 60 |  ;
 | 
|---|
 | 61 |  Q LA7OUT
 | 
|---|
 | 62 |  ;
 | 
|---|
 | 63 |  ;
 | 
|---|
 | 64 | CNVFLD(LA7IN,LA7ECH1,LA7ECH2) ; Convert an encoded HL7 segment/field from one encoding scheme to another
 | 
|---|
 | 65 |  ; Call with   LA7IN = data to be converted
 | 
|---|
 | 66 |  ;           LA7ECH1 = delimiters of input
 | 
|---|
 | 67 |  ;           LA7ECH2 = delimiters of output
 | 
|---|
 | 68 |  ;
 | 
|---|
 | 69 |  ; Returns LA7OUT - segment/field converted to new encoding scheme
 | 
|---|
 | 70 |  ;
 | 
|---|
 | 71 |  N J,LA7DLIM,LA7ECH,LA7ESC,LA7LEN,LA7OUT,X
 | 
|---|
 | 72 |  ;
 | 
|---|
 | 73 |  S LA7IN=$G(LA7IN),LA7ECH1=$G(LA7ECH1),LA7ECH2=$G(LA7ECH2)
 | 
|---|
 | 74 |  S LA7OUT=""
 | 
|---|
 | 75 |  ;
 | 
|---|
 | 76 |  I LA7IN=""!(LA7ECH1="")!(LA7ECH2="") Q LA7OUT
 | 
|---|
 | 77 |  ;
 | 
|---|
 | 78 |  ; Abort if encoding schemes not equal length
 | 
|---|
 | 79 |  I $L(LA7ECH1)'=$L(LA7ECH2) Q LA7OUT
 | 
|---|
 | 80 |  ;
 | 
|---|
 | 81 |  ; If same then return input as output
 | 
|---|
 | 82 |  I LA7ECH1=LA7ECH2 Q LA7IN
 | 
|---|
 | 83 |  ;
 | 
|---|
 | 84 |  ; Determine position of HL7 ESCAPE encoding character
 | 
|---|
 | 85 |  ; 4th position if field separator and encoding characters passed
 | 
|---|
 | 86 |  ; 3rd position if only encoding characters passed
 | 
|---|
 | 87 |  ; Based on length of input encoding character variable
 | 
|---|
 | 88 |  S LA7LEN=$L(LA7ECH1)
 | 
|---|
 | 89 |  S LA7DLIM=$S(LA7LEN=5:"FSRET",1:"SRET")
 | 
|---|
 | 90 |  S LA7ESC=$E(LA7DLIM,LA7LEN-1)
 | 
|---|
 | 91 |  ;
 | 
|---|
 | 92 |  ; Build array to convert source encoding to target encoding
 | 
|---|
 | 93 |  F J=1:1:$L(LA7ECH1) S LA7ECH($E(LA7ECH1,J))=$E(LA7ECH2,J)
 | 
|---|
 | 94 |  ;
 | 
|---|
 | 95 |  ; Check each character and convert if appropiate
 | 
|---|
 | 96 |  ; If source conflicts with target encoding character
 | 
|---|
 | 97 |  ;    then convert to escape encoding
 | 
|---|
 | 98 |  ; If match on source encoding character - convert to new encoding
 | 
|---|
 | 99 |  F J=1:1:$L(LA7IN) D
 | 
|---|
 | 100 |  . S X=$E(LA7IN,J)
 | 
|---|
 | 101 |  . I '$D(LA7ECH(X)),LA7ECH2[X S X=$$ENESC($E(LA7DLIM,($F(LA7ECH2,X)-1)),LA7ESC)
 | 
|---|
 | 102 |  . I $D(LA7ECH(X)) S X=LA7ECH(X)
 | 
|---|
 | 103 |  . S LA7OUT=LA7OUT_X
 | 
|---|
 | 104 |  ;
 | 
|---|
 | 105 |  Q LA7OUT
 | 
|---|
 | 106 |  ;
 | 
|---|
 | 107 |  ;
 | 
|---|
 | 108 | ENESC(LA7X,LA7ESC) ; Encode data using HL7 escape encoding
 | 
|---|
 | 109 |  ; Call with   LA7X = character to encode
 | 
|---|
 | 110 |  ;           LA7ESC = HL7 escape encoding character
 | 
|---|
 | 111 |  ;
 | 
|---|
 | 112 |  ; Returns string of escape encoded data.
 | 
|---|
 | 113 |  ;
 | 
|---|
 | 114 |  N LA7Y
 | 
|---|
 | 115 |  ;
 | 
|---|
 | 116 |  S LA7Y=""
 | 
|---|
 | 117 |  S LA7Y=LA7ESC_LA7X_LA7ESC
 | 
|---|
 | 118 |  ;
 | 
|---|
 | 119 |  Q LA7Y
 | 
|---|
 | 120 |  ;
 | 
|---|
 | 121 |  ;
 | 
|---|
 | 122 | UNESC(LA7X,LA7CH) ; Unescape data using HL7 escape encoding
 | 
|---|
 | 123 |  ; Call with  LA7X = string to decode
 | 
|---|
 | 124 |  ;           LA7CH = HL7 delimiters (both field separator & encoding characters)
 | 
|---|
 | 125 |  ;
 | 
|---|
 | 126 |  ; Returns string of unencoded data.
 | 
|---|
 | 127 |  ;
 | 
|---|
 | 128 |  N J,LA7ESC,LA7DLIM,LA7LEN
 | 
|---|
 | 129 |  ;
 | 
|---|
 | 130 |  ; If data does not contain escape encoding then return input string as output
 | 
|---|
 | 131 |  S LA7LEN=$L(LA7CH),LA7ESC=$E(LA7CH,LA7LEN-1)
 | 
|---|
 | 132 |  I LA7X'[LA7ESC Q LA7X
 | 
|---|
 | 133 |  ;
 | 
|---|
 | 134 |  ; Build array of encoding characters to replace
 | 
|---|
 | 135 |  S LA7DLIM=$S(LA7LEN=5:"FSRET",1:"SRET")
 | 
|---|
 | 136 |  F J=1:1:LA7LEN S LA7CH(LA7ESC_$E(LA7DLIM,J)_LA7ESC)=$E(LA7CH,J)
 | 
|---|
 | 137 |  ;
 | 
|---|
 | 138 |  Q $$REPLACE^XLFSTR(LA7X,.LA7CH)
 | 
|---|
 | 139 |  ;
 | 
|---|
 | 140 |  ;
 | 
|---|
 | 141 | UNESCFT(LA7X,LA7CH,LA7Y) ; Unescape formatted text data using HL7 escape encoding
 | 
|---|
 | 142 |  ; Call with  LA7X = array to decode (pass by reference)
 | 
|---|
 | 143 |  ;           LA7CH = HL7 delimiters (both field separator & encoding characters)
 | 
|---|
 | 144 |  ;
 | 
|---|
 | 145 |  ; Returns    LA7Y =  array of unencoded data.
 | 
|---|
 | 146 |  ;
 | 
|---|
 | 147 |  N J,K,LA7ESC,LA7I,LA7Z,SAVX,SAVY,Z
 | 
|---|
 | 148 |  ;
 | 
|---|
 | 149 |  S J=0,LA7ESC=$E(LA7CH,$L(LA7CH)-1),(LA7I,SAVX,SAVY)=""
 | 
|---|
 | 150 |  F  S LA7I=$O(LA7X(LA7I)) Q:LA7I=""  D
 | 
|---|
 | 151 |  . S J=J+1
 | 
|---|
 | 152 |  . I LA7X(LA7I)'[LA7ESC,SAVY="" S LA7Y(J,0)=LA7X(LA7I) Q
 | 
|---|
 | 153 |  . F K=1:1:$L(LA7X(LA7I)) D
 | 
|---|
 | 154 |  . . S Z=$E(LA7X(LA7I),K)
 | 
|---|
 | 155 |  . . I Z=LA7ESC D  Q
 | 
|---|
 | 156 |  . . . I SAVY="" S SAVY=Z Q
 | 
|---|
 | 157 |  . . . S SAVY=SAVY_Z
 | 
|---|
 | 158 |  . . . I $P(SAVY,LA7ESC,2)=".br" S LA7Y(J,0)=$S(SAVX]"":SAVX,1:" "),SAVX="",J=J+1
 | 
|---|
 | 159 |  . . . I $E(SAVY,2)'="." S SAVX=SAVX_$$UNESC(SAVY,LA7CH)
 | 
|---|
 | 160 |  . . . S SAVY=""
 | 
|---|
 | 161 |  . . I SAVY]"" S SAVY=SAVY_Z Q
 | 
|---|
 | 162 |  . . S SAVX=SAVX_Z
 | 
|---|
 | 163 |  . S LA7Y(J,0)=SAVX,SAVX=""
 | 
|---|
 | 164 |  S LA7Y=J
 | 
|---|
 | 165 |  ;
 | 
|---|
 | 166 |  Q
 | 
|---|