| 1 | TMGBINF ;TMG/kst/Binary <--> Global Functions ;03/25/06
 | 
|---|
| 2 |          ;;1.0;TMG-LIB;**1**;08/20/05
 | 
|---|
| 3 |  
 | 
|---|
| 4 |  ;"TMG BIN <-->GBL FUNCTIONS
 | 
|---|
| 5 |  ;"Kevin Toppenberg MD
 | 
|---|
| 6 |  ;"GNU General Public License (GPL) applies
 | 
|---|
| 7 |  ;"8-20-2005
 | 
|---|
| 8 |  
 | 
|---|
| 9 |  ;"=======================================================================
 | 
|---|
| 10 |  ;" API -- Public Functions.
 | 
|---|
| 11 |  ;"=======================================================================
 | 
|---|
| 12 |  ;"$$BFTG(path,filename,globalRef,incSubscr,width) -- BINARY FILE TO GLOBAL
 | 
|---|
| 13 |  ;"$$GTBF(globalRef,incSubscr,path,filename) -- GLOBAL TO BINARY FILE
 | 
|---|
| 14 |  ;"CPYBG(srcGRef,srcIncSubscr,dstGRef,dstIncSubscr,width) -- COPY/RESIZE BINARY GLOBAL.
 | 
|---|
| 15 |  
 | 
|---|
| 16 |  
 | 
|---|
| 17 |  ;"=======================================================================
 | 
|---|
| 18 |  ;"PRIVATE API FUNCTIONS
 | 
|---|
| 19 |  ;"=======================================================================
 | 
|---|
| 20 |  ;"$$NEXTNODE(curRef,incSubscr)
 | 
|---|
| 21 |  ;"$$READBG(GRef,incSubscr,pos,count,actualCount)  -- STREAM READ FROM BINARY GLOBAL
 | 
|---|
| 22 |  
 | 
|---|
| 23 |  ;"=======================================================================
 | 
|---|
| 24 |  ;"DEPENDENCIES
 | 
|---|
| 25 |  ;"=======================================================================
 | 
|---|
| 26 |  ;"Uses:  (No other units)
 | 
|---|
| 27 |  
 | 
|---|
| 28 |  ;"=======================================================================
 | 
|---|
| 29 |  
 | 
|---|
| 30 | BFTG(path,filename,globalRef,incSubscr,width)
 | 
|---|
| 31 |         ;"SCOPE: PUBLIC
 | 
|---|
| 32 |         ;"Purpose: To load a binary file from the host filesystem into a global, storing
 | 
|---|
| 33 |         ;"              the composit bytes as raw binary data.
 | 
|---|
| 34 |         ;"              You do not need to open the host file before making this call; it is opened
 | 
|---|
| 35 |         ;"              and closed automatically
 | 
|---|
| 36 |         ;"Input: path --        (required) full path, up to but not including the filename
 | 
|---|
| 37 |         ;"         filename --  (required) name of the file to open
 | 
|---|
| 38 |         ;"         globalRef-- (required) Global reference to WRITE the host binary file to, in fully
 | 
|---|
| 39 |         ;"                           resolved (closed root) format.  This function does NOT kill the global
 | 
|---|
| 40 |         ;"                           before writing to it.
 | 
|---|
| 41 |         ;"                           Note:
 | 
|---|
| 42 |         ;"                           At least one subscript must be numeric.  This will be the incrementing
 | 
|---|
| 43 |         ;"                           subscript (i.e. the subscript that $$BIN2WP^TMGBINWP will increment
 | 
|---|
| 44 |         ;"                           to store each new global node).  This subscript need not be the final
 | 
|---|
| 45 |         ;"                           subscript.  For example, to load into a WORD PROCESSING field, the
 | 
|---|
| 46 |         ;"                           incrementing node is the second-to-last subscript; the final subscript
 | 
|---|
| 47 |         ;"                           is always zero.
 | 
|---|
| 48 |         ;"        incSubscr-- (required) Identifies the incrementing subscript level.  For example, if you
 | 
|---|
| 49 |         ;"                           pass ^TMP(115,1,1,0) as the global_ref parameter and pass 3 as the
 | 
|---|
| 50 |         ;"                           inc_subscr parameter, $$BIN2GBL will increment the third subscript, such
 | 
|---|
| 51 |         ;"                           as ^TMP(115,1,x), but will WRITE notes at the full global reference, such
 | 
|---|
| 52 |         ;"                           as ^TMP(115,1,x,0).
 | 
|---|
| 53 |         ;"        width --        OPTIONAL -- the number of bytes to store per line. Default=512
 | 
|---|
| 54 |                                        ;"*** NOTICE: width is not working properly.  For now, just don't supply a number.
 | 
|---|
| 55 |  
 | 
|---|
| 56 |         ;"Result: 1=success, 0=failure
 | 
|---|
| 57 |         ;"
 | 
|---|
| 58 |         ;"Example:
 | 
|---|
| 59 |         ;"  write $$BFTG(path,file,"^TMP(115,1,1,0)",3)
 | 
|---|
| 60 |         ;"  ^TMP(115,1,1,0)="04016785439093479334987689724398732490782..."
 | 
|---|
| 61 |         ;"  ^TMP(115,1,2,0)="09834573467345092647823450982345858792346..."
 | 
|---|
| 62 |         ;"  ^TMP(115,1,3,0)="90783492734987234098243908723459590823494..."
 | 
|---|
| 63 |         ;"  ^TMP(115,1,4,0)="23489723450234097234980732402349955987284..."
 | 
|---|
| 64 |         ;"  ^TMP(115,1,5,0)="0983457823450982734572349874234874"  <-- not padded with terminal zeros
 | 
|---|
| 65 |         ;"In this example, only digits 0-9 are shown.  In reality each digit can be a byte with a value 0-255
 | 
|---|
| 66 |  
 | 
|---|
| 67 |         new result set result=0  ;"default to failure
 | 
|---|
| 68 |         new handle set handle="TMGHANDLE"
 | 
|---|
| 69 |         new abort set abort=0
 | 
|---|
| 70 |         new blockIn
 | 
|---|
| 71 |         new $ETRAP
 | 
|---|
| 72 |         if $get(globalRef)="" goto BFTGDone
 | 
|---|
| 73 |  
 | 
|---|
| 74 |         new curRef
 | 
|---|
| 75 |         new tempRef set tempRef="^TMP(""BFTG^TMGBINF"","_$J_",1)"
 | 
|---|
| 76 |         ;"if user wants a width other than 512, will have to load into a temporary location,
 | 
|---|
| 77 |         ;"and then copy over to final destination at requested with
 | 
|---|
| 78 |         if +$get(width)>0 set curRef=tempRef
 | 
|---|
| 79 |         else  set curRef=globalRef
 | 
|---|
| 80 |  
 | 
|---|
| 81 |         set filename=$get(filename)
 | 
|---|
| 82 |         if filename="" goto BFTGDone
 | 
|---|
| 83 |  
 | 
|---|
| 84 |         set path=$$DEFDIR^%ZISH($get(path))
 | 
|---|
| 85 |  
 | 
|---|
| 86 |         ;"Note: Each line will 512 bytes long (512 is hard coded into OPEN^%ZISH)
 | 
|---|
| 87 |        do OPEN^%ZISH(handle,path,filename,"RB")  ;"B is a 512 block/binary mode
 | 
|---|
| 88 |         if POP write "Error opening file...",! goto BFTGDone
 | 
|---|
| 89 |         set $ETRAP="set abort=1,$ECODE="""" quit"
 | 
|---|
| 90 |         use IO
 | 
|---|
| 91 |         for  do  quit:($ZEOF)!(abort=1)!(blockIn="")
 | 
|---|
| 92 |         . read blockIn
 | 
|---|
| 93 |         . if (blockIn="") quit
 | 
|---|
| 94 |         . set @curRef=blockIn
 | 
|---|
| 95 |         . set curRef=$$NEXTNODE(curRef,incSubscr)
 | 
|---|
| 96 |  
 | 
|---|
| 97 |         if abort=1 write "Aborted...",!
 | 
|---|
| 98 |         if (abort'=1) set result=1 ;"SUCCESS
 | 
|---|
| 99 |         do CLOSE^%ZISH(handle)
 | 
|---|
| 100 |  
 | 
|---|
| 101 |         if +$get(width)>0 do
 | 
|---|
| 102 |         . do CPYBG(tempRef,3,globalRef,incSubscr,width)
 | 
|---|
| 103 |         . kill @tempRef
 | 
|---|
| 104 |  
 | 
|---|
| 105 |  
 | 
|---|
| 106 | BFTGDone
 | 
|---|
| 107 |         quit result
 | 
|---|
| 108 |  
 | 
|---|
| 109 |  
 | 
|---|
| 110 | GTBF(globalRef,incSubscr,path,filename)
 | 
|---|
| 111 |         ;"SCOPE: PUBLIC
 | 
|---|
| 112 |         ;"Purpose: This function will WRITE the values of nodes of a global (at the subscript
 | 
|---|
| 113 |         ;"              level you specify) to a host file, in a binary fashion.  If the host file already
 | 
|---|
| 114 |         ;"              exists, it is truncated to length zero (0) before the copy.
 | 
|---|
| 115 |         ;"              Each line of the global is written out, in a serial fashion based on the ordering
 | 
|---|
| 116 |         ;"              of the subscripts, with no line terminators written between lines.
 | 
|---|
| 117 |         ;"              You do not need to open the host file before making this call; it is opened
 | 
|---|
| 118 |         ;"              and closed $$GTBF^TMGBINF
 | 
|---|
| 119 |         ;"Input:
 | 
|---|
| 120 |         ;"         globalRef-- Global reference to WRITE the host binary file to, in fully resolved
 | 
|---|
| 121 |         ;"                              (closed root) format.  This function does not kill the global before
 | 
|---|
| 122 |         ;"                              writing to it.  (required)
 | 
|---|
| 123 |         ;"                           Note:
 | 
|---|
| 124 |         ;"                           At least one subscript must be numeric.  This will be the incrementing
 | 
|---|
| 125 |         ;"                           subscript (i.e. the subscript that $$BIN2WP^TMGBINWP will increment
 | 
|---|
| 126 |         ;"                           to store each new global node).  This subscript need not be the final
 | 
|---|
| 127 |         ;"                           subscript.  For example, to load into a WORD PROCESSING field, the
 | 
|---|
| 128 |         ;"                           incrementing node is the second-to-last subscript; the final subscript
 | 
|---|
| 129 |         ;"                           is always zero.
 | 
|---|
| 130 |         ;"        incSubscr-- (required) Identifies the incrementing subscript level.  For example, if you
 | 
|---|
| 131 |         ;"                           pass ^TMP(115,1,1,0) as the global_ref parameter and pass 3 as the
 | 
|---|
| 132 |         ;"                           inc_subscr parameter, $$BIN2GBL will increment the third subscript, such
 | 
|---|
| 133 |         ;"                           as ^TMP(115,1,x), but will WRITE notes at the full global reference, such
 | 
|---|
| 134 |         ;"                           as ^TMP(115,1,x,0).
 | 
|---|
| 135 |         ;"         path --        full path, up to but not including the filename (required)
 | 
|---|
| 136 |         ;"         filename --  name of the file to open (required)
 | 
|---|
| 137 |         ;"Result: 1=success, 0=failure
 | 
|---|
| 138 |         ;"
 | 
|---|
| 139 |         ;"Example:
 | 
|---|
| 140 |         ;"  write $$GTBF(path,file,"^TMP(115,1,1,0)",3)
 | 
|---|
| 141 |         ;"  ^TMP(115,1,1,0)="04016785439093479334987689724398732490782..."
 | 
|---|
| 142 |         ;"  ^TMP(115,1,2,0)="09834573467345092647823450982345858792346..."
 | 
|---|
| 143 |         ;"  ^TMP(115,1,3,0)="90783492734987234098243908723459590823494..."
 | 
|---|
| 144 |         ;"  ^TMP(115,1,4,0)="23489723450234097234980732402349955987284..."
 | 
|---|
| 145 |         ;"  ^TMP(115,1,5,0)="0983457823450982734572349874234874"
 | 
|---|
| 146 |         ;"Each line would be sent to the output file in turn as a continuous data sequence.
 | 
|---|
| 147 |         ;"In this example, only digits 0-9 are shown.  In reality each digit can be a byte with a value 0-255
 | 
|---|
| 148 |         ;"
 | 
|---|
| 149 |  
 | 
|---|
| 150 |         new result set result=0  ;"default to failure
 | 
|---|
| 151 |         new handle set handle="TMGHANDLE"
 | 
|---|
| 152 |         new abort set abort=0
 | 
|---|
| 153 |         new blockOut
 | 
|---|
| 154 |         new mustExist set mustExist=1
 | 
|---|
| 155 |         new $ETRAP
 | 
|---|
| 156 |         new curRef set curRef=globalRef
 | 
|---|
| 157 |  
 | 
|---|
| 158 |         set path=$$DEFDIR^%ZISH($get(path))
 | 
|---|
| 159 |         do OPEN^%ZISH(handle,path,filename,"W")
 | 
|---|
| 160 |         if POP goto GTBFDone
 | 
|---|
| 161 |         set $ETRAP="set abort=1,$ECODE="""" quit"
 | 
|---|
| 162 |         use IO
 | 
|---|
| 163 |         for  do  quit:(curRef="")!(abort=1)
 | 
|---|
| 164 |         . set blockOut=$get(@curRef)
 | 
|---|
| 165 |         . if (blockOut'="") write blockOut
 | 
|---|
| 166 |         . set $X=0 ;"prevent IO system from 'wrapping' (adding a linefeed)
 | 
|---|
| 167 |         . set curRef=$$NEXTNODE(curRef,incSubscr,mustExist)
 | 
|---|
| 168 |  
 | 
|---|
| 169 |         if (abort'=1) set result=1 ;"SUCCESS
 | 
|---|
| 170 |         do CLOSE^%ZISH(handle)
 | 
|---|
| 171 |  
 | 
|---|
| 172 | GTBFDone
 | 
|---|
| 173 |         quit result
 | 
|---|
| 174 |  
 | 
|---|
| 175 |  
 | 
|---|
| 176 | NEXTNODE(curRef,incSubscr,mustExist,incAmount)
 | 
|---|
| 177 |         ;"SCOPE: PUBLIC
 | 
|---|
| 178 |         ;"Purpose: to take a global reference, and increment the node specified by incSubscr
 | 
|---|
| 179 |         ;"Input:   curRef --    The reference to alter, e.g. '^TMP(115,1,4,0)'
 | 
|---|
| 180 |         ;"           incSubscr--The node to alter, e.g.
 | 
|---|
| 181 |         ;"                              1-->^TMG(x,1,4,0)    x would be incremented
 | 
|---|
| 182 |         ;"                              2-->^TMG(115,x,4,0) x would be incremented
 | 
|---|
| 183 |         ;"                              3-->^TMG(115,1,x,0) x would be incremented
 | 
|---|
| 184 |         ;"                              4-->^TMG(115,1,4,x) x would be incremented
 | 
|---|
| 185 |         ;"           mustExist-- (Option)  if >0, then after incrementing, If resulting
 | 
|---|
| 186 |         ;"                               reference doesn't exist then "" is returned.
 | 
|---|
| 187 |         ;"           incAmount -- (Optional) the amount to increment by (default=1)
 | 
|---|
| 188 |         ;"Note: The node that incSubscr references should be numeric (i.e. not a name)
 | 
|---|
| 189 |         ;"      otherwise the alpha node will be treated as a 0
 | 
|---|
| 190 |         ;"result: returns the new reference (or "" if doesn't exist and mustExist>0)
 | 
|---|
| 191 |  
 | 
|---|
| 192 |         new i,result
 | 
|---|
| 193 |         set incAmount=$get(incAmount,1)
 | 
|---|
| 194 |         set result=$qsubscript(curRef,0)_"("
 | 
|---|
| 195 |         for i=1:1:$qlength(curRef) do
 | 
|---|
| 196 |         . new node
 | 
|---|
| 197 |         . if i'=1 set result=result_","
 | 
|---|
| 198 |         . set node=$qsubscript(curRef,i)
 | 
|---|
| 199 |         . if i=incSubscr set node=node+incAmount
 | 
|---|
| 200 |         . if (node'=+node) set node=""""_node_""""
 | 
|---|
| 201 |         . set result=result_node
 | 
|---|
| 202 |         set result=result_")"
 | 
|---|
| 203 |  
 | 
|---|
| 204 |         if $get(mustExist,0)>0 do
 | 
|---|
| 205 |         . if $data(@result)#10=0 set result=""
 | 
|---|
| 206 |  
 | 
|---|
| 207 |         quit result
 | 
|---|
| 208 |  
 | 
|---|
| 209 |  
 | 
|---|
| 210 | CPYBG(srcGRef,srcIncSubscr,dstGRef,dstIncSubscr,width)
 | 
|---|
| 211 |  
 | 
|---|
| 212 |  ;"*** NOTICE: THIS FUNCTION IS NOT WORKING PROPERLY, IT REPEATS THE DATA IN BLOCKS...***
 | 
|---|
| 213 |  
 | 
|---|
| 214 |         ;"Purpose: COPY/RESIZE BINARY GLOBAL.  This can be used to change the number of bytes
 | 
|---|
| 215 |         ;"              stored on each line of a binary global array
 | 
|---|
| 216 |         ;"Input:
 | 
|---|
| 217 |         ;"      srcGRef--      Global reference of the SOURCE binary global array, in fully resolved
 | 
|---|
| 218 |         ;"                              (closed root) format.
 | 
|---|
| 219 |         ;"                           Note:
 | 
|---|
| 220 |         ;"                           At least one subscript must be numeric.  This will be the incrementing
 | 
|---|
| 221 |         ;"                           subscript (i.e. the subscript that $$BIN2WP^TMGBINWP will increment
 | 
|---|
| 222 |         ;"                           to store each new global node).  This subscript need not be the final
 | 
|---|
| 223 |         ;"                           subscript.  For example, to load into a WORD PROCESSING field, the
 | 
|---|
| 224 |         ;"                           incrementing node is the second-to-last subscript; the final subscript
 | 
|---|
| 225 |         ;"                           is always zero.
 | 
|---|
| 226 |         ;"                           REQUIRED
 | 
|---|
| 227 |         ;"      srcIncSubscr-- (required) Identifies the incrementing subscript level, for the source global
 | 
|---|
| 228 |         ;"                           For example, if you pass ^TMP(115,1,1,0) as the global_ref parameter and
 | 
|---|
| 229 |         ;"                           pass 3 as the inc_subscr parameter, $$BIN2GBL will increment the third
 | 
|---|
| 230 |         ;"                           subscript, such as ^TMP(115,1,x), but will WRITE notes at the full global
 | 
|---|
| 231 |         ;"                           reference, such as ^TMP(115,1,x,0).
 | 
|---|
| 232 |         ;"                           REQUIRED
 | 
|---|
| 233 |         ;"      dstGRef--      Global reference of the DESTINATION binary global array, in fully resolved
 | 
|---|
| 234 |         ;"                              (closed root) format.  The destination IS NOT KILLED prior to filling with
 | 
|---|
| 235 |         ;"                           new data
 | 
|---|
| 236 |         ;"                           Note:
 | 
|---|
| 237 |         ;"                           At least one subscript must be numeric.  (same as note above)
 | 
|---|
| 238 |         ;"                           REQUIRED
 | 
|---|
| 239 |         ;"      dstIncSubscr-- (required) Identifies the incrementing subscript level, for the source global
 | 
|---|
| 240 |         ;"                           For example, if you pass ^TMP(115,1,1,0) as the global_ref parameter and
 | 
|---|
| 241 |         ;"                           pass 3 as the inc_subscr parameter, $$BIN2GBL will increment the third
 | 
|---|
| 242 |         ;"                           subscript, such as ^TMP(115,1,x), but will WRITE notes at the full global
 | 
|---|
| 243 |         ;"                           reference, such as ^TMP(115,1,x,0).
 | 
|---|
| 244 |         ;"                           REQUIRED
 | 
|---|
| 245 |         ;"       width--          The number of bytes to store per line in the DESTINATION array.
 | 
|---|
| 246 |         ;"                           REQUIRED
 | 
|---|
| 247 |         ;"
 | 
|---|
| 248 |         ;"Output: @dstGRef is filled with data
 | 
|---|
| 249 |         ;"Result: None
 | 
|---|
| 250 |  
 | 
|---|
| 251 |  
 | 
|---|
| 252 |  ;"*** NOTICE: THIS FUNCTION IS NOT WORKING PROPERLY, IT REPEATS THE DATA IN BLOCKS...***
 | 
|---|
| 253 |  
 | 
|---|
| 254 |         new readPos set readPos=1
 | 
|---|
| 255 |         new bytesRead
 | 
|---|
| 256 |         if $get(srcGRef)="" goto CPYBGDone
 | 
|---|
| 257 |         if $get(dstGRef)="" goto CPYBGDone
 | 
|---|
| 258 |         if $get(srcIncSubscr)="" goto CPYBGDone
 | 
|---|
| 259 |         if $get(dstIncSubscr)="" goto CPYBGDone
 | 
|---|
| 260 |         if $get(width)="" goto CPYBGDone
 | 
|---|
| 261 |  
 | 
|---|
| 262 |         for  do  quit:(bytesRead=0)
 | 
|---|
| 263 |         . set @dstGRef=$$READBG(srcGRef,srcIncSubscr,readPos,width,.bytesRead)
 | 
|---|
| 264 |         . if (bytesRead=0) kill @dstGRef
 | 
|---|
| 265 |         . set readPos=readPos+bytesRead
 | 
|---|
| 266 |         . set dstGRef=$$NEXTNODE(dstGRef,dstIncSubscr,0,1)
 | 
|---|
| 267 |  
 | 
|---|
| 268 | CPYBGDone
 | 
|---|
| 269 |         quit
 | 
|---|
| 270 |  
 | 
|---|
| 271 |  
 | 
|---|
| 272 |  
 | 
|---|
| 273 | READBG(GRef,incSubscr,pos,count,actualCount)
 | 
|---|
| 274 |         ;"SCOPE: PUBLIC
 | 
|---|
| 275 |         ;"Purpose: To read 'count' bytes from binary global '@srcGRef', starting at 'pos'
 | 
|---|
| 276 |         ;"Input:
 | 
|---|
| 277 |         ;"         GRef--      Global reference of the binary global array, in fully resolved
 | 
|---|
| 278 |         ;"                              (closed root) format.
 | 
|---|
| 279 |         ;"                           Note:
 | 
|---|
| 280 |         ;"                           At least one subscript must be numeric.  This will be the incrementing
 | 
|---|
| 281 |         ;"                           subscript (i.e. the subscript that $$BIN2WP^TMGBINWP will increment
 | 
|---|
| 282 |         ;"                           to store each new global node).  This subscript need not be the final
 | 
|---|
| 283 |         ;"                           subscript.  For example, to load into a WORD PROCESSING field, the
 | 
|---|
| 284 |         ;"                           incrementing node is the second-to-last subscript; the final subscript
 | 
|---|
| 285 |         ;"                           is always zero.
 | 
|---|
| 286 |         ;"                           REQUIRED
 | 
|---|
| 287 |         ;"      incSubscr-- (required) Identifies the incrementing subscript level, for the source global
 | 
|---|
| 288 |         ;"                           For example, if you pass ^TMP(115,1,1,0) as the global_ref parameter and
 | 
|---|
| 289 |         ;"                           pass 3 as the inc_subscr parameter, $$BIN2GBL will increment the third
 | 
|---|
| 290 |         ;"                           subscript, such as ^TMP(115,1,x), but will WRITE notes at the full global
 | 
|---|
| 291 |         ;"                           reference, such as ^TMP(115,1,x,0).
 | 
|---|
| 292 |         ;"                           REQUIRED
 | 
|---|
| 293 |         ;"      Pos--             The position in the binary global to start reading from (0 is first byte), as if
 | 
|---|
| 294 |         ;"                           entire global array is one long binary stream. E.g. the 913th byte might be
 | 
|---|
| 295 |         ;"                           actually the 17th byte on the 14th line (if 64 bytes are stored per line).  But
 | 
|---|
| 296 |         ;"                           this is handled transparently and the user need only specify byte #913 etc.
 | 
|---|
| 297 |         ;"                        .  The reading will start at the appropriate point.
 | 
|---|
| 298 |         ;"      count--           The number of bytes/characters to read.
 | 
|---|
| 299 |         ;"  actualCount--      OPTIONAL.  An OUT PARAMETER -- PASS BY REFERENCE
 | 
|---|
| 300 |         ;"                           This is filled with the actual number of bytes/characters successfully read.
 | 
|---|
| 301 |         ;"Result: a string filled with requested number of bytes/characters
 | 
|---|
| 302 |  
 | 
|---|
| 303 |         new result set result=""
 | 
|---|
| 304 |         new countPerLine
 | 
|---|
| 305 |         new goalLen set goalLen=count
 | 
|---|
| 306 |         new Line,p1
 | 
|---|
| 307 |         new done
 | 
|---|
| 308 |         if $get(GRef)="" goto ReadBGDone
 | 
|---|
| 309 |         set countPerLine=$length(@GRef)
 | 
|---|
| 310 |         if (countPerLine=0) goto ReadBGDone
 | 
|---|
| 311 |  
 | 
|---|
| 312 |         set Line=pos\countPerLine
 | 
|---|
| 313 |         set p1=pos#countPerLine
 | 
|---|
| 314 |  
 | 
|---|
| 315 |         for  do  quit:(done=1)!(count<1)
 | 
|---|
| 316 |         . new curRef
 | 
|---|
| 317 |         . set done=0
 | 
|---|
| 318 |         . set curRef=$$NEXTNODE(GRef,incSubscr,1,Line)
 | 
|---|
| 319 |         . if curRef="" set done=1 quit
 | 
|---|
| 320 |         . set result=result_$extract(@GRef,p1,p1+count-1)
 | 
|---|
| 321 |         . set count=goalLen-$length(result)
 | 
|---|
| 322 |         . if count<1 set done=1 quit
 | 
|---|
| 323 |         . set Line=Line+1
 | 
|---|
| 324 |         . set p1=1
 | 
|---|
| 325 |  
 | 
|---|
| 326 | ReadBGDone
 | 
|---|
| 327 |         set actualCount=$length(result)
 | 
|---|
| 328 |         quit result
 | 
|---|
| 329 |  
 | 
|---|
| 330 |  
 | 
|---|