4cade/src/parse.common.a

136 lines
4.1 KiB
Plaintext
Raw Normal View History

2018-10-23 19:44:06 +00:00
;license:MIT
;(c) 2018-9 by 4am
2018-10-23 19:44:06 +00:00
;
; generic key/value text parser
;
; Public functions:
; - ParseKeyValueList
2019-06-30 19:10:09 +00:00
; - IncAndGetChar
2018-10-23 19:44:06 +00:00
;
;------------------------------------------------------------------------------
; ParseKeyValueList
; parse buffer with KEY=VALUE lines of a text file into an okvs
; keys and values limited to 127 characters, which should be enough for anyone
; if '=' is missing, key is kept and value is a 0-length string
; blank lines are ignored
; '#' character at beginning of line is a comment, entire line is ignored
; '[' character at beginning of line exits the parser
;
2019-10-08 03:20:23 +00:00
; in: stack contains 5 bytes of parameters:
2018-10-23 19:44:06 +00:00
; +1 [word] handle to storage space for okvs
; +3 [word] handle to buffer containing contents of text file
2018-11-10 15:08:14 +00:00
; +5 [byte] max length for okvs records (or 0)
2018-10-23 19:44:06 +00:00
; out: all registers and flags clobbered
; $1F00..$1FFF clobbered
; $00/$01 clobbered
; $02/$03 clobbered
; $04/$05 has the address of the next available byte after the okvs
; $FE/$FF clobbered
;------------------------------------------------------------------------------
ParseKeyValueList
2018-11-10 15:08:14 +00:00
+PARAMS_ON_STACK 5
2018-10-23 19:44:06 +00:00
+LDPARAM 1
+STAY @store2
2019-09-24 00:01:42 +00:00
jsr SetKeyPtr
2018-11-10 15:08:14 +00:00
ldy #5
lda (PARAM),y
sta @maxLength
2018-10-23 19:44:06 +00:00
ldy #$00 ; index into ($FE) pointing to current character
@newkey ldx #$00 ; X = index into current key
stx gValLen ; initialize value length (in case this line has no value)
2019-09-24 00:01:42 +00:00
beq @emptyline ; always branches
@skipLine ; skip to CR
jsr IncAndGetChar
cmp #$0D ; CR
bne @skipLine
@emptyline
2018-10-23 19:44:06 +00:00
jsr IncAndGetChar
cmp #$0D ; CR in first position (blank line) -> no key
2019-09-24 00:01:42 +00:00
beq @emptyline
2018-10-23 19:44:06 +00:00
cmp #$23 ; '#' starts a comment -> no key, skip to CR
beq @skipLine
cmp #$5B ; '[' ends the parsing
beq .parseKeyValueDone
bne @appendToKey
@gatherKey
jsr IncAndGetChar
cmp #$0D ; CR -> finalize key, no value
beq @finalizeKey
cmp #$3D ; '=' -> finalize key, start gathering value
beq @finalizeKey
@appendToKey
sta gKey,x
inx
bpl @gatherKey
@finalizeKey
stx gKeyLen
cmp #$0D
beq @storeInOKVS
ldx #$00 ; now X = index into the current value
@gatherValue
jsr IncAndGetChar
cmp #$0D ; CR -> finalize value
beq @finalizeValue
sta gVal,x
inx
bpl @gatherValue
@finalizeValue
stx gValLen
@storeInOKVS
tya
pha ; okvs functions clobber everything but we need Y
jsr okvs_append
@store2 !word $FDFD ; SMC
!word gKeyLen
!word gValLen
2018-11-10 15:08:14 +00:00
@maxLength
!byte $FD ; SMC
2018-10-23 19:44:06 +00:00
pla
tay
clc
bcc @newkey ; always branches
2019-09-24 00:01:42 +00:00
;------------------------------------------------------------------------------
; SetKeyPtr
;
; in: PARAM set
; out: okvs initialised
; ($FE) -> buffer
;------------------------------------------------------------------------------
SetKeyPtr
jsr okvs_init ; reset key/value store
2019-11-27 21:51:43 +00:00
+LDPARAMPTR 3, $FE
2019-09-24 00:01:42 +00:00
2019-11-27 21:51:43 +00:00
ldy #0
2019-09-24 00:01:42 +00:00
lda ($FE),y
tax
bne +
2019-11-27 21:51:43 +00:00
iny
lda ($FE),y
sta $FF
dec $FF
+ dex
2019-09-24 00:01:42 +00:00
stx $FE
rts
2018-10-23 19:44:06 +00:00
;------------------------------------------------------------------------------
; IncAndGetChar
;
; in: Y = index into ($FE)
; ($FE) -> buffer
; out: A contains next byte from buffer
; Y incremented
; $FF possibly incremented
;------------------------------------------------------------------------------
IncAndGetChar
iny
bne +
inc $FF
+ lda ($FE),y
.parseKeyValueDone
rts