A2osX/SYS/KERNEL.S.STR.txt
2016-06-07 08:10:18 +02:00

362 lines
9.3 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
* S.PStrCpyA
* In:
* A = hMem of Src String
* Out:
* A = hMem of Dest String
*--------------------------------------
* S.NewPStrYA
* IN:
* PULLW = PTR to buffer
* OUT:
* A = hMem to S (PSTRING)
*--------------------------------------
S.PStrCpyA jsr S.GetMemPtrA
S.NewPStrYA >STYA ZPQuickPtr1
lda (ZPQuickPtr1)
inc
tay
lda #0 Y,A = len of new string
>PUSHYA
>PUSHA 0 = no option
jsr S.GetMem
bcs .9
phx
>STYA ZPQuickPtr2
lda (ZPQuickPtr1)
sta (ZPQuickPtr2)
tay
beq .2
.1 lda (ZPQuickPtr1),y
sta (ZPQuickPtr2),y
dey
bne .1
.2 pla
clc
rts
.9 sec
rts
*--------------------------------------
* S.PStrCat
* IN:
* PULLB = hMem to S1 (PSTRING)
* PULLB = hMem to S2 (PSTRING)
* OUT:
* A = hMem to S1+S2 (PSTRING)
*--------------------------------------
S.PStrCat >PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr1 save S1
>PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr2 save S2
lda (ZPQuickPtr1) Compute length of new path = S1 + S2 + 1
sec
adc (ZPQuickPtr2)
tay
lda #0 Y,A = len of new string
>PUSHYA
>PUSHA 0 = no option
jsr S.GetMem
bcs .9 OOM error
>STYA ZPQuickPtr3
phx save New hMem
lda (ZPQuickPtr1)
tax
ldy #0
.2 iny
lda (ZPQuickPtr1),y
sta (ZPQuickPtr3),y
dex
bne .2
lda (ZPQuickPtr2)
tax
.3 inc ZPQuickPtr2
bne .4
inc ZPQuickPtr2+1
.4 iny
lda (ZPQuickPtr2)
sta (ZPQuickPtr3),y
dex
bne .3
tya
sta (ZPQuickPtr3)
pla returns A = new hMem
clc
rts
.9 sec
rts
*--------------------------------------
* S.PStrCmp
* IN:
* PULLB = hMem to S1 (PSTRING)
* PULLB = hMem to S2 (PSTRING)
* OUT:
* cc or cs
*--------------------------------------
S.PStrCmp >PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr1 save S1
>PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr2 save S2
lda (ZPQuickPtr1)
tay
cmp (ZPQuickPtr2)
bne .9
.1 lda (ZPQuickPtr1),y
cmp (ZPQuickPtr2),y
bne .9
dey
bne .1
clc
rts
.9 sec
rts
*--------------------------------------
* S.PStrMatch
* IN:
* PULLB = hMem to String (PSTRING)
* PULLB = hMem to Pattern (PSTRING)
* OUT:
* cc = match
* cs = no match
*--------------------------------------
S.PStrMatch >PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr2 save String
>PULLA
jsr S.GetMemPtrA
>STYA ZPQuickPtr1 save Pattern
bra S.PStrMatch1
S.PStrMatchP >PULLW ZPQuickPtr2 pull String
>PULLW ZPQuickPtr1 pull Pattern
S.PStrMatch1 lda (ZPQuickPTR1) Keep Pattern Length in X
tax
beq .8 Match always if empty
ldy #0
.1 inc ZPQuickPTR1 Make PTR1 advance to next char
bne .2
inc ZPQuickPTR1+1
.2 lda (ZPQuickPTR1) get pattern char
cmp #'*'
beq .5
.3 tya we must match ? or regular char
cmp (ZPQuickPTR2) check if at end of string
beq .9 yes, no char left, exit with error
iny advance to next char to compare
lda (ZPQuickPTR1) get back pattern char
cmp #'?'
beq .4 no need to compare, any char will match
cmp (ZPQuickPTR2),y Regular Char, compare with string at Y
bne .9 no match, exit
.4 dex char matched, check if end of pattern
bne .1 continue if remaining char in pattern
tya end of pattern, but end of string ?
cmp (ZPQuickPTR2) end of string ?
beq .8 yes, string matched entirely
bra .9 no, remaining char in string, no match
.5 dex we have '*', last char of pattern ?
beq .8 yes, match everything, including empty string
inc ZPQuickPTR1 Make PTR1 advance to next char
bne .6
inc ZPQuickPTR1+1
.6 lda (ZPQuickPTR1) get next char of pattern
cmp #'*' another '*' ?
beq .5 yes, '**' = '*', go next char
cmp #'?' '*?' ??? we must match a least one char
beq .3
.7 tya we need at least one remaining char in string,
cmp (ZPQuickPTR2) check if at end of string
beq .9 no chance to match ? or regular char
iny
lda (ZPQuickPTR1) get again char in pattern
cmp (ZPQuickPTR2),y compare with char in string
bne .7 not equal to next non wildcard in pattern
bra .4 go check remaining char in pattern...
.8 clc
rts
.9 sec
rts
*--------------------------------------
* S.PStrGetTkn
* IN:
* PULLB = Token IDX
* 0: "Split mode": first token + remaining
* !0: "Std Mode": Return token #
* PULLB = SEP char
* PULLB = hMem to PSTRING
* OUT:
* A = hMem to Token (PSTRING)
* X = hMem to Remaining String After Token "Split Mode"
*--------------------------------------
S.PStrGetTkn >PULLA Get IDX
sta S.PStrGetTkn.IDX
>PULLA Get SEP
sta S.PStrGetTkn.SEP
>PULLA Get PStr
jsr S.GetMemPtrA
>STYA ZPQuickPtr1
S.PStrGetTkn1 ldx #0 init token count to 0
ldy #0
stz S.PStrGetTkn.START init INTOKEN start to 0
.1 iny
lda (ZPQuickPtr1),y
and #$7F
cmp S.PStrGetTkn.SEP char=SEP ?
bne .3 no, start a new token if not alredy in
lda S.PStrGetTkn.START SEP:in INTOKEN ?
beq .4 no, skip this SEP
inx yes, increase token count
lda S.PStrGetTkn.IDX requested token=0 ?
beq .71 yes, we are in "split mode"
cpx S.PStrGetTkn.IDX no,is current X=requested IDX?
beq .71
stz S.PStrGetTkn.START reset in INTOKEN start
bra .4
.3 lda S.PStrGetTkn.START char:already INTOKEN ?
bne .4 yes, keep existing start index
sty S.PStrGetTkn.START mark begining of token
.4 tya
cmp (ZPQuickPtr1) end of string ?
bne .1 no, get next one
lda S.PStrGetTkn.START INTOKEN?
beq .6
inx yes, last one is ending with string
.6 lda S.PStrGetTkn.IDX split mode ?
beq .7
cpx S.PStrGetTkn.IDX is token = requested?
beq .7
sec End of String reached, no matching token
.61 rts
.71 dey move back yo end of token before this SEP
.7 sty S.PStrGetTkn.END we have matching token (or 1st one in split mode) at [START,END]
tya compute token len=Y-END
sec
sbc S.PStrGetTkn.START
inc +1
inc +1 for string len
tay
lda #0
>PUSHYA Get a hMem for this token
>PUSHA 0 = no option
jsr S.GetMem
bcs .61
phx save hMem
>STYA ZPQuickPtr2
lda S.PStrGetTkn.END
sec
sbc S.PStrGetTkn.START
inc
sta (ZPQuickPtr2) set this string length
ldy S.PStrGetTkn.START
dey
.8 iny
inc ZPQuickPtr2
bne .9
inc ZPQuickPtr2+1
.9 lda (ZPQuickPtr1),y
sta (ZPQuickPtr2)
cpy S.PStrGetTkn.END
bne .8
lda S.PStrGetTkn.IDX requested token=0 ?
bne .87
tya yes, we are in "split mode"
cmp (ZPQuickPtr1) Remaining chars ?
beq .87
.10 iny move to next char
lda (ZPQuickPtr1),y
cmp S.PStrGetTkn.SEP char=SEP?
bne .11
tya
cmp (ZPQuickPtr1) last one ?
bne .10
bra .87 yes, nothing to return
.11 sty S.PStrGetTkn.END S.PStrGetTkn.END=1st non SEP char
lda (ZPQuickPtr1) compute reamining len=Y-ZPQuickPtr1+1
sec
sbc S.PStrGetTkn.END
inc
inc +1 for string len
tay
lda #0
>PUSHYA Get a hMem for remaining string
>PUSHA 0 = no option
jsr S.GetMem
bcs .98
phx save hMem
>STYA ZPQuickPtr2
lda (ZPQuickPtr1)
sec
sbcS.PStrGetTkn.END
inc
sta (ZPQuickPtr2)
ldy S.PStrGetTkn.END
dey
.12 iny
inc ZPQuickPtr2
bne .13
inc ZPQuickPtr2+1
.13 lda (ZPQuickPtr1),y
sta (ZPQuickPtr2)
tya
cmp (ZPQuickPtr1)
bne .12
plx get back remaining string hMem
pla get back token hMem
clc
rts
.87 ldx #0 Splitmode but no remaining string to return
pla get back token hMem
clc
rts
.98 pla get back Token hMem
jsr S.FreeMemA discard Token
.99 sec
rts
*--------------------------------------
S.PStrGetTkn.SEP .BS 1
S.PStrGetTkn.IDX .BS 1
S.PStrGetTkn.START .BS 1
S.PStrGetTkn.END .BS 1
*--------------------------------------
S.GetArgCount
clc
rts
*--------------------------------------
S.GetArgA
clc
rts
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.STR
LOAD SYS/KERNEL.S
ASM