Initializes a string for TOKENNEXT()

        [<nSkipDistance>]]) --> lStatus


     <cString>  [@]  Designates a character string for which tokenizing
     is initialized.  This must be passed by reference!

     <cDelimiter>  Designates a list (character string) of individual
     delimiters for tokenizing.

     <nSkipDistance>  Designates the number of delimiting
     characters/sequences after which a value, or a null string (if
     necessary), is returned.  The default value indicates that these
     characters/sequences are not counted.

     ()  When called with no parameters, TOKENNEXT() is set to begin at the
     start of the string.


     The function returns .F. when the string variable cannot be initialized.
     For example, the function returns .F. if the string variable was not
     passed by reference.


     When used in conjunction with the TOKENNEXT() function, an extremely
     versatile incremental tokenizer is available to you.  Specific
     separation processes can be implemented much more quickly than with the
     group of functions around TOKEN().  The speed increase is achieved in
     two ways.

     TOKENINIT() exchanges all delimiting characters for the first one in the
     delimiter list.  This means the entire delimiter list does not have to
     be searched every time.  The second advantage is that TOKENNEXT() does
     not always begin its search for the token that is extracted at the
     beginning of the string (see the function description for TOKENNEXT()).
     However, in contrast to TOKEN(), TOKENNEXT() is unable to extract a
     specific token.

     You can also use the third parameter, a skip distance for the delimiter
     characters.  This allows recognition of empty lines within a text.  In
     this case, an empty line would be displayed by a CrLfCrLf sequence.
     Since TOKENINIT() takes all designated delimiting characters and
     exchanges them for something uniform, this sequence is changed to
     CrCrCrCr.  A skip distance of 2 means that the two delimiters (in this
     case, Cr)) return a token each time.  Since nothing precedes this
     example, TOKENNEXT() returns a null string.

     The function uses the following list of delimiters as standard:

     CHR 32, 0, 9, 10, 12, 26, 32, 138, 141

     and the characters ,.;:!?/\<<>>()^#&%+-*

     This list can be replaced by your own delimiter list, <cDelimiter>.
     Here are some examples of meaningful delimiting characters:

     Table 4-5: Recommended Delimiting Sequences
     Description         <cDelimiter>
     Pages               CHR(12)(Form Feed)
     Sentence            ".!?"
     File Name           ":\."
     Numeric strings     ",."
     Date strings        "/."
     Time strings        ":."


     .  When using a skip value, you must use the TOKENEND() function
        as a loop condition.

     .  When TOKENINIT() exchanges all delimiting characters for a new
        one, the first delimiter on the list is always used.  This ensures
        that no character contained in the token becomes a delimiter.

     .  When you use the TOKENINIT() or TOKENNEXT(), you cannot use
        the TOKENSEP() function.  The required information can be determined
        using TOKENAT() in conjunction with the original string (status
        before TOKENINIT()).

           To determine the delimiter position before the last token, set
           TOKENAT() to -1.  To determine the delimiter position after the
           last token, set TOKENAT to .T..


     .  Break a string into words.  First the string must be

        cDelim   :=  "!?.,-"
        cString   :=  "A.B-C,D!E??"

        TOKENINIT(@cString, cDelim)         // "A!B!C!D!E!!"

        Do While .NOT. TOKENEND()
           cWord  :=  TOKENNEXT(cString)
           ? cWord

     .  Break text into lines.  Take blank lines into account using a
        skip distance of 2:

        nCounter  :=  0

        TOKENINIT(cTextString, CHR(13) + CHR(10), 2)

           nLine  :=  TOKENNEXT(cTextString)
           ++ nCounter

        ? nCounter



Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.