feat: some extensions to kernel standard c library. Other minor

improvements and formats
This commit is contained in:
2021-03-26 19:57:07 +01:00
parent 20ab9e1d6e
commit f120b104e5
10 changed files with 221 additions and 19 deletions

View File

@@ -33,28 +33,51 @@ void print_int(uint32_t value, uint32_t width, char *buf, uint32_t *ptr, uint8_t
}
}
void vasprintf_unsupported(char c) {
char *msg = "FMT '%x' is not supported\n";
msg[6] = c;
k_panics(msg);
}
uint32_t vasprintf(char *buf, const char *fmt, va_list args) {
uint32_t ptr = 0;
for (int i = 0; i < strlen(fmt); ++i) {
for (size_t i = 0; i < strlen(fmt); ++i) {
if (fmt[i] != '%') {
buf[ptr++] = fmt[i];
continue;
}
++i;
uint32_t arg_width = 0;
while (fmt[i] >= '0' && fmt[i] <= '9') {
arg_width *= 10;
arg_width += fmt[i] - '0';
uint32_t field_width = 0;
uint32_t precision = 0; // todo
bool negative_field_width = false; // todo
if (fmt[i] == '-') {
// invert
negative_field_width = true;
++i;
}
while (fmt[i] >= '0' && fmt[i] <= '9') {
field_width *= 10;
field_width += fmt[i] - '0';
++i;
}
if (fmt[i] == '.') {
++i;
while (fmt[i] >= '0' && fmt[i] <= '9') {
precision *= 10;
precision += fmt[i] - '0';
++i;
}
}
switch (fmt[i]) {
case 's': { // string
uint32_t j = 0;
const char *s_fmt = (char *) va_arg(args, char*);
if (s_fmt == NULL) {
s_fmt = printf_null_str;
}
while (*s_fmt) {
while (*s_fmt && (precision == 0 || j != precision)) {
buf[ptr++] = *s_fmt++;
j++;
}
break;
}
@@ -62,18 +85,19 @@ uint32_t vasprintf(char *buf, const char *fmt, va_list args) {
buf[ptr++] = (char) va_arg(args, int);
break;
case 'x':
print_int((uint32_t) va_arg(args, uint32_t), arg_width, buf, &ptr, 16);
case 'X': // todo capitalize
print_int((uint32_t) va_arg(args, uint32_t), field_width, buf, &ptr, 16);
break;
case 'i':
case 'd':
print_int((uint32_t) va_arg(args, uint32_t), arg_width, buf, &ptr, 10);
case 'u':
print_int((uint32_t) va_arg(args, uint32_t), field_width, buf, &ptr, 10);
break;
case '%':
buf[ptr++] = '%';
break;
default:
printf("FMT '%c' is not supported\n", fmt[i]);
k_panic();
vasprintf_unsupported(fmt[i]);
break;
}
}
@@ -81,14 +105,20 @@ uint32_t vasprintf(char *buf, const char *fmt, va_list args) {
return ptr;
}
int printf(const char *fmt, ...) {
int vprintf(const char *fmt, va_list args) {
int result;
char buf[1024] = {-1};
result = vasprintf(buf, fmt, args);
kprint(buf);
return result;
}
int printf(const char *fmt, ...) {
int result;
va_list args;
va_start(args, fmt);
result = vasprintf(buf, fmt, args);
result = vprintf(fmt, args);
va_end(args);
kprint(buf);
return result;
}