; Sets Z is A is ' ' or '\t' (whitespace), or ',' (arg sep)
isSep:
	cp	' '
	ret	z
	cp	0x09
	ret	z
	cp	','
	ret

; Expect at least one whitespace (0x20, 0x09) at (HL), and then advance HL
; until a non-whitespace character is met.
; HL is advanced to the first non-whitespace char.
; Sets Z on success, unset on failure.
; Failure is either not having a first whitespace or reaching the end of the
; string.
; Sets Z if we found a non-whitespace char, unset if we found the end of string.
rdSep:
	ld	a, (hl)
	call	isSep
	ret	nz	; failure
.loop:
	inc	hl
	ld	a, (hl)
	call	isSep
	jr	z, .loop
	or	a	; cp 0
	jp	z, .fail
	cp	a	; ensure Z
	ret
.fail:
	; A is zero at this point
	inc	a	; unset Z
	ret

; Advance HL to the next separator or to the end of string.
toSep:
	ld	a, (hl)
	call	isSep
	ret	z
	inc	hl
	jr	toSep

; Read (HL) until the next separator and copy it in (DE)
; DE is preserved, but HL is advanced to the end of the read word.
rdWord:
	push	af
	push	de
.loop:
	ld	a, (hl)
	call	isSep
	jr	z, .stop
	or	a
	jr	z, .stop
	ld	(de), a
	inc	hl
	inc	de
	jr	.loop
.stop:
	xor	a
	ld	(de), a
	pop	de
	pop	af
	ret

; Read word from HL in SCRATCHPAD and then intepret that word as an expression.
; Put the result in IX.
; Z for success.
rdExpr:
	ld	de, SCRATCHPAD
	call	rdWord
	push	hl
	ex	de, hl
	call	parseExpr
	pop	hl
	ret