7 #include "lib/stdlib.h"
9 size_t measure_vsprintf(
const char *format,
va_list args) {
11 qemu_log(
"Format is nullptr!");
15 char* fmt = (
char*)format;
21 bool left_align =
false;
23 bool is_precision =
false;
38 while(isdigit(*fmt)) {
39 width = width * 10 + (*fmt -
'0');
44 width = va_arg(args,
int);
50 char* arg = va_arg(args,
char*);
51 arg = arg ? arg :
"(nullptr)";
60 int space = (int)width - length;
70 (void)va_arg(args,
int);
77 double a = va_arg(args,
double);
89 if(a == NAN || a == INFINITY) {
94 size_t prec = is_precision ? width : 5;
96 size += digit_count((
int)a) + 1 + prec;
102 int num = va_arg(args,
int);
109 int space = width - digit_count(num);
112 size += digit_count(num);
119 size += digit_count(num);
124 unsigned int num = va_arg(args,
unsigned int);
125 int space = width - digit_count((
int)num);
131 size += digit_count(num);
135 int num = va_arg(args,
int);
136 int space = width - hex_count(num) - 2;
142 size += hex_count(num) + 2;
147 int num = va_arg(args,
int);
148 int space = width - hex_count(num);
151 size += hex_count(num);
158 size += hex_count(num);
176 int vsprintf(
char* buffer,
const char *format,
va_list args) {
177 char* fmt = (
char*)format;
178 size_t size = measure_vsprintf(format, args);
185 bool left_align =
false;
186 bool is_precision =
false;
187 bool zero_padding =
false;
206 while(isdigit(*fmt)) {
207 width = width * 10 + (*fmt -
'0');
212 width = va_arg(args,
int);
218 char* arg = va_arg(args,
char*);
219 arg = arg ? arg :
"(nullptr)";
221 size_t length =
strlen(arg);
222 int space = (int)width - (
int)length;
224 if(!is_precision && left_align) {
225 memcpy(buffer, arg, length);
237 if(!is_precision && !left_align) {
238 memcpy(buffer, arg, length);
244 for(
int i = 0; *arg !=
'\0' && i < width; i++) {
253 *buffer++ = (char)va_arg(args,
int);
260 double a = va_arg(args,
double);
262 memcpy(buffer,
"0.00000", 7);
290 double floatpart = modf(a, &intpart);
292 itoa((
int)intpart, buffer);
294 buffer += digit_count((
int)intpart);
298 size_t prec = is_precision ? width : 5;
300 for(
int i = 0; i < prec; i++) {
301 *buffer++ =
'0' + (char)((
int)(floatpart * pow(10.0, i + 1)) % 10);
310 int num = va_arg(args,
int);
317 int space = width - digit_count(num);
322 buffer += digit_count(num);
337 buffer += digit_count(num);
343 unsigned int num = va_arg(args,
unsigned int);
344 int space = width - digit_count((
size_t)num);
348 buffer += digit_count((
size_t)num);
362 buffer += digit_count((
size_t)num);
371 unsigned int num = va_arg(args,
unsigned int);
372 int space = (int)width - hex_count(num) - 2;
380 buffer += hex_count(num);
398 buffer += hex_count(num);
406 int num = va_arg(args,
int);
407 int space = width - hex_count(num);
412 buffer += hex_count(num);
427 buffer += hex_count(num);
440 return (
int)size - 1;
443 size_t measure_sprintf(
const char* format, ...) {
445 va_start(args, format);
447 size_t size = measure_vsprintf(format, args);
454 int sprintf(
char* buffer,
const char* format, ...) {
456 va_start(args, format);
458 size_t size = (int)(measure_vsprintf(format, args)) - 1;
460 vsprintf(buffer, format, args);
467 int vasprintf(
char** buffer,
const char* format,
va_list args) {
468 size_t size = measure_vsprintf(format, args);
470 *buffer = kcalloc(size, 1);
472 vsprintf(*buffer, format, args);
474 return (
int)size - 1;
477 int asprintf(
char** buffer,
const char* format, ...) {
479 va_start(args, format);
481 vasprintf(buffer, format, args);
483 size_t size = measure_vsprintf(format, args) - 1;
490 int vsnprintf(
char* buffer,
size_t n,
const char* format,
va_list args) {
491 size_t size = measure_vsprintf(format, args);
493 if(buffer == 0 || n == 0) {
497 char* temp = kcalloc(size + 1, 1);
499 vsprintf(temp, format, args);
501 memcpy(buffer, temp, (size > n ? n : size) - 1);
508 int snprintf(
char* buffer,
size_t n,
const char* format, ...) {
510 va_start(args, format);
512 size_t res = vsnprintf(buffer, n, format, args);
Основные определения ядра
bool fpu_isInitialized()
Возвращает статус FPU.
size_t strlen(const char *str)
Возращает длину строки
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
size_t itoa(int32_t n, char *buffer)
Конвертируем число в символы