249 lines
3.3 KiB
C
249 lines
3.3 KiB
C
/**
|
||
* @file string.h
|
||
* @brief String functions.
|
||
* @author Miguel I. Garcia Lopez / FloppySoftware
|
||
*
|
||
* String functions, for MESCC (Mike's Enhanced
|
||
* Small C Compiler for Z80 & CP/M).
|
||
*
|
||
* Revisions:
|
||
* - 19 Mar 2001 : 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 STRING_H
|
||
|
||
#define STRING_H
|
||
|
||
/**
|
||
* @fn int strlen(char *str)
|
||
* @brief Return string length.
|
||
* @param str - string
|
||
* @return length in characters
|
||
*/
|
||
#asm
|
||
strlen:
|
||
LD D,H
|
||
LD E,L
|
||
LD BC,0FFFFH
|
||
XOR A
|
||
CPIR
|
||
OR A
|
||
SBC HL,DE
|
||
DEC HL
|
||
RET
|
||
#endasm
|
||
|
||
/**
|
||
* @fn char *strcpy(char *dst, char *src)
|
||
* @brief Copy string.
|
||
* @param dst - destination string
|
||
* @param src - source string
|
||
* @return pointer to dst
|
||
*/
|
||
#asm
|
||
strcpy:
|
||
POP BC
|
||
POP HL
|
||
POP DE
|
||
PUSH DE
|
||
PUSH HL
|
||
PUSH BC
|
||
|
||
PUSH DE
|
||
|
||
strcpy2:
|
||
LD A,(HL)
|
||
LD (DE),A
|
||
INC HL
|
||
INC DE
|
||
OR A
|
||
JR NZ,strcpy2
|
||
POP HL
|
||
RET
|
||
#endasm
|
||
|
||
/**
|
||
* @fn char *strcat(char *dst, char *src)
|
||
* @brief Copy string at the end of another string.
|
||
* @param dst - destination string
|
||
* @param src - source string
|
||
* @return pointer to dst
|
||
*/
|
||
#asm
|
||
strcat:
|
||
POP BC
|
||
POP HL
|
||
POP DE
|
||
PUSH DE
|
||
PUSH HL
|
||
PUSH BC
|
||
|
||
PUSH DE
|
||
|
||
strcat2
|
||
LD A,(DE)
|
||
OR A
|
||
JR Z,strcpy2
|
||
INC DE
|
||
JR strcat2
|
||
#endasm
|
||
|
||
/**
|
||
* @fn int strcmp(char *str1, char *str2)
|
||
* @brief Compare two strings.
|
||
* @param str1 - a string
|
||
* @param str2 - a string
|
||
* @return <0 on str1 < str2; =0 on str1 == str2; >0 on str1 > str2
|
||
*/
|
||
#asm
|
||
strcmp
|
||
POP BC
|
||
POP HL
|
||
POP DE
|
||
PUSH DE
|
||
PUSH HL
|
||
PUSH BC
|
||
strcmp1
|
||
LD A,(DE)
|
||
CP (HL)
|
||
JR NZ,strcmp2
|
||
|
||
OR A
|
||
JR Z,strcmp2
|
||
|
||
INC DE
|
||
INC HL
|
||
JR strcmp1
|
||
|
||
strcmp2
|
||
LD HL,0
|
||
RET Z
|
||
JR NC,strcmp3
|
||
DEC HL
|
||
RET
|
||
strcmp3
|
||
INC L
|
||
RET
|
||
#endasm
|
||
|
||
/**
|
||
* @fn char *strchr(char *str, char ch)
|
||
* @brief Search a character in a string.
|
||
* @param str - the string where to search
|
||
* @param ch - the character to find
|
||
* @return pointer to ch in the string, or NULL on failure
|
||
*/
|
||
#asm
|
||
strchr
|
||
POP BC
|
||
POP DE
|
||
POP HL
|
||
PUSH HL
|
||
PUSH DE
|
||
PUSH BC
|
||
|
||
|
||
strchr2
|
||
LD A,(HL)
|
||
CP E
|
||
RET Z
|
||
|
||
INC HL
|
||
OR A
|
||
JR NZ,strchr2
|
||
|
||
LD H,A
|
||
LD L,A
|
||
RET
|
||
#endasm
|
||
|
||
/**
|
||
* @fn char *strupr(char *str)
|
||
* @brief Convert a string to upper case.
|
||
* @param str - a string
|
||
* @return pointer to str
|
||
*/
|
||
#asm
|
||
strupr
|
||
POP BC
|
||
POP HL
|
||
PUSH HL
|
||
PUSH BC
|
||
|
||
PUSH HL
|
||
|
||
strupr1
|
||
LD A,(HL)
|
||
OR A
|
||
JR Z,strupr3
|
||
|
||
CP 'a'
|
||
JR C,strupr2
|
||
CP 'z'+1
|
||
JR NC,strupr2
|
||
SUB 32
|
||
LD (HL),A
|
||
|
||
strupr2
|
||
INC HL
|
||
JR strupr1
|
||
|
||
strupr3
|
||
POP HL
|
||
RET
|
||
#endasm
|
||
|
||
/**
|
||
* @fn int atoi(char *s)
|
||
* @brief Convert string to a integer.
|
||
*
|
||
* This function parses a string, interpreting its content as
|
||
* a decimal integer number, until the end of the string, or
|
||
* a non decimal digit:
|
||
*
|
||
* [+|-][[0..9]...][ZERO|NON_DECIMAL_DIGIT]
|
||
*
|
||
* Examples:
|
||
* - "-256" == -256
|
||
* - "64" == 64
|
||
* - "1024 bytes" == 1024
|
||
* - "what?" == 0
|
||
*
|
||
* @param s - a string
|
||
* @return integer value
|
||
*/
|
||
atoi(s)
|
||
char *s;
|
||
{
|
||
int sign, val;
|
||
|
||
if(*s == '+')
|
||
{
|
||
++s; sign = 1;
|
||
}
|
||
else if(*s == '-')
|
||
{
|
||
++s; sign = -1;
|
||
}
|
||
else
|
||
sign = 1;
|
||
|
||
val=0;
|
||
|
||
while(*s >= '0' && *s <= '9')
|
||
val = val * 10 + (*s++ - '0');
|
||
|
||
return val * sign;
|
||
}
|
||
|
||
#endif
|
||
|
||
|