How To Provide Inverse AT() Functionality (192764)



The information in this article applies to:

  • Microsoft Visual FoxPro for Windows 3.0
  • Microsoft Visual FoxPro for Windows 3.0b
  • Microsoft Visual FoxPro for Windows 5.0
  • Microsoft Visual FoxPro for Windows 5.0a
  • Microsoft Visual FoxPro for Windows 6.0
  • Microsoft Visual FoxPro for Macintosh 3.0b
  • Microsoft FoxPro for Windows 2.6a
  • Microsoft FoxPro for UNIX 2.6
  • Microsoft FoxPro for MS-DOS 2.0
  • Microsoft FoxPro for MS-DOS 2.5
  • Microsoft FoxPro for MS-DOS 2.5a
  • Microsoft FoxPro for MS-DOS 2.5b
  • Microsoft FoxPro for MS-DOS 2.6
  • Microsoft FoxPro for MS-DOS 2.6a
  • Microsoft FoxPro for Macintosh 2.6a

This article was previously published under Q192764

SUMMARY

The AT(), RAT() and equivalent functions can be used to return the beginning numeric position of the first occurrence of a character expression within another character expression. However, FoxPro does not provide a function to find the first occurrence of a character that is not the character that was passed as a parameter. In other words, suppose that you have a string "AAAAB" and you wish to find the first occurrence of a character that is not "A". This article demonstrates how to provide this functionality.

MORE INFORMATION

Save the following code to a program file and run the program. The NotAt() function returns the second occurrence of a character that is not a "0" (zero). Here is the sample code:
   *-- Code begins here.
   CLEAR
   ? NotAt("0", "0x00CCAF77A", 2)

   *-----------------------------------------------------------------
   *- Function:    NotAt
   *- Summary:     From within a passed string, finds the first
   *-              occurence of a character that is not the character
   *-              specified.  In other words, this function works
   *-              opposite of the manner that AT() does.
   *- Parameters:  lsNotString -    What we don't want.  The function
   *-                               finds the first character that is
   *-                               not lsNotString.
   *-              lsSearchString - The string in which to search.
   *-              liOccurence -    Indicates that NotAt should find
   *-                               the liOccurence of a character
   *-                               that is not lsNotString.
   *-----------------------------------------------------------------
   FUNCTION NotAt
   PARAMETERS lsNotString, lsSearchString, liOccurrence

   llFound       = .F.  && Flag indicates if we've found a character that
                        && is NOT lsNotString.
   llEndOfString = .F.  && Flag to indicate that we've reached the end
                        && of the string.
   lnCounter     = 0    && Tracks position during the search.
   lnLength      = LEN(lsSearchString)
   liOccurCount  = 0    && Tracks how many occurrences have been found.

   *-- Loop until the desired character is found or the end of
   *-- the string is reached.
   DO WHILE NOT llFound AND NOT llEndofString
      lnCounter = lnCounter + 1
      lsCompare = SUBSTR(lsSearchString, lnCounter, 1)
      IF lsCompare <> lsNotString
         liOccurCount = liOccurCount + 1

         *-- Have we found the occurrence we want?
         IF liOccurCount = liOccurrence
            llFound = .T.
         ENDIF
      ENDIF
      IF lnCounter = lnLength
         llEndOfString = .T.
      ENDIF
   ENDDO
   RETURN lnCounter
   *-- Code ends here.
				

REFERENCES


Modification Type:MinorLast Reviewed:7/1/2004
Keywords:kbcode kbhowto KB192764