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

-- Peter

Peter M. Brigham
[email protected]
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         |     [email protected]
> HyperActive Software           |     http://www.hyperactivesw.com
> 
> _______________________________________________
> use-livecode mailing list
> [email protected]
> Please visit this url to subscribe, unsubscribe and manage your subscription 
> preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode


_______________________________________________
use-livecode mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to