basekernel/kernel/string.c

232 lines
2.9 KiB
C

/*
Copyright (C) 2015-2019 The University of Notre Dame
This software is distributed under the GNU General Public License.
See the file LICENSE for details.
*/
#include "string.h"
#include "kernel/types.h"
#include "kernel/ascii.h"
#include "kmalloc.h"
#include "stdarg.h"
#include "console.h"
void strcpy(char *d, const char *s)
{
while(*s) {
*d++ = *s++;
}
*d = 0;
}
void strncpy(char *d, const char *s, unsigned length)
{
while(*s && length--) {
*d++ = *s++;
}
*d = 0;
}
int strcmp(const char *a, const char *b)
{
while(1) {
if(*a < *b) {
return -1;
} else if(*a > *b) {
return 1;
} else if(*a == 0) {
return 0;
} else {
a++;
b++;
}
}
}
int strncmp(const char *a, const char *b, unsigned length)
{
while(length > 0) {
if(*a < *b) {
return -1;
} else if(*a > *b) {
return 1;
} else if(*a == 0) {
return 0;
} else {
a++;
b++;
length--;
}
}
return 0;
}
unsigned strlen(const char *s)
{
unsigned len = 0;
while(*s) {
len++;
s++;
}
return len;
}
char *strrev(char *s)
{
unsigned start = 0;
unsigned end = strlen(s) - 1;
char swap;
while(start < end) {
swap = s[start];
s[start] = s[end];
s[end] = swap;
start++;
end--;
}
return s;
}
char *strcat(char *d, const char *s)
{
strcpy(d + strlen(d), s);
return d;
}
const char *strchr(const char *s, char ch)
{
while(*s) {
if(*s == ch)
return s;
s++;
}
return 0;
}
char *strtok(char *s, const char *delim)
{
static char *oldword = 0;
char *word;
if(!s)
s = oldword;
while(*s && strchr(delim, *s))
s++;
if(!*s) {
oldword = s;
return 0;
}
word = s;
while(*s && !strchr(delim, *s))
s++;
if(*s) {
*s = 0;
oldword = s + 1;
} else {
oldword = s;
}
return word;
}
char *strdup(const char *s)
{
char *new = kmalloc(strlen(s) + 1);
if(new)
strcpy(new, s);
return new;
}
char *strndup(const char *s, unsigned length)
{
char *new = kmalloc(length+1);
if(new) {
strncpy(new,s,length);
new[length] = 0;
}
return new;
}
void strtoupper(char *name)
{
while(*name) {
if(*name >= 'a' && *name <= 'z') {
*name -= 'a' - 'A';
}
name++;
}
}
void strtolower(char *name)
{
while(*name) {
if(*name >= 'A' && *name <= 'Z') {
*name += 'a' - 'A';
}
name++;
}
}
int str2int(const char *s, int *d)
{
int val = 0;
for(; *s; ++s) {
val *= 10;
if(*s > ASCII_9 || *s < ASCII_0) {
return 0;
}
val += (*s - '0');
}
*d = val;
return 1;
}
void memset(void *vd, char value, unsigned length)
{
char *d = vd;
while(length) {
*d = value;
length--;
d++;
}
}
void memcpy(void *vd, const void *vs, unsigned length)
{
char *d = vd;
const char *s = vs;
while(length) {
*d = *s;
d++;
s++;
length--;
}
}
char *uint_to_string(uint32_t u, char *s)
{
uint32_t f, d, i;
f = 1;
i = 0;
while((u / (f * 10)) > 0) {
f *= 10;
}
while(f > 0) {
d = u / f;
s[i] = '0' + d;
u = u % f;
f = f / 10;
i++;
}
s[i] = 0;
return s;
}