mckernel/lib/include/*.h mckernel/arch/x86/elfboot/* mckernel/arch/x86/kboot/main.c mckernel/arch/x86/kernel/* mckernel/lib/page_alloc.c mckernel/lib/string.c mckernel/lib/include/ihk/* except mckernel/arch/x86/kernel/include/signal.h mckernel/arch/x86/tools/mcreboot-attached-mic.sh.in mckernel/arch/x86/kernel/include/syscall_list.h mckernel/arch/x86/kernel/syscall.c .
171 lines
2.5 KiB
C
171 lines
2.5 KiB
C
/**
|
|
* \file page_alloc.c
|
|
* License details are found in the file LICENSE.
|
|
* \brief
|
|
* Manipulate strings.
|
|
* \author Taku Shimosawa <shimosawa@is.s.u-tokyo.ac.jp> \par
|
|
* Copyright (C) 2011 - 2012 Taku Shimosawa
|
|
*/
|
|
/*
|
|
* HISTORY
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
size_t strlen(const char *p)
|
|
{
|
|
const char *head = p;
|
|
|
|
while(*p){
|
|
p++;
|
|
}
|
|
|
|
return p - head;
|
|
}
|
|
|
|
size_t strnlen(const char *p, size_t maxlen)
|
|
{
|
|
const char *head = p;
|
|
|
|
while(*p && maxlen > 0){
|
|
p++;
|
|
maxlen--;
|
|
}
|
|
|
|
return p - head;
|
|
}
|
|
|
|
char *strcpy(char *dest, const char *src)
|
|
{
|
|
char *head = dest;
|
|
|
|
while((*(dest++) = *(src++)));
|
|
|
|
return head;
|
|
}
|
|
|
|
char *strncpy(char *dest, const char *src, size_t maxlen)
|
|
{
|
|
char *head = dest;
|
|
ssize_t len = maxlen;
|
|
|
|
while((*(dest++) = *(src++)) && --len);
|
|
if(len > 0){
|
|
while(len--){
|
|
*(dest++) = '\0';
|
|
}
|
|
}
|
|
|
|
return head;
|
|
}
|
|
|
|
int strcmp(const char *s1, const char *s2)
|
|
{
|
|
while(*s1 && *s1 == *s2){
|
|
s1++;
|
|
s2++;
|
|
}
|
|
|
|
return *s1 - *s2;
|
|
}
|
|
|
|
int strncmp(const char *s1, const char *s2, size_t n)
|
|
{
|
|
while(*s1 && *s1 == *s2 && n > 1){
|
|
s1++;
|
|
s2++;
|
|
n--;
|
|
}
|
|
return *s1 - *s2;
|
|
}
|
|
|
|
char *strstr(const char *haystack, const char *needle)
|
|
{
|
|
int len = strlen(needle);
|
|
|
|
while(*haystack){
|
|
if(!strncmp(haystack, needle, len)){
|
|
return (char *)haystack;
|
|
}
|
|
haystack++;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void *memcpy(void *dest, const void *src, size_t n)
|
|
{
|
|
const char *p1 = src;
|
|
char *p2 = dest;
|
|
|
|
while(n > 0){
|
|
*p2 = *p1;
|
|
p1++;
|
|
p2++;
|
|
n--;
|
|
}
|
|
|
|
return dest;
|
|
}
|
|
|
|
void *memcpy_long(void *dest, const void *src, size_t n)
|
|
{
|
|
const unsigned long *p1 = src;
|
|
unsigned long *p2 = dest;
|
|
|
|
n /= sizeof(unsigned long);
|
|
while (n > 0) {
|
|
*(p2++) = *(p1++);
|
|
n--;
|
|
}
|
|
|
|
return dest;
|
|
}
|
|
|
|
void *memset(void *s, int c, size_t n)
|
|
{
|
|
char *s_aligned = (void *)(((unsigned long)s + 7) & ~7);
|
|
char *e_aligned = (void *)(((unsigned long)s + n) & ~7);
|
|
char *e = ((char *)s + n);
|
|
char *p;
|
|
unsigned long *l;
|
|
#define C ((unsigned long)(c & 0xff))
|
|
unsigned long pat = C | C << 8 | C << 16 | C << 24 | C << 32 |
|
|
C << 40 | C << 48 | C << 56;
|
|
#undef C
|
|
|
|
if(s_aligned < e_aligned){
|
|
p = s;
|
|
while(p < s_aligned){
|
|
*(p++) = (char)c;
|
|
}
|
|
l = (unsigned long *)s_aligned;
|
|
while((char *)l < e_aligned){
|
|
*(l++) = pat;
|
|
}
|
|
p = e_aligned;
|
|
while(p < e){
|
|
*(p++) = (char)c;
|
|
}
|
|
}else{
|
|
p = s;
|
|
while(p < e){
|
|
*(p++) = (char)c;
|
|
}
|
|
}
|
|
|
|
return s;
|
|
}
|
|
|
|
int memcmp(const void *s1, const void *s2, size_t n)
|
|
{
|
|
const char *p1 = s1;
|
|
const char *p2 = s2;
|
|
|
|
while(*p1 == *p2 && n > 1){
|
|
p1++;
|
|
p2++;
|
|
n--;
|
|
}
|
|
return *p1 - *p2;
|
|
}
|