On 22/02/14 23:49, 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.


 You AVOIDED commenting on this:

/I made another button with this script:
//
//  on mouseUp
//     put empty into fld "fREZ"
//     put 1 into INDEKS
//     repeat until char INDEKS of fld "fORIGIN" is empty
//     if char INDEKS of fld "fORIGIN" is "o" then
//       put INDEKS & ", " after fld "fREZ"
//    else
//       --do nix
//    end if
//    put (INDEKS + 1) into INDEKS
//    end repeat
//  end mouseUp
//
//  and that returned "13, 18, 27, 42"
//
//  a whole lot more useful./


No need to work out how far to hop!

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

Reply via email to