1. Reading strings
A function to read 'c' style strings from memory.
Does anybody know a faster way?
-----------------------------------------------------------------
-- string(atom p)
global function -- returns a euphoria represented string.
string(atom p)
sequence st -- place holder for string
st = "" -- just an empty string :)
for k = 0 to 256 by 1 do
if peek(p + k) = 0 then -- scan for '0' terminator
st = peek({p, k})
exit end if
end for
return st
end function
-----------------------------------------------------------------
Hayden.
2. Re: Reading strings
Hayden McKay wrote:
>
> A function to read 'c' style strings from memory.
> Does anybody know a faster way?
I've always thought this, from misc_arwen.e, would be as good as it gets:
global function peek_string(atom addr)
atom last
-- initialize variables
last = addr
-- find end of string
while peek(last) do
last += 1
end while
-- get the string
if addr != last then
return peek( {addr, last - addr} )
else
return ""
end if
end function
I have not tested, but theoretically it ought to gain 10%, maybe more.
Not that am I sure why you want "" for strings longer than 256 chars.
Let me know,
Pete
3. Re: Reading strings
Hello there,
If you are using Windows then the fastest way is to use my
contribution to WinLib. I think it's now called
"w32peek_string()"
and it uses the built in Windows API funciotn "lstrlen()"
to first get the string length, then it gets the string.
There's no limit on the string length either.
Take care,
Al
E boa sorte com sua programacao Euphoria!
My bumper sticker: "I brake for LED's"
From "Black Knight":
"I can live with losing the good fight,
but i can not live without fighting it".
"Well on second thought, maybe not."
4. Re: Reading strings
- Posted by Bernie Ryan <xotron at bluefrog.com>
Jan 20, 2007
-
Last edited Jan 21, 2007
Hayden McKay wrote:
>
> }}}
<eucode>
> -----------------------------------------------------------------
> -- string(atom p)
> global function -- returns a euphoria represented string.
>
> string(atom p)
> sequence st -- place holder for string
>
> st = "" -- just an empty string :)
> for k = 0 to 256 by 1 do
> if peek(p + k) = 0 then -- scan for '0' terminator
> st = peek({p, k})
> exit end if
> end for
>
> return st
>
> end function
>
> -----------------------------------------------------------------
> </eucode>
{{{
> A function to read 'c' style strings from memory.
> Does anybody know a faster way?
Hayden:
Try this I don't know how fast it is.
-----------------------------------------------------------------
global function getstring(atom p)
sequence st
st = {peek(p)}
while st[$] do
st &= peek(p + length(st))
end while
return st
end function
-----------------------------------------------------------------
Bernie
My files in archive:
WMOTOR, XMOTOR, W32ENGIN, MIXEDLIB, EU_ENGIN, WIN32ERU, WIN32API
Can be downloaded here:
http://www.rapideuphoria.com/cgi-bin/asearch.exu?dos=on&win=on&lnx=on&gen=on&keywords=bernie+ryan
5. Re: Reading strings
Bernie Ryan wrote:
>
> Hayden McKay wrote:
> >
> > }}}
<eucode>
> > -----------------------------------------------------------------
> > -- string(atom p)
> > global function -- returns a euphoria represented string.
> >
> > string(atom p)
> > sequence st -- place holder for string
> >
> > st = "" -- just an empty string :)
> > for k = 0 to 256 by 1 do
> > if peek(p + k) = 0 then -- scan for '0' terminator
> > st = peek({p, k})
> > exit end if
> > end for
> >
> > return st
> >
> > end function
> >
> > -----------------------------------------------------------------
> > </eucode>
{{{
> > A function to read 'c' style strings from memory.
> > Does anybody know a faster way?
>
> Hayden:
Is it necessary to limit the string length?
> Try this I don't know how fast it is.
>
> }}}
<eucode>
> -----------------------------------------------------------------
> global function getstring(atom p)
>
> sequence st
>
> st = {peek(p)}
>
> while st[$] do
> st &= peek(p + length(st))
> end while
>
> return st
>
> end function
> -----------------------------------------------------------------
> </eucode>
{{{
> Bernie
I haven't tried Hayden's function, but I have compared a function before that
was similar to the one Bernie posted (it concatenates), and the following is
faster:
------------------------------------------------
global function peek_string(pointer addr)
------------------------------------------------
-- syntax: s = peek_string( x )
-- description:
-- retrieves a null-terminated string from a memory address.
atom offset
offset = addr
while peek(offset) do offset +=1 end while
return peek({addr,offset-addr})
end function
Pete: peek() will accept peek({lp,0}) which will result in a null string
Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria