]> cloudbase.mooo.com Git - ddt180.git/commitdiff
read_symfile: Check symbols for valid characters.
authorLeo C <erbl259-lmu@yahoo.de>
Mon, 15 Aug 2016 12:09:02 +0000 (14:09 +0200)
committerLeo C <erbl259-lmu@yahoo.de>
Mon, 15 Aug 2016 12:09:02 +0000 (14:09 +0200)
ddt180.z80

index 52752976f5685e53ad21e8c0549a536c20752fa0..50d500e10c5b4756311507f82ca3e3e8db3fd146 100644 (file)
@@ -516,9 +516,7 @@ skipbl0:
        inc de\r
 skipbl:\r
        ld a,(de)\r
-       cp ' '\r
-       jr z,skipbl0\r
-       cp TAB\r
+       call test_whitespace\r
        jr z,skipbl0\r
        or a\r
        ret\r
@@ -3137,64 +3135,62 @@ rs_2:
        call    read_hexbyte    ; symval L\r
        ld      l,a\r
        add     hl,de\r
-       push    hl              ; symval\r
        call    read_byte\r
        cp      ' '\r
        jr      z,rs_4\r
-       pop     hl              ; discard symval\r
 rs_3:  call    read_byte\r
        cp      ' '\r
-       jr      c,rs_2\r
-       jr      rs_3\r
+       jr      nc,rs_3\r
+       jr      rs_2\r
 \r
-rs_4:  ld      hl,(BDOS+1)     ;\r
-       ld      d,0             ; setup symlen\r
-rs_5:  dec     hl              ;\r
+rs_4:\r
+       push    hl              ; symval\r
+       ld      hl,(BDOS+1)     ;\r
+       ld      b,0             ; setup symlen\r
+rs_5:\r
+       dec     hl              ;\r
        call    read_byte       ; next char of symbol name\r
-       cp      TAB             ; symbol term?\r
-       jr      z,rs_6          ;\r
-       cp      CR              ;\r
-       jr      z,rs_6          ;\r
-       cp      '!'             ; TODO: check for valid symbol char instead\r
-       jr      c,error3        ;\r
+       call    test_sym_char   ; valid char?\r
+       jr      nz,rs_6\r
        ld      (hl),a          ;\r
-       inc     d               ; symlen++\r
-       ld      a,d             ;\r
+       inc     b               ; symlen++\r
+       ld      a,b             ;\r
        cp      10h+1           ;\r
        jr      c,rs_5          ;\r
 error3:\r
        jp      ERROR           ;\r
 \r
-rs_6:  push    de              ; symlen\r
-       push    hl              ;\r
+rs_6:\r
+       call    test_symterm_ch\r
+       jr      nz,error3\r
+\r
+       push    bc              ; symlen\r
        ex      de,hl           ;\r
        ld      hl,(BDOS+1)     ;\r
        inc     hl              ;\r
-       ld      e,(hl)          ;\r
+       ld      c,(hl)          ;\r
        inc     hl              ;\r
-       ld      d,(hl)          ;\r
-       pop     hl              ;\r
-       ld      (hl),d          ;\r
+       ld      b,(hl)          ;\r
+       ex      de,hl\r
+       ld      (hl),b          ;\r
        dec     hl              ;\r
-       ld      (hl),e          ;\r
+       ld      (hl),c          ;\r
        dec     hl              ;\r
        ld      (hl),0c3h       ;\r
 \r
        ld      de,(max_load)   ;\r
        call    cp_hl_de        ;\r
        jr      c,error3        ;\r
-\r
        ld      de,(reg_sp)     ;\r
        call    cp_hl_de        ;\r
        jr      nc,rs_61        ;\r
        ld      (reg_sp),hl     ;\r
 rs_61:\r
-\r
        ld      de,(BDOS+1)     ;\r
        ld      (BDOS+1),hl     ;\r
        ex      de,hl           ;\r
-       pop     af              ;\r
-       ld      (hl),a          ; symlen\r
+       pop     af              ; symlen\r
+       ld      (hl),a          ;\r
        inc     hl              ;\r
        pop     de              ; symval\r
        ld      (hl),e          ;\r
@@ -3207,6 +3203,57 @@ rs_61:
        jp      rs_1            ;\r
 \r
 \r
+; test for valid character for symbols\r
+; return z if valid\r
+\r
+test_sym_char:\r
+       cp      '$'\r
+       ret     z\r
+       cp      '%'\r
+       ret     z\r
+       cp      '.'\r
+       ret     z\r
+       cp      '_'\r
+       ret     z\r
+       call    test_alphanum\r
+       ret     c               ; cy == 1 --> z == 0\r
+       cp      a               ; return z\r
+       ret\r
+\r
+\r
+; check if char is in [0..9,?,@,A..Z,a..z]\r
+; return cy if invalid\r
+; return nc if valid alfanumeric char\r
+\r
+test_alphanum:\r
+       cp      'z'+1\r
+       ccf\r
+       ret     c\r
+       cp      'a'\r
+       ret     nc\r
+       cp      'Z'+1\r
+       ccf\r
+       ret     c\r
+       cp      '?'\r
+       ret     nc\r
+test_numeral:\r
+       cp      '9'+1\r
+       ccf\r
+       ret     c\r
+       cp      '0'\r
+       ret\r
+\r
+test_symterm_ch:\r
+       cp      CR\r
+       ret     z\r
+       cp      LF\r
+       ret     z\r
+test_whitespace:\r
+       cp      ' '\r
+       ret     z\r
+       cp      TAB\r
+       ret\r
+\r
 p_max_high0:\r
        call assert_eol\r
 p_max_high:\r