From 06c888a429d1c7be576e2a77499d2399465c50d6 Mon Sep 17 00:00:00 2001 From: acevest Date: Mon, 26 Jan 2026 17:38:31 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96vsprintf=E7=9A=84=E4=BB=A3?= =?utf8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- include/stdio.h | 3 ++- include/types.h | 5 +++-- kernel/printk.c | 2 +- lib/vsprintf.c | 26 ++++++++++---------------- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/include/stdio.h b/include/stdio.h index 20c6552..78b56a3 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -18,8 +18,9 @@ #define _STDIO_H #include #include +#include extern int write(int fd, const char* buf, unsigned long size); -extern int vsprintf(char* buf, const char* fmt, char* args); +extern int vsprintf(char* buf, const char* fmt, va_list args); static inline int printf(const char* fmt, ...) { char ptfbuf[512]; char* args = (char*)(((char*)&fmt) + 4); diff --git a/include/types.h b/include/types.h index 069c70f..7ebcc74 100644 --- a/include/types.h +++ b/include/types.h @@ -72,9 +72,10 @@ typedef enum { false, true } bool; typedef void (*pf_intr)(); // +#define INTSIZEOF(n) ((sizeof(n) + sizeof(uint32_t) - 1) & (~(sizeof(uint32_t) - 1))) typedef char* va_list; -#define va_start(ap, last) ((ap) = (va_list) & (last) + sizeof(last)) -#define va_arg(ap, type) (*(type*)(((ap) += sizeof(type)) - sizeof(type))) +#define va_start(ap, last) ((ap) = (va_list) & (last) + INTSIZEOF(last)) +#define va_arg(ap, type) (*(type*)(((ap) += INTSIZEOF(type)) - INTSIZEOF(type))) #define va_end(ap) ((ap) = (va_list)0) #endif //_TYPES_H diff --git a/kernel/printk.c b/kernel/printk.c index ef1a57d..663bbfa 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -19,7 +19,7 @@ #include #include -int vsprintf(char* buf, const char* fmt, char* args); +int vsprintf(char* buf, const char* fmt, va_list args); void serial_write(const char* buf, size_t size); diff --git a/lib/vsprintf.c b/lib/vsprintf.c index b15c672..58b1769 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -44,7 +44,7 @@ int write_buf(char* buf, const char* str, char fillch, int charcnt, int align) { return charcnt > len ? charcnt : len; } -int vsprintf(char* buf, const char* fmt, char* args) { +int vsprintf(char* buf, const char* fmt, va_list args) { char* p = buf; int char_cnt; char tmp[64]; @@ -79,50 +79,44 @@ int vsprintf(char* buf, const char* fmt, char* args) { switch (*fmt) { case 'c': - *p++ = *args; + *p++ = va_arg(args, char); break; case 'd': - itoa(tmp, *((int*)args)); + itoa(tmp, va_arg(args, int)); p += write_buf(p, tmp, char_fill, char_cnt, align); break; case 'l': fmt++; if (*fmt == 'u' || *fmt == 'd') { // d u都当成u来处理 - i64tou(tmp, *((int64_t*)args)); + i64tou(tmp, va_arg(args, uint64_t)); p += write_buf(p, tmp, char_fill, char_cnt, align); - args += 4; } else if (*fmt == 'o') { - i64too(tmp, *((uint64_t*)args)); + i64too(tmp, va_arg(args, uint64_t)); p += write_buf(p, tmp, char_fill, char_cnt, align); - args += 4; } else if (*fmt == 'x' || *fmt == 'X') { - // i64tox(tmp, *((uint64_t *)args), *fmt == 'X' ? 1 : 0); - i64tox(tmp, *((uint64_t*)args), 1); // x X都强制为大写 + i64tox(tmp, va_arg(args, uint64_t), 1); // x X都强制为大写 p += write_buf(p, tmp, char_fill, char_cnt, align); - args += 4; } break; case 's': - p += write_buf(p, (const char*)*((unsigned int*)args), char_fill, char_cnt, align); + p += write_buf(p, (const char*)va_arg(args, char*), char_fill, char_cnt, align); break; case 'u': - itou(tmp, *((unsigned int*)args)); + itou(tmp, va_arg(args, uint32_t)); p += write_buf(p, tmp, char_fill, char_cnt, align); break; case 'x': case 'X': - // itox(tmp, *((unsigned int *)args), *fmt == 'X' ? 1 : 0); - itox(tmp, *((unsigned int*)args), 1); // x X都强制为大写 + itox(tmp, va_arg(args, uint32_t), 1); // x X都强制为大写 p += write_buf(p, tmp, char_fill, char_cnt, align); break; case 'o': - itoo(tmp, *((unsigned*)args)); + itoo(tmp, va_arg(args, uint32_t)); p += write_buf(p, tmp, char_fill, char_cnt, align); break; default: break; } - args += 4; fmt++; } *p = 0; -- 2.47.0