From b225adaf0353a7b2c245e9e27f6097af5589d511 Mon Sep 17 00:00:00 2001 From: Greg King Date: Wed, 1 May 2013 15:04:36 -0400 Subject: [PATCH] Fixed isgraph() and ispunct() (macroes and library functions). --- include/ctype.h | 32 ++++++++++++++++++-------------- libsrc/common/isgraph.s | 15 +++++++++------ libsrc/common/ispunct.s | 17 ++++++++++------- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/include/ctype.h b/include/ctype.h index 7901f4c3b..8437e2c2c 100644 --- a/include/ctype.h +++ b/include/ctype.h @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2009, Ullrich von Bassewitz */ +/* (C) 1998-2013, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -40,14 +40,14 @@ /* The array containing character classification data */ extern unsigned char _ctype[256]; -/* Bits used to specify characters classes */ +/* Bits used to specify character classes */ #define _CT_LOWER 0x01 /* 0 - Lower case char */ #define _CT_UPPER 0x02 /* 1 - Upper case char */ #define _CT_DIGIT 0x04 /* 2 - Numeric digit */ -#define _CT_XDIGIT 0x08 /* 3 - Hex digit (both, lower and upper) */ +#define _CT_XDIGIT 0x08 /* 3 - Hex digit (both lower and upper) */ #define _CT_CNTRL 0x10 /* 4 - Control character */ #define _CT_SPACE 0x20 /* 5 - The space character itself */ -#define _CT_OTHER_WS 0x40 /* 6 - Other whitespace ('\f', '\n', '\r', '\t' and '\v') */ +#define _CT_OTHER_WS 0x40 /* 6 - Other whitespace ('\f', '\n', '\r', '\t', and '\v') */ #define _CT_SPACE_TAB 0x80 /* 7 - Space or tab character */ /* Bit combinations */ @@ -79,17 +79,17 @@ int __fastcall__ tolower (int c); /* Always external */ #if __CC65_STD__ >= __CC65_STD_CC65__ unsigned char __fastcall__ toascii (unsigned char c); -/* Convert a target specific character to ascii */ +/* Convert a target-specific character to ASCII. */ #endif -/* When inlining of known function is enabled, overload most of the above - * functions by macros. The function prototypes are again available after - * #undef'ing the macros. - * Please note that the following macros do NOT handle EOF correctly, as +/* When inlining-of-known-functions is enabled, overload most of the above + * functions by macroes. The function prototypes are available again after + * #undef'ing the macroes. + * Please note that the following macroes do NOT handle EOF correctly, as * stated in the manual. If you need correct behaviour for EOF, don't - * use -Os, or #undefine the following macros. + * use -Os, or #undefine the following macroes. */ #ifdef __OPT_s__ @@ -128,8 +128,10 @@ unsigned char __fastcall__ toascii (unsigned char c); #define isgraph(c) (__AX__ = (c), \ __asm__ ("tay"), \ __asm__ ("lda %v,y", _ctype), \ - __asm__ ("eor #%b", _CT_NOT_GRAPH), \ - __asm__ ("and #%b", _CT_NOT_GRAPH), \ + __asm__ ("and #%b", _CT_NOT_GRAPH), \ + __asm__ ("cmp #1"), \ + __asm__ ("lda #1"), \ + __asm__ ("sbc #1"), \ __AX__) #define islower(c) (__AX__ = (c), \ @@ -141,15 +143,17 @@ unsigned char __fastcall__ toascii (unsigned char c); #define isprint(c) (__AX__ = (c), \ __asm__ ("tay"), \ __asm__ ("lda %v,y", _ctype), \ - __asm__ ("eor #%b", _CT_NOT_PRINT), \ __asm__ ("and #%b", _CT_NOT_PRINT), \ + __asm__ ("eor #%b", _CT_NOT_PRINT), \ __AX__) #define ispunct(c) (__AX__ = (c), \ __asm__ ("tay"), \ __asm__ ("lda %v,y", _ctype), \ - __asm__ ("eor #%b", _CT_NOT_PUNCT), \ __asm__ ("and #%b", _CT_NOT_PUNCT), \ + __asm__ ("cmp #1"), \ + __asm__ ("lda #1"), \ + __asm__ ("sbc #1"), \ __AX__) #define isspace(c) (__AX__ = (c), \ diff --git a/libsrc/common/isgraph.s b/libsrc/common/isgraph.s index e52ae3485..504cbd180 100644 --- a/libsrc/common/isgraph.s +++ b/libsrc/common/isgraph.s @@ -1,5 +1,6 @@ ; -; Ullrich von Bassewitz, 02.06.1998 +; 1998-06-02, Ullrich von Bassewitz +; 2013-05-01, Greg King ; ; int isgraph (int c); ; @@ -8,15 +9,17 @@ .include "ctype.inc" _isgraph: - cpx #$00 ; Char range ok? + cpx #>0 ; Char range OK? bne @L1 ; Jump if no tay lda __ctype,y ; Get character classification - eor #CT_CTRL_SPACE ; NOT control and NOT space - and #CT_CTRL_SPACE ; Mask character bits - rts + and #CT_CTRL_SPACE ; Mask character bits + cmp #1 ; If false, then set "borrow" flag + lda #0 + sbc #0 ; Invert logic + rts ; Return NOT control and NOT space -@L1: lda #$00 ; Return false +@L1: lda #<0 ; Return false tax rts diff --git a/libsrc/common/ispunct.s b/libsrc/common/ispunct.s index 380cf38cc..8b1240541 100644 --- a/libsrc/common/ispunct.s +++ b/libsrc/common/ispunct.s @@ -1,22 +1,25 @@ ; -; Ullrich von Bassewitz, 02.06.1998 +; 1998-06-02, Ullrich von Bassewitz +; 2013-05-01, Greg King ; ; int ispunct (int c); ; .export _ispunct - .include "ctype.inc" + .include "ctype.inc" _ispunct: - cpx #$00 ; Char range ok? + cpx #>0 ; Char range OK? bne @L1 ; Jump if no tay lda __ctype,y ; Get character classification - eor #CT_NOT_PUNCT ; NOT (space | control | digit | alpha) - and #CT_NOT_PUNCT ; Mask relevant bits - rts + and #CT_NOT_PUNCT ; Mask relevant bits + cmp #1 ; If false, then set "borrow" flag + lda #0 + sbc #0 ; Invert logic + rts ; Return NOT (space | control | digit | alpha) -@L1: lda #$00 ; Return false +@L1: lda #<0 ; Return false tax rts