kolibrios/programs/develop/libraries/framework/trunk/stdlib/stdlib.c

71 lines
2.4 KiB
C
Raw Permalink Normal View History

/***************************************************************************************************
* Copyright (C) Vasiliy Kosenko (vkos), 2009 *
* Kobra is free software: you can redistribute it and/or modify it under the terms of the GNU *
* General Public License as published by the Free Software Foundation, either version 3 *
* of the License, or (at your option) any later version. *
* *
* Kobra is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without *
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License along with Kobra. *
* If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************************************/
/***************************************************************************************************
* Some stdlib functions *
***************************************************************************************************/
#include "stdlib.h"
void *memcpy(void *dst, void *src, int length){
void *value;
if (length & 3) { //length not aligned in 4 bytes use rep movsb
__asm__ __volatile__(
"movl %%edi,%%eax\n\t"
"cld\n\t"
"rep\n\t"
"movsb"
:"=D"(value)
:"c"(length),"S"(src),"D"(dst)
:"eax");
} else { //length aligned in 4 bytes use rep movsd
length=length >> 2;//length=length/4
__asm__ __volatile__(
"movl %%edi,%%eax\n\t"
"cld\n\t"
"rep\n\t"
"movsd"
:"=D"(value)
:"c"(length),"S"(src),"D"(dst)
:"eax");
}
return(value);
}
char strcmp(char *s1, char *s2){
while (*s1) {
if (*s1++ != *s2++) {
return *--s1-*--s2;
}
}
return 0;
}
int strlen(char *s){
int i;
while (*s++) {
++i;
}
return i;
}
char *strcpy(char *dest, char *src){
while (*src) {
*dest++ = *src++;
}
*dest = '\0';
}