Mon 14 Oct 23:06:38 CEST 2024
This commit is contained in:
		
							parent
							
								
									9962309a90
								
							
						
					
					
						commit
						287a623976
					
				
							
								
								
									
										231
									
								
								kernel/string.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										231
									
								
								kernel/string.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,231 @@ | ||||||
|  | /*
 | ||||||
|  | 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; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user