203 lines
2.6 KiB
C
203 lines
2.6 KiB
C
/**
|
||
* @file ctype.h
|
||
* @brief Character tests and conversion functions.
|
||
* @author Miguel I. Garcia Lopez / FloppySoftware
|
||
*
|
||
* Character tests and conversion functions, for MESCC (Mike's Enhanced
|
||
* Small C Compiler for Z80 & CP/M).
|
||
*
|
||
* Revisions:
|
||
* - 19 Dec 2000 : Last revision.
|
||
* - 16 Apr 2007 : GPL'd.
|
||
* - 15 Aug 2016 : Documented. GPL v3.
|
||
*
|
||
* Copyright (c) 1999-2016 Miguel I. Garcia Lopez / FloppySoftware.
|
||
*
|
||
* Licensed under the GNU General Public License v3.
|
||
*
|
||
* http://www.floppysoftware.es
|
||
* floppysoftware@gmail.com
|
||
*/
|
||
#ifndef CTYPE_H
|
||
|
||
#define CTYPE_H
|
||
|
||
/**
|
||
* @fn int isalpha(char ch)
|
||
* @brief Test if ch is a letter.
|
||
* @param ch - character to test
|
||
* @return true or false
|
||
*/
|
||
#asm
|
||
|
||
isalpha
|
||
ld a,l
|
||
ld hl,0
|
||
cp 'A'
|
||
ret c
|
||
cp 'Z'+1
|
||
jr c,isalpha1
|
||
cp 'a'
|
||
ret c
|
||
cp 'z'+1
|
||
ret nc
|
||
isalpha1
|
||
inc l
|
||
ret
|
||
|
||
#endasm
|
||
|
||
/**
|
||
* @fn int isdigit(char ch)
|
||
* @brief Test if ch is a decimal digit.
|
||
* @param ch - character to test
|
||
* @return true or false
|
||
*/
|
||
#asm
|
||
|
||
isdigit
|
||
ld a,l
|
||
ld hl,0
|
||
cp '0'
|
||
ret c
|
||
cp '9'+1
|
||
ret nc
|
||
inc l
|
||
ret
|
||
|
||
#endasm
|
||
|
||
/**
|
||
* @fn int isxdigit(char ch)
|
||
* @brief Test if ch is an hexadecimal digit.
|
||
* @param ch - character to test
|
||
* @return true or false
|
||
*/
|
||
#asm
|
||
|
||
isxdigit
|
||
LD C,L
|
||
CALL isdigit
|
||
RET C
|
||
LD HL,0
|
||
LD A,C
|
||
CP 'A'
|
||
RET C
|
||
CP 'G'
|
||
JR C,isxdigit1
|
||
CP 'a'
|
||
RET C
|
||
CP 'g'
|
||
RET NC
|
||
isxdigit1
|
||
INC L
|
||
RET
|
||
|
||
#endasm
|
||
|
||
/**
|
||
* @fn int isalnum(char ch)
|
||
* @brief Test if ch is a letter or a decimal digit.
|
||
* @param ch - character to test
|
||
* @return true or false
|
||
*/
|
||
#asm
|
||
|
||
isalnum
|
||
LD C,L
|
||
CALL isdigit
|
||
RET C
|
||
LD L,C
|
||
JP isalpha
|
||
|
||
#endasm
|
||
|
||
/**
|
||
* @fn int isupper(char ch)
|
||
* @brief Test if ch is a letter in uppercase.
|
||
* @param ch - character to test
|
||
* @return true or false
|
||
*/
|
||
#asm
|
||
|
||
isupper
|
||
ld a,l
|
||
ld hl,0
|
||
cp 'A'
|
||
ret c
|
||
cp 'Z'+1
|
||
ret nc
|
||
inc l
|
||
ret
|
||
|
||
#endasm
|
||
|
||
/**
|
||
* @fn int islower(char ch)
|
||
* @brief Test if ch is a letter in lowercase.
|
||
* @param ch - character to test
|
||
* @return true or false
|
||
*/
|
||
#asm
|
||
|
||
islower
|
||
ld a,l
|
||
ld hl,0
|
||
cp 'a'
|
||
ret c
|
||
cp 'z'+1
|
||
ret nc
|
||
inc l
|
||
ret
|
||
|
||
#endasm
|
||
|
||
/**
|
||
* @fn int toupper(char ch)
|
||
* @brief Convert letter to uppercase.
|
||
*
|
||
* If ch is not a letter in lowercase, returns ch unchanged.
|
||
*
|
||
* @param ch - character to convert
|
||
* @return ch in uppercase
|
||
*/
|
||
#asm
|
||
|
||
toupper
|
||
ld a,l
|
||
cp 'a'
|
||
ret c
|
||
cp 'z'+1
|
||
ret nc
|
||
sub 20h
|
||
ld l,a
|
||
ret
|
||
|
||
#endasm
|
||
|
||
/**
|
||
* @fn int tolower(char ch)
|
||
* @brief Convert letter to lowercase.
|
||
*
|
||
* If ch is not a letter in uppercase, returns ch unchanged.
|
||
*
|
||
* @param ch - character to convert
|
||
* @return ch in lowercase
|
||
*/
|
||
#asm
|
||
|
||
tolower
|
||
ld a,l
|
||
cp 'A'
|
||
ret c
|
||
cp 'Z'+1
|
||
ret nc
|
||
add 20h
|
||
ld l,a
|
||
ret
|
||
|
||
#endasm
|
||
|
||
#endif
|
||
|
||
|