90 lines
1.8 KiB
C
90 lines
1.8 KiB
C
#include "klibc.h"
|
|
|
|
void *memcpy(void *dst, const void *src, size_t n)
|
|
{
|
|
char *dstChar = dst;
|
|
const char *srcChar = src;
|
|
for (size_t i = 0; i < n; i++) {
|
|
*(dstChar++) = *(srcChar++);
|
|
}
|
|
return dst;
|
|
}
|
|
|
|
void *memset(void *src, int c, size_t n)
|
|
{
|
|
for (char *ptr = (char *)src; n > 0; n--, ptr++) {
|
|
*ptr = (char)c;
|
|
}
|
|
return src;
|
|
}
|
|
|
|
char * itoa( int value, char * str, int base )
|
|
{
|
|
char * rc;
|
|
char * ptr;
|
|
char * low;
|
|
// Check for supported base.
|
|
if ( base < 2 || base > 36 )
|
|
{
|
|
*str = '\0';
|
|
return str;
|
|
}
|
|
rc = ptr = str;
|
|
// Set '-' for negative decimals.
|
|
if ( value < 0 && base == 10 )
|
|
{
|
|
*ptr++ = '-';
|
|
}
|
|
// Remember where the numbers start.
|
|
low = ptr;
|
|
// The actual conversion.
|
|
do
|
|
{
|
|
// Modulo is negative for negative value. This trick makes abs() unnecessary.
|
|
*ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + value % base];
|
|
value /= base;
|
|
} while ( value );
|
|
// Terminating the string.
|
|
*ptr-- = '\0';
|
|
// Invert the numbers.
|
|
while ( low < ptr )
|
|
{
|
|
char tmp = *low;
|
|
*low++ = *ptr;
|
|
*ptr-- = tmp;
|
|
}
|
|
return rc;
|
|
}
|
|
|
|
/* K&R */
|
|
void reverse(char s[])
|
|
{
|
|
int c, i, j;
|
|
for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
|
|
c = s[i];
|
|
s[i] = s[j];
|
|
s[j] = c;
|
|
}
|
|
}
|
|
|
|
/* K&R */
|
|
int strlen(char s[])
|
|
{
|
|
int i = 0;
|
|
while (s[i] != '\0')
|
|
++i;
|
|
return i;
|
|
}
|
|
|
|
/* K&R
|
|
* Returns <0 if s1<s2, 0 if s1==s2, >0 if s1>s2 */
|
|
int strcmp(char s1[], char s2[])
|
|
{
|
|
int i;
|
|
for (i = 0; s1[i] == s2[i]; i++) {
|
|
if (s1[i] == '\0')
|
|
return 0;
|
|
}
|
|
return s1[i] - s2[i];
|
|
}
|