offset broken?

Peter M. Brigham pmbrig at gmail.com
Sun Feb 23 07:18:28 EST 2014


Oh. Didn't see this before I sent off my version…

-- Peter

Peter M. Brigham
pmbrig at gmail.com
http://home.comcast.net/~pmbrig

On Feb 22, 2014, at 4:49 PM, J. Landman Gay wrote:

> On 2/22/14, 1:35 PM, Richmond wrote:
>> Sorry: Neanderthal question time:
>> 
>> I cannot see anything about charsToSkip in the inbuilt (i.e. in the IDE)
>> documentation (6.6. dp1).
> 
> It's the third parameter in the "offset" function. See "offset" in the dictionary.
> 
>> I set up a boring little stack with a fld "fORIGIN" conatinong "The
>> quick brown fox jumps over the lazy dog"
>> 
>> and that was jolly nice,
>> 
>> then I set up another fld called "fREZ"
>> 
>> and a button with this script:
>> 
>> on mouseUp
>>    put empty into fld "fREZ"
>>    put fld "fORIGIN" into ORIGIN
>>    put offset("o",ORIGIN) & ", " after fld "fREZ"
>>    put offset("o",ORIGIN) & ", " after fld "fREZ"
>>    put offset("o",ORIGIN) & ", " after fld "fREZ"
>> end mouseUp
>> 
>> 
>> in the hope I would get something like "13, 18, 27," in fld "fREZ"
>> 
>> but all I got was "13, 13, 13"
>> 
>> so I really cannot see what the utility of 'offset' is at all.
> 
> Oh ye of little faith. That's what we've been talking about; every instance of "offset" starts at the beginning of the string unless you include the number of characters to skip as the third parameter.
> 
> This is a much faster way to get all instances of an offset in a block of text, exactly parallel to the differences between "repeat with x" and "repeat for each". Like "for each," offset will read from the current marked location rather than counting from the top during each iteration, provided you include the third parameter. Your example handler doesn't use the parameter, so of course you're getting the same offset repeatedly.
> 
> If there is a third parameter, then offset will start counting from that point, and return the number of characters from that location in the text to the next instance of the character. It's up to you to add that number to the current "skip" location in order to keep the marker moving along.
> 
> This should do what you want:
> 
> function getAllOffsets pData,pChar -- find all instances of a char
>  put 0 into tSkip -- start at beginning
>  repeat
>    put offset(pChar,pData,tSkip) into tNextOffset -- chars since skip point
>    if tNextOffset = 0 then exit repeat -- no more found
>    add tNextOffset to tSkip -- move the marker
>    put tSkip & comma after tRes -- store it
>  end repeat
>  return tRes
> end getAllOffsets
> 
> This should be much faster than your "repeat" example (which counts characters from the top during each iteration) or a version that deletes characters from the original data. Try some comparison timings with a very large block of text.
> 
> -- 
> Jacqueline Landman Gay         |     jacque at hyperactivesw.com
> HyperActive Software           |     http://www.hyperactivesw.com
> 
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode





More information about the use-livecode mailing list