Files
mckernel/lib/string.c
Masamichi Takagi 2f89e26ac0 add modification history entry to the following files,
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
.
2013-11-14 18:30:06 +09:00

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;
}