#include "lib.h"
extern "C" unsigned strlen( const char *src )
{
unsigned cnt = 0;
while( src && src[cnt] )
cnt++;
return cnt;
}
extern "C" void strcpy( char *dst, const char *src )
{
unsigned cnt = 0;
if( !dst || !src )
return;
do {
dst[cnt] = src[cnt];
} while( src[cnt++] );
}
@param
@param
@param
extern "C" void memcopy(L4_Word_t dst, L4_Word_t src, L4_Word_t len)
{
L4_Word8_t* s = (L4_Word8_t*) src;
L4_Word8_t* d = (L4_Word8_t*) dst;
while (len--)
*d++ = *s++;
}
@param
@param
@param
extern "C" void memset(L4_Word_t dst, L4_Word8_t val, L4_Word_t len)
{
L4_Word8_t* d = (L4_Word8_t*) dst;
while (len--)
*d++ = val;
}
#define isspace(c) ((c == ' ') || (c == '\t'))
#define ULONG_MAX (~0UL)
#define isdigit(c) ((c) >= '0' && (c) <= '9')
#define islower(c) (((c) >= 'a') && ((c) <= 'z'))
#define isupper(c) (((c) >= 'A') && ((c) <= 'Z'))
#define isalpha(c) (islower(c) || isupper(c))
extern "C" int
strcmp(const char *s1, const char *s2)
{
while (*s1 == *s2++)
if (*s1++ == 0)
return (0);
return (*(unsigned char *)s1 - *(unsigned char *)--s2);
}
extern "C" int
strncmp(const char *s1, const char *s2, unsigned int n)
{
if (n == 0)
return (0);
do {
if (*s1 != *s2++)
return (*(unsigned char *)s1 - *(unsigned char *)--s2);
if (*s1++ == 0)
break;
} while (--n != 0);
return (0);
}
extern "C" char *
strstr(const char *s, const char *find)
{
char c, sc;
int len;
if ((c = *find++) != 0) {
len = strlen(find);
do {
do {
if ((sc = *s++) == 0)
return (0);
} while (sc != c);
} while (strncmp(s, find, len) != 0);
s--;
}
return ((char *)s);
}
extern "C" unsigned long
strtoul(const char* nptr, char** endptr, int base)
{
const char *s;
unsigned long acc, cutoff;
int c;
int neg, any, cutlim;
s = nptr;
do {
c = (unsigned char) *s++;
} while (isspace(c));
if (c == '-') {
neg = 1;
c = *s++;
} else {
neg = 0;
if (c == '+')
c = *s++;
}
if ((base == 0 || base == 16) &&
c == '0' && (*s == 'x' || *s == 'X')) {
c = s[1];
s += 2;
base = 16;
}
if (base == 0)
base = c == '0' ? 8 : 10;
cutoff = ULONG_MAX / (unsigned long)base;
cutlim = ULONG_MAX % (unsigned long)base;
for (acc = 0, any = 0;; c = (unsigned char) *s++) {
if (isdigit(c))
c -= '0';
else if (isalpha(c))
c -= isupper(c) ? 'A' - 10 : 'a' - 10;
else
break;
if (c >= base)
break;
if (any < 0)
continue;
if (acc > cutoff || acc == cutoff && c > cutlim) {
any = -1;
acc = ULONG_MAX;
} else {
any = 1;
acc *= (unsigned long)base;
acc += c;
}
}
if (neg && any > 0)
acc = -acc;
if (endptr != 0)
*endptr = (char *) (any ? s - 1 : nptr);
return (acc);
}
extern "C" char *
strchr(const char *p, int ch)
{
for (;; ++p) {
if (*p == ch) {
return((char *)p);
}
if (!*p)
return((char *)0);
}
}