mirror of
				https://github.com/gbowne1/ClassicOS.git
				synced 2025-10-26 10:15:06 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "string_utils.h"
 | |
| #include <stddef.h>
 | |
| #include <stdarg.h>
 | |
| 
 | |
| size_t my_strlen(const char *str) {
 | |
|     const char *s = str;
 | |
|     while (*s) s++;
 | |
|     return s - str;
 | |
| }
 | |
| 
 | |
| // Forward declaration of my_itoa
 | |
| static size_t my_itoa(int value, char *str, size_t size);
 | |
| 
 | |
| int my_vsnprintf(char *str, size_t size, const char *format, ...) {
 | |
|     va_list args;
 | |
|     va_start(args, format);
 | |
|     size_t written = 0; // Change to size_t
 | |
| 
 | |
|     for (const char *p = format; *p != '\0' && written < size - 1; p++) {
 | |
|         if (*p == '%') {
 | |
|             p++;
 | |
|             if (*p == 's') {
 | |
|                 const char *s = va_arg(args, const char *);
 | |
|                 while (*s && written < size - 1) {
 | |
|                     str[written++] = *s++;
 | |
|                 }
 | |
|             } else if (*p == 'd') {
 | |
|                 // Handle integer formatting
 | |
|                 written += my_itoa(va_arg(args, int), str + written, size - written);
 | |
|             } else {
 | |
|                 // Handle other formats as needed
 | |
|                 str[written++] = *p; // Just copy the character
 | |
|             }
 | |
|         } else {
 | |
|             str[written++] = *p;
 | |
|         }
 | |
|     }
 | |
|     str[written] = '\0'; // Null-terminate the string
 | |
|     va_end(args);
 | |
|     return written;
 | |
| }
 | |
| 
 | |
| static size_t my_itoa(int value, char *str, size_t size) {
 | |
|     size_t written = 0; // Change to size_t
 | |
|     if (value < 0) {
 | |
|         if (written < size - 1) {
 | |
|             str[written++] = '-';
 | |
|         }
 | |
|         value = -value;
 | |
|     }
 | |
|     // Convert integer to string
 | |
|     int temp = value;
 | |
|     int digits = 0;
 | |
|     do {
 | |
|         digits++;
 | |
|         temp /= 10;
 | |
|     } while (temp);
 | |
|     
 | |
|     if (written + digits >= size) {
 | |
|         digits = size - written - 1; // Prevent overflow
 | |
|     }
 | |
|     
 | |
|     str += written + digits; // Move pointer to the end
 | |
|     *str-- = '\0'; // Null-terminate the string
 | |
| 
 | |
|     do {
 | |
|         *str-- = (value % 10) + '0';
 | |
|         value /= 10;
 | |
|     } while (value && str >= str - digits);
 | |
|     
 | |
|     return written + digits; // Return total written characters
 | |
| }
 | |
| 
 | |
| int my_strcmp(const char *str1, const char *str2) {
 | |
|     while (*str1 && (*str1 == *str2)) {
 | |
|         str1++;
 | |
|         str2++;
 | |
|     }
 | |
|     return *(unsigned char *)str1 - *(unsigned char *)str2;
 | |
| } |