232 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			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;
 | |
| }
 |