oscar64/include/string.c

184 lines
2.0 KiB
C

#include "string.h"
#if 1
char * strcpy(char * dst, const char * src)
{
__asm
{
ldy #dst
lda (fp), y
sta $1f
iny
lda (fp), y
sta $20
ldy #src
lda (fp), y
sta $1b
iny
lda (fp), y
sta $1c
ldy #0
L1: lda ($1b), y
sta ($1f), y
beq W1
iny
bne L1
inc $1c
inc $20
bne L1
W1:
rts
}
}
#else
char * strcpy(char * dst, const char * src)
{
char * d = dst;
const char * s = src;
do {} while (*d++ = *s++);
return dst;
}
#endif
int strcmp(const char * ptr1, const char * ptr2)
{
const char * p = ptr1, * q = ptr2;
char c, d;
while ((c = *p++) == (d = *q++))
{
if (!c)
return 0;
}
if (c < d)
return -1;
else
return 1;
}
int strlen(const char * str)
{
const char * s = str;
int i = 0;
while (s[i])
i++;
return i;
}
char * strcat(char * dst, const char * src)
{
char * d = dst;
const char * s = src;
while (*d)
d++;
do {} while (*d++ = *s++);
return dst;
}
void * memset(void * dst, int value, int size)
{
__asm
{
ldy #dst
lda (fp), y
sta $1f
iny
lda (fp), y
sta $20
ldy #size
lda (fp), y
sta $1b
iny
lda (fp), y
sta $1c
ldy #value
lda (fp), y
ldx $1c
beq _w1
ldy #0
_loop1:
sta ($1f), y
iny
bne _loop1
inc $20
dex
bne _loop1
_w1:
ldy $1b
beq _w2
_loop2:
dey
sta ($1f), y
bne _loop2
_w2:
}
return dst;
}
void * memclr(void * dst, int size)
{
char * d = dst;
while (size--)
*d++ = 0;
return dst;
}
void * memcpy(void * dst, const void * src, int size)
{
char * d = dst, * s = src;
while (size--)
*d++ = *s++;
return dst;
}
void * memmove(void * dst, const void * src, int size)
{
char * d = dst, * s = src;
if (d < s)
{
while (size--)
*d++ = *s++;
}
else if (d > s)
{
d += size;
s += size;
while (size--)
*--d = *--s;
}
return dst;
}
int memcmp(const void * ptr1, const void * ptr2, int size)
{
char * p = ptr1, * q = ptr2;
char c, d;
while (size--)
{
c = *p++;
d = *q++;
if (c < d)
return -1;
else if (c > d)
return 1;
}
return 0;
}