[Back to STRINGS SWAG index]  [Back to Main SWAG index]  [Original]

{*****************************************************************************
 * Function ...... RightAt()
 * Purpose ....... Return the last position of a substring as viewed from
 *                 the right side of the string
 * Parameters .... sub       Substring to locate
 *                 s         String to find <sub> in
 * Returns ....... Numeric last position of <sub> in s, counting from
 *                 right to left.
 * Notes ......... None
 * Author ........ Martin Richardson
 * Date .......... October 2, 1992
*****************************************************************************}
FUNCTION RightAt( sub: STRING; s: STRING ): BYTE; ASSEMBLER;
VAR
   nResult: WORD;
ASM
      PUSH    DS
      XOR     CX, CX

      LDS     SI, sub
      XOR     AX, AX
      LODSB
      MOV     BX, AX
      CMP     BX, 0
      JBE     @@3

      LES     DI, s
      XOR     DX, DX
      MOV     DL, BYTE PTR ES:[DI]
      INC     DI
      CMP     DX, 0
      JBE     @@3

      PUSH    DX

      CMP     BX, DX
      JAE     @@3

      DEC     BX
      CLD
@@1:  MOV     SI, WORD PTR sub
      INC     SI
      LODSB

      MOV     CX, DX
      REPNE   SCASB
      JNZ     @@3

      MOV     DX, CX
      MOV     CX, BX
      REPE    CMPSB
      JZ      @@4

      ADD     DI, CX
      SUB     DI, BX
@@2:  CMP     DX, BX
      JA      @@1
@@3:  XOR     AL, AL
      JMP     @@5
@@4:  SUB     DI, BX
      DEC     DI
      SUB     DI, WORD PTR s
      MOV     nResult, DI
      ADD     DI, WORD PTR s
      ADD     DI,CX
      INC     DI
      JMP     @@2
@@5:
      POP     BX
      MOV     AX, nResult
      CMP     AX, 0
      JE      @@6
      XCHG    AX, BX
      SUB     AX, BX
      INC     AX
@@6:  POP     DS
END;


[Back to STRINGS SWAG index]  [Back to Main SWAG index]  [Original]