mirror of
https://github.com/gbowne1/ClassicOS.git
synced 2025-10-13 21:25:07 -07:00
mostly improvements to malloc
This commit is contained in:
80
kernel/string_utils.c
Normal file
80
kernel/string_utils.c
Normal file
@@ -0,0 +1,80 @@
|
||||
#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;
|
||||
}
|
Reference in New Issue
Block a user