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
|
|||
|
|
|||
|
|