AMX FIND_STRING_REV
Frequently Asked Questions
Brand:
- AMX
Models:
- Netlinx
Question:
Is there a way to search for characters in a string starting at the end?
Answer:
Download:
See FIND_STRING_REV.axi located in the download:
Code Block:
PROGRAM_NAME = 'FIND_STRING_REV'
(*******************************************************)
(***********************************************************)
(* FILE_LAST_MODIFIED_ON: 04/05/2006 AT: 09:00:25 *)
(***********************************************************)
(* System Type : NetLinx *)
(***********************************************************)
(* REV HISTORY: *)
(***********************************************************)
(*
$History: $
*)
(***********************************************************)
(* DEVICE NUMBER DEFINITIONS GO BELOW *)
(***********************************************************)
DEFINE_DEVICE
(***********************************************************)
(* CONSTANT DEFINITIONS GO BELOW *)
(***********************************************************)
DEFINE_CONSTANT
(***********************************************************)
(* DATA TYPE DEFINITIONS GO BELOW *)
(***********************************************************)
DEFINE_TYPE
(***********************************************************)
(* VARIABLE DEFINITIONS GO BELOW *)
(***********************************************************)
DEFINE_VARIABLE
(***********************************************************)
(* LATCHING DEFINITIONS GO BELOW *)
(***********************************************************)
DEFINE_LATCHING
(***********************************************************)
(* MUTUALLY EXCLUSIVE DEFINITIONS GO BELOW *)
(***********************************************************)
DEFINE_MUTUALLY_EXCLUSIVE
(***********************************************************)
(* SUBROUTINE/FUNCTION DEFINITIONS GO BELOW *)
(***********************************************************)
(* EXAMPLE: DEFINE_FUNCTION <RETURN_TYPE> <NAME> (<PARAMETERS>) *)
(* EXAMPLE: DEFINE_CALL '<NAME>' (<PARAMETERS>) *)
DEFINE_FUNCTION INTEGER FIND_STRING_REV(CHAR strSTRING[ ], CHAR strSEARCH[ ],INTEGER nPOS)
(****************************************************************************************)
(* FIND_STRING_REV FUNCTION *)
(* Searches through a string for a specified sequence of *)
(* characters from right to left. The syntax: *)
(* *)
(* INTEGER FIND_STRING_REV(CHAR strSTRING[ ], CHAR strSEARCH[ ], INTEGER nPOS) *)
(* *)
(* PARAMETERS: *)
(* strSTRING = the string of a character to search *)
(* strSEARCH = the sequence of characters to search for *)
(* nPOS = the starting character position for the search *)
(* *)
(* RESULT: A 16-bit unsigned integer representing the *)
(* character location of strSEARCH in strSTRING from the left *)
(* Any error condition returns 0. *)
(* *)
(* EXAMPLE: *)
(* strVAR = 'ABC ABC ABC' *)
(* nFIND = FIND_STRING_REV(strVAR, 'ABC', 8) *)
(* RESULT: *)
(* nFIND is 5 *)
(* *)
(****************************************************************************************)
STACK_VAR INTEGER nFOUNDAT, nLOOP, jLOOP
{
nFOUNDAT=0 //storage position where string was located
nLOOP=1 //the variable to track how many times the search has been conducted and multiply the search length
jLOOP=0 //the variable to track how many times the search has been conducted one character at a time
WHILE(nFOUNDAT=0) //keep searching until the string is found
{
IF((LENGTH_STRING(strSEARCH)*nLOOP) < nPOS) //the search multiplied by the times searched is less then the starting point
{
nFOUNDAT = FIND_STRING(strSTRING,strSEARCH,(nPOS-(LENGTH_STRING(strSEARCH)*nLOOP)-jLOOP)) //start at the end
IF(nFOUNDAT>nPOS)//Is the location the string was found greater than the starting point?
{
nFOUNDAT=0//Clear the nFOUNDAT value to continue the search
IF((nFOUNDAT-nPOS)>LENGTH_STRING(strSEARCH))//the difference is greater than the location, continue searching one character back
{
nLOOP--//decrease the multiplied search
jLOOP++//increase the count on characters back to search
}
}
}
ELSE
{
nFOUNDAT = FIND_STRING(strSTRING,strSEARCH,1) //start at beginning
RETURN nFOUNDAT //return position string was found
}
nLOOP++
}
RETURN nFOUNDAT //return position string was found
}
(***********************************************************)
(* STARTUP CODE GOES BELOW *)
(***********************************************************)
DEFINE_START
(***********************************************************)
(* THE EVENTS GO BELOW *)
(***********************************************************)
DEFINE_EVENT
(*****************************************************************)
(* *)
(* !!!! WARNING !!!! *)
(* *)
(* Due to differences in the underlying architecture of the *)
(* X-Series masters, changing variables in the DEFINE_PROGRAM *)
(* section of code can negatively impact program performance. *)
(* *)
(* See Ԅifferences in DEFINE_PROGRAM Program ExecutionԠsection *)
(* of the NX-Series Controllers WebConsole & Programming Guide *)
(* for additional and alternate coding methodologies. *)
(*****************************************************************)
DEFINE_PROGRAM
(*****************************************************************)
(* END OF PROGRAM *)
(* *)
(* !!! DO NOT PUT ANY CODE BELOW THIS COMMENT !!! *)
(* *)
(*****************************************************************)