Kevin;

   I'm not sure which MUMPS engine you arte running, but I believe you have
to turn off  IO termination on control characters.  Looks like the fixed
reads are being terminated early.

   Chris

----- Original Message -----
From: "Kevin Toppenberg" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Sunday, August 21, 2005 11:22 AM
Subject: [Hardhats-members] Re: Is $$GTF~%ZISH() binary friendly?


Chris,

I am having trouble getting a buffered read to work.

GTM>set path="/tmp/"
GTM>set fname="killthis"
GTM>do OPEN^%ZISH("Handle",path,fname,"R")
GTM>w POP
0
GTM>F  Q:($ZEOF)  U IO:(NOTERMINATOR) R X#255:5 U $P W $L(X),"; "
51; 17; 21; 24; 51; 52; 56; 27; 51; 38; 0;
%GTM-E-IOEOF, Attempt to read past an end-of-file

Don't worry about that EOF error.  The issue is that I am not getting
in 255 bytes at a time as I requested.  In this case the file is a
text file, but it should be amendible for binary processing.  I think
that (NOTERMINATOR) is not working.

Can you show how you would do a buffered read?

Thanks
Kevin


On 8/21/05, Chris Richardson <[EMAIL PROTECTED]> wrote:
> Kevin;
>
>    You are working way too hard.  Do a buffered read and then use $ASCII
to
> take it apart one octet at a time.  The encoding is much easier than you
> have made it.  Each octet will be something like this;
>
>   N BUF,C,B1,B2,OBUF
>   S OBUF=""
>   R BUF#255
>   F I=1:1:$L(BUF)  D
>   .  S C=$ASCII(BUF,I)  ; Converts to the value of the character (0 to
255)
>   .  S OBUF=OBUF_$$BYT2BIN(C)
>   .QUIT
>
> BYT2BIN(V) ; Take one BYTE and return HEX Values
>   N HV,B1,B2
>   S NV="0123456789ABCDEF"
>   S B1=(V#16)+1  ; 0 to 15 becomes 1 to 16
>   S B2=(V\16)+1
>   QUIT $E(NV,B1)_$E(NV,B2)  ;  You figure out the byte order  1-2 or 2-1
>
> The star reads are eating your lunch.  This will be much faster.
>
>
> ----- Original Message -----
> From: "Kevin Toppenberg" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Sunday, August 21, 2005 5:53 AM
> Subject: [Hardhats-members] Re: Is $$GTF~%ZISH() binary friendly?
>
>
> Here is the code.  I will also attach it incase wrapping ruins it here...
>
>
> ;"TMG BIN <-->GBL FUNCTION
> ;"Kevin Toppenberg MD
> ;"GNU General Public License (GPL) applies
> ;"8-20-2005
>
> ;"=======================================================================
> ;" API -- Public Functions.
> ;"=======================================================================
> ;"$$BIN2GBL^TMGBINF(path,filename,globalRef,incSubscr)
> ;"$$GBL2BIN^TMGBINF(globalRef,incSubscr,path,filename)
>
> ;"=======================================================================
> ;"PRIVATE API FUNCTIONS
> ;"=======================================================================
>
>
>
> ;"=======================================================================
> BIN2GBL(path,filename,globalRef,incSubscr)
>         ;"Purpose: To load a binary file from the host filesystem into
> a WP field, storing
>         ;"              the composit bytes as ascii hex codes.
>         ;"Input: path --        full path, up to but not including the
> filename (required)
>         ;"         filename --  name of the file to open (required)
>         ;"         globalRef-- Global reference to WRITE the host
> binary file to, in fully resolved
>         ;"                              (closed root) format.  This
> function does not kill the global before
>         ;"                              writing to it.  (required)
>         ;"                           Note:
>         ;"                           At least one subscript must be
> numeric.  This will be the incrementing
>         ;"                           subscript (i.e. the subscript
> that $$BIN2WP^TMGBINWP will increment
>         ;"                           to store each new global node).
> This subscript need not be the final
>         ;"                           subscript.  For example, to load
> into a WORD PROCESSING field, the
>         ;"                           incrementing node is the
> second-to-last subscript; the final subscript
>         ;"                           is always zero.
>         ;"        incSubscr-- (required) Identifies the incrementing
> subscript level.  For example, if you
>         ;"                           pass ^TMP(115,1,1,0) as the
> global_ref parameter and pass 3 as the
>         ;"                           inc_subscr parameter, $$BIN2GBL
> will increment the third subscript, such
>         ;"                           as ^TMP(115,1,x), but will WRITE
> notes at the full global reference, such
>         ;"                           as ^TMP(115,1,x,0).
>         ;"Result: 1=success, 0=failure
>         ;"
>         ;"Note: Each line of the global will contain up to 128 bytes
> (256 characters)
>         ;"               (2 ascii hex characters = 1 source byte)
>         ;"Example:
>         ;"
> ^TMP(115,1,1,0)="A12C4F12E2791D9723C3297D3C30B73C1532A1...(continues
> to 256 characters)"
>         ;"
> ^TMP(115,1,2,0)="91D9723C3297D314ADF31B85F41A12C4F12E27...(continues
> to 256 characters)"
>         ;"
> ^TMP(115,1,3,0)="3A12C4F12E271B85F4C2ED9723C3297D314ADF...(continues
> to 256 characters)"
>         ;"
> ^TMP(115,1,4,0)="85F73C1532AA12C4F12E2791D9723C3297D314...(continues
> to 256 characters)"
>         ;"  ^TMP(115,1,5,0)="61A85C30B73C1532AA12C4F12E2791D972"  <--
> not padded with terminal zeros
>
>         new result set result=0  ;"default to failure
>         new handle set handle="TMGHANDLE"
>         new abort set abort=0
>         new byteIn
>         new $ETRAP
>         new oneLine set oneLine=""
>         new curRef set curRef=globalRef
>
>         set path=$$DEFDIR^%ZISH($get(path))
>         do OPEN^%ZISH(handle,path,filename,"R")
>         if POP goto B2GDone
>         set $ETRAP="set abort=1,$ECODE="""" quit"
>         use IO
>         for  do  quit:($ZEOF)!(abort=1)!(byteIn=-1)
>         . read *byteIn:2
>         . if (byteIn=-1) quit
>         . set oneLine=oneLine_$$HEXCHR(byteIn,2)
>         . if $length(oneLine)>255 do
>         . . set @curRef=oneLine
>         . . set curRef=$$NEXTNODE(curRef,incSubscr)
>         . . set oneLine=""
>         if (oneLine'="")&(abort=0) do
>         . set @curRef=oneLine
>         . set oneLine=""
>
>         if (abort'=1) set result=1 ;"SUCCESS
>         do CLOSE^%ZISH(handle)
>
>
> B2GDone
>         quit result
>
>
> NEXTNODE(curRef,incSubscr)
>         ;"Purpose: to take a global reference, and increment the node
> specified by incSubscr
>         ;"Input:   curRef --    The reference to alter, e.g.
> '^TMP(115,1,4,0)'
>         ;"           incSubscr--The node to alter, e.g.
>         ;"                              1-->^TMG(x,1,4,0)    x would
> be incremented
>         ;"                              2-->^TMG(115,x,4,0) x would be
> incremented
>         ;"                              3-->^TMG(115,1,x,0) x would be
> incremented
>         ;"                              4-->^TMG(115,1,4,x) x would be
> incremented
>         ;"Note: the node that incSubscr references should be numeric
> (i.e. not a name)
>         ;"      otherwise the alpha node will be treated as a 0
>         ;"result: returns the new reference
>
>         new i,result
>
>         set result=$qsubscript(curRef,0)_"("
>         for i=1:1:$qlength(curRef) do
>         . new node
>         . if i'=1 set result=result_","
>         . set node=$qsubscript(curRef,i)
>         . if i=incSubscr set node=node+1
>         . if (node'=+node) set node=""""_node_""""
>         . set result=result_node
>         set result=result_")"
>
>         quit result
>
>
> HEXCHR(n,digits)
>         ;"Purpose: convert n to hex characters
>         ;"Input: n -- the number to convert
>         ;"         digits: (optional) number of digits in output.
> Leading 0's padded to
>         ;"                      front of answer to set number of digits.
>         ;"                      e.g. if answer is "A", then
>         ;"                      2 -> mandates at least 2 digits ("0A")
>         ;"                      3->3 digits ("00A")
>
>         new lo
>         new result set result=""
>         new ch
>         set digits=$get(digits,1)
>
>         for  do  quit:(n=0)
>         . set lo=n#16
>         . if (lo<10) set ch=+lo
>         . else  set ch=$char(55+lo)
>         . set result=ch_result
>         . set n=n\16
>
>         for  quit:($length(result)>(digits-1))  do
>         . set digits=digits-1
>         . set result="0"_result
>
>         quit result
>
>
>
>
>
> -------------------------------------------------------
> SF.Net email is Sponsored by the Better Software Conference & EXPO
> September 19-22, 2005 * San Francisco, CA * Development Lifecycle
Practices
> Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
> Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
> _______________________________________________
> Hardhats-members mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/hardhats-members
>


-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
Hardhats-members mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/hardhats-members






-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
Hardhats-members mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/hardhats-members

Reply via email to