; C02 library stringx.h02 assembly language subroutines
; Requires subroutines and definitions from string.asm

        SUBROUTINE STRINGX

;Common Code - Initialize Variables
.INIVAR JSR SETSRC      ;Initialize Source String
        STY TEMP1       ;Save Destination Pointer
        LDX #0          ;Set End of String Flag
        RTS             ;  and Return

;Common Code - Check Next Character in Destination String
.CHKNXT LDY TEMP1
        LDA (DSTPTR),Y  ;Get Next Character in Destination String
        BEQ .POPRET     ;If NUL, Return from Calling Routine
        LDY #0          ;Initialize Source Pointer
        JMP STRCHA      ;Search for Character in Source and Return

;Common Code - Exit with Result
.POPRET PLA             ;Pop Return Address Off Stack
        PLA             ;  to force exit from Calling Routine
.RETNOF TXA             ;Load End of String Flag into Accumulator 
        BNE .RETURN     ;If 0 Then
.RETPOS LDA TEMP1       ;  Load Character Position into Accumulator
.RETURN RTS             ;Return 

;strpbk(&s) - Return position of first character in Destination
;             also contained in Source
;Requires: DSTPTR - Pointer to destination string
;Args: X,Y = Pointer to source string
;Sets: SRCPTR = Pointer to source string
;      TEMP1 = Position of last character checked
;Uses: TEMP0
;Affects: C,X,Y
;Returns: A = Position of first character that matches
;             $FF if no characters matched
STRPBK: JSR .INIVAR     ;Initialize Variables
        DEX             ;Change End of String Flag to $FF
        BNE .STRBRK     ;Jump into strbrk subroutine

;strbrk(&s) - Return length of Destination with characters 
;             not contained in Source
;Requires: DSTPTR - Pointer to destination string
;Args: X,Y = Pointer to source string
;Sets: SRCPTR = Pointer to source string
;      TEMP1 = Return value
;Uses: TEMP0
;Affects: C,X,Y
;Returns: A = Length of matching string segment
;         Z = 1 if no characters matched 
;         N = 1 if > 127 characters matched
STRCSP:                 ;Alias to strbrk 
STRBRK: JSR .INIVAR     ;Initialize Variables
.STRBRK JSR .CHKNXT     ;and Search for Character in Source String
        BCS .RETPOS     ;If Not Found
        INC TEMP1       ;  Increment Destination Pointer
        BPL .STRBRK     ;  and Loop if < 128 
        BMI .RETNOF     ;and Return Not Found

;strspn(&s) - Return length of Destination with characters 
;             contained in Source
;Requires: DSTPTR - Pointer to destination string
;Args: X,Y = Pointer to source string
;Sets: SRCPTR = Pointer to source string
;      TEMP1 = Return value
;Uses: TEMP0
;Affects: C,X,Y
;Returns: A = Length of matching string segment
;         Z = 1 if no characters matched 
;         N = 1 if > 127 characters matched
STRSPN: JSR .INIVAR     ;Initialize Variables
.SPLOOP JSR .CHKNXT     ;and Search for Character in Source String
        BCC .RETPOS     ;If Found
        INC TEMP1       ;  Increment Destination Pointer
        BPL .SPLOOP     ;  and Loop if < 128 
        BMI .RETPOS     ;Else Return Position

;strtok(c, &s) - Split String by Specified Character
;Args: A = Delimiter, 0 = Set String to Tokenize
;      X,Y = Address of Argument String
;Sets: DSTPTR = Address of Argument String 
;               or Address of System Buffer (A=0)
;      SRCPTR = Address of System Buffer Location 
;               or Address of Argument String (A=0)
;      TEMP0 = Delimiter Character
;Populates: SYSBFR - String to Tokenize
;Returns: A = Length of Token
;         Y = New Buffer Position, $FF = End of String
;         X = End of String Flag, $00 or $FF
STRTOK: ORA #0          
        BNE .STRTOK     ;If Delimiter is NUL 
        STA SYSBFP      ;  Initialize System Buffer Position
        JMP STRCPB      ;  Copy String to System Buffer and Return
.STRTOK STA TEMP0       ;Save Delimiter Character
        JSR SETDST      ;Set Destination to String Address
        JSR SETSBP      ;Set Source to Current Buffer Position
        BPL .STCOPY     ;If at End of Buffer
        LDA #0          
        TAY             ;Set Destination String to ""
        STA (DSTPTR),Y  ;and Return String Length 0
        RTS             
.STCOPY LDY #0          ;Initialize Index
        LDX #0          ;Clear End of String Flag
.STLOOP LDA (SRCPTR),Y  ;Get Character from Source String
        BNE .STSKIP     ;If End of String 
        DEX             ;  Set End of Buffer Flag
        BMI .STDONE     ;  and Finish Up
.STSKIP CMP TEMP0       ;
        BEQ .STDONE     ;If Not Delimiter Character
        STA (DSTPTR),Y  ;  Copy to Destination String
        INY             ;  Increment Index
        CPY #SYSBFL     ;  If Less Than Buffer Size
        BCC .STLOOP     ;    Loop
        DEX             ;Else Set End of Buffer Flag
.STDONE LDA #0          ;Terminate String
        STA (DSTPTR),Y  ;
.STRTN  STY TEMP0       ;Save String Length
        INY             ;Increment Past Delimiter
        TYA             ;  and Add to Buffer Position
        CLC
        ADC SYSBFP
        STA SYSBFP      ;Save New Buffer Position
        CPX #0          ;If End of Buffer Flag is Set
        BPL .STRTRN     
        STX SYSBFP      ;  Set Buffer Position to 255
.STRTRN LDA TEMP0       ;Return String Length
        RTS             

        ENDSUBROUTINE
