I used to exchanxe globals between various M systems
using my own %GIO utility.This utility guarantees correct
global transfer also in case when they have control
characters in indexes and /or nodes.
It uses a simple method used now mostly in tcp/ip data
tranfer:
<byte1><byte2>string1
<byte3><byte4>string2
where byte1,byte2 are binary data expressing the length of
string1
I use the following code to get the string1 and string2, then
set @string1=string2 does the rest.
READ ;
N BYTE1,BYTE2,VAL1,VAL2,LNG
S EOF=0 U FILE R BYTE1#1,BYTE2#1 S VAL1=$A
(BYTE1),VAL2=$A(BYTE2)
I VAL1=255,VAL2=255 S EOF=1 S RETVAL="" Q ;END
OF GLOBAL OR END OF FILE INDICATED
I VAL1=0,VAL2=0 S RETVAL="" Q ;EMPTY STRING
S LNG=VAL1*256+VAL2 U FILE R RETVAL#LNG
Q
My problem: this code doesn't work with GT.M.
Sometime I'm getting negative values in VAL1 or VAL2 (-
1), and READ VAR#LNG randomly returns
strings of other lenght than LNG.
As open parameters I use the following:
O FILE:(noreadonly:block=2048:record=2044:exception="g
noopen"):0
Maybe using parameters like TERMINATOR="", or
PASTHRU in the OPEN statement would solve the problem,
but they are not implemented.
Please let me know, if you need more detailed input to
understand my problem.
TIA
Peter
Logged In: YES
user_id=97924
Could you please provide us a sample input file that
demonstrates the failure. We will use it to run through your
M code and see what might be returning -1. What are the
terminator(s) for lines in the extract file? Was the
exception triggered due to a failure of READ. Was End Of
File reached - GT.M sets $ZEOF when end of file is reached.
You may want to revise your M code to check for $ZEOF after
each READ. Oh! what version of GT.M did you encounter this
problem with, and which flavor of Linux?
Thanks,
Vinaya
Logged In: YES
user_id=97924
The default record format is VAR (variable). Please use
FIX:NOWRAP device parameters to see if the problem
disappears. The default recordsize/width is 32767 which
should be fine for a two byte length.
Thanks,
Vinaya
Logged In: YES
user_id=964483
I will rephrase my question:
In GT.M I am missing a open parameter for sequential files that
will allow me to read the file in chunks : i.e. READ var#512
Then, regardless if a CR or LF occurs in the record, the variable
will be filled with 512 bytes (exception: last read may end with
less than 512 characters).
This feature is called as open a file in IMAGE mode, or BINARY,
or could be achieved by setting the parameter TERMINATOR=""
to nil.
Thanks
Peter
Logged In: YES
user_id=97877
GT.M does not have an "image" mode per se. But you can
get the same effect as follows:
Open "some.file":(Fixed:RecordSize=512:BlockSize=512)
Use "some.file"
Read chunk#512
This technique is used in both GDE and the GTM V5 block
upgrade utility V5CBSU.
Hopefully this helps.