Mon 14 Oct 23:06:38 CEST 2024
This commit is contained in:
		
							parent
							
								
									0af8964008
								
							
						
					
					
						commit
						72a115d1e3
					
				
							
								
								
									
										132
									
								
								kernel/printf.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								kernel/printf.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,132 @@ | ||||||
|  | /*
 | ||||||
|  | Copyright (C) 2016-2019 The University of Notre Dame | ||||||
|  | This software is distributed under the GNU General Public License. | ||||||
|  | See the file LICENSE for details. | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include "printf.h" | ||||||
|  | #include "string.h" | ||||||
|  | #include "console.h" | ||||||
|  | #include <stdarg.h> | ||||||
|  | 
 | ||||||
|  | static void printf_putchar( char c ) | ||||||
|  | { | ||||||
|  | 	console_putchar(&console_root,c); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | char getchar() | ||||||
|  | { | ||||||
|  | 	return console_getchar(&console_root); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void putchar( char c) | ||||||
|  | { | ||||||
|  | 	return printf_putchar(c); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void printf_putstring(char *s) | ||||||
|  | { | ||||||
|  | 	console_putstring(&console_root,s); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void printf_puthexdigit(uint8_t i) | ||||||
|  | { | ||||||
|  | 	if(i < 10) { | ||||||
|  | 		printf_putchar('0' + i); | ||||||
|  | 	} else { | ||||||
|  | 		printf_putchar('a' + i - 10); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void printf_puthex(uint32_t i) | ||||||
|  | { | ||||||
|  | 	int j; | ||||||
|  | 	for(j = 28; j >= 0; j = j - 4) { | ||||||
|  | 		printf_puthexdigit((i >> j) & 0x0f); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void printf_putint(int32_t i) | ||||||
|  | { | ||||||
|  | 	int f, d; | ||||||
|  | 	if(i < 0 && i != 0) { | ||||||
|  | 		printf_putchar('-'); | ||||||
|  | 		i = -i; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	f = 1; | ||||||
|  | 	while((i / f) >= 10) { | ||||||
|  | 		f *= 10; | ||||||
|  | 	} | ||||||
|  | 	while(f > 0) { | ||||||
|  | 		d = i / f; | ||||||
|  | 		printf_putchar('0' + d); | ||||||
|  | 		i = i - d * f; | ||||||
|  | 		f = f / 10; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void printf_putuint(uint32_t u) | ||||||
|  | { | ||||||
|  | 	int f, d; | ||||||
|  | 	f = 1; | ||||||
|  | 	while((u / f) >= 10) { | ||||||
|  | 		f *= 10; | ||||||
|  | 	} | ||||||
|  | 	while(f > 0) { | ||||||
|  | 		d = u / f; | ||||||
|  | 		printf_putchar('0' + d); | ||||||
|  | 		u = u - d * f; | ||||||
|  | 		f = f / 10; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void printf(const char *s, ...) | ||||||
|  | { | ||||||
|  | 	va_list args; | ||||||
|  | 
 | ||||||
|  | 	uint32_t u; | ||||||
|  | 	int32_t i; | ||||||
|  | 	char *str; | ||||||
|  | 
 | ||||||
|  | 	va_start(args, s); | ||||||
|  | 
 | ||||||
|  | 	while(*s) { | ||||||
|  | 		if(*s != '%') { | ||||||
|  | 			printf_putchar(*s); | ||||||
|  | 		} else { | ||||||
|  | 			s++; | ||||||
|  | 			switch (*s) { | ||||||
|  | 			case 'd': | ||||||
|  | 				i = va_arg(args, int32_t); | ||||||
|  | 				printf_putint(i); | ||||||
|  | 				break; | ||||||
|  | 			case 'u': | ||||||
|  | 				u = va_arg(args, uint32_t); | ||||||
|  | 				printf_putuint(u); | ||||||
|  | 				break; | ||||||
|  | 			case 'x': | ||||||
|  | 				u = va_arg(args, uint32_t); | ||||||
|  | 				printf_puthex(u); | ||||||
|  | 				break; | ||||||
|  | 			case 's': | ||||||
|  | 				str = va_arg(args, char *); | ||||||
|  | 				printf_putstring(str); | ||||||
|  | 				break; | ||||||
|  | 			case 'c': | ||||||
|  | 				u = va_arg(args, int32_t); | ||||||
|  | 				printf_putchar(u); | ||||||
|  | 				break; | ||||||
|  | 			case 0: | ||||||
|  | 				return; | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				printf_putchar(*s); | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		s++; | ||||||
|  | 	} | ||||||
|  | 	va_end(args); | ||||||
|  | } | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user