kprint.h without variadic functions

This commit is contained in:
Timerix22 2022-09-06 15:17:58 +06:00
parent 21b20e5e14
commit 55ab45eb56

View File

@ -8,43 +8,67 @@ extern "C" {
#include "kprint_colors.h"
#include "kprint_format.h"
#define __count_va_args(\
#define __count_args(\
a0, a1, a2, a3, a4, a5, a6, a7,\
a8, a9, a10,a11,a12,a13,a14,a15,\
a16,a17,a18,a19,a20,a21,a22,a23,\
a24,a25,a26,a27,a28,a29,a30,a31,\
a32) a32
#define count_va_args(ARGS...) __count_va_args(\
#define count_args(ARGS...) __count_args(\
ARGS,\
32,31,30,29,28,27,26,25,\
24,23,22,21,20,19,18,17,\
16,15,14,13,12,11,10,9,\
8, 7, 6, 5, 4, 3, 2, 1, 0)
#define __get_va_args_sizes(\
#define __kprint_argsToFormats8(\
a0, a1, a2, a3, a4, a5, a6, a7)\
(kprint_format[]{ a0,a2,a4,a6 })
#define __kprint_argsToObjects8(\
a0, a1, a2, a3, a4, a5, a6, a7)\
(void*[]{ a1,a3,a5,a7 })
#define __kprint_argsToFormats16(\
a0, a1, a2, a3, a4, a5, a6, a7,\
a8, a9, a10,a11,a12,a13,a14,a15)\
(kprint_format[]{ a0,a2,a4,a6,a8,a10,a12,a14 })
#define __kprint_argsToObjects16(\
a0, a1, a2, a3, a4, a5, a6, a7,\
a8, a9, a10,a11,a12,a13,a14,a15)\
(void*[]{ a1,a3,a5,a7,a9,a11,a13,a15 })
#define __kprint_argsToFormats32(\
a0, a1, a2, a3, a4, a5, a6, a7,\
a8, a9, a10,a11,a12,a13,a14,a15,\
a16,a17,a18,a19,a20,a21,a22,a23,\
a24,a25,a26,a27,a28,a29,a30,a31)\
(uint16[]{\
sizeof(a0), sizeof(a1), sizeof(a2), sizeof(a3), sizeof(a4), sizeof(a5), sizeof(a6), sizeof(a7),\
sizeof(a8), sizeof(a9), sizeof(a10),sizeof(a11),sizeof(a12),sizeof(a13),sizeof(a14),sizeof(a15),\
sizeof(a16),sizeof(a17),sizeof(a18),sizeof(a19),sizeof(a20),sizeof(a21),sizeof(a22),sizeof(a23),\
sizeof(a24),sizeof(a25),sizeof(a26),sizeof(a27),sizeof(a28),sizeof(a29),sizeof(a30),sizeof(a31)\
})
#define get_va_args_sizes(ARGS...) __get_va_args_sizes(ARGS,\
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
(kprint_format[]{ a0,a2,a4,a6,a8,a10,a12,a14,a16,a18,a20,a22,a24,a26,a28,a30 }
#define __kprint_argsToObjects32(\
a0, a1, a2, a3, a4, a5, a6, a7,\
a8, a9, a10,a11,a12,a13,a14,a15,\
a16,a17,a18,a19,a20,a21,a22,a23,\
a24,a25,a26,a27,a28,a29,a30,a31)\
(void*[]{ a1,a3,a5,a7,a9,a11,a13,a15,a17,a19,a21,a23,a25,a27,a29,a31 })
#define __32zeroes 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
#define __kprint_argsToArrs(COUNT,ARGS...)(\
(COUNT<=8 __kprint_argsToFormats8(ARGS,__32zeroes) :\
COUNT<=16 __kprint_argsToFormats16(ARGS,__32zeroes) :\
__kprint_argsToFormats32(ARGS,__32zeroes)),\
(COUNT<=8 __kprint_argsToObjects8(ARGS,__32zeroes) :\
COUNT<=16 __kprint_argsToObjects16(ARGS) :\
__kprint_argsToObjects32(ARGS,__32zeroes))
Maybe __ksprint(uint8 n, uint16 sizes[32], ...);
#define ksprint(ARGS...) __ksprint(count_va_args(ARGS), get_va_args_sizes(ARGS), ARGS)
Maybe __ksprint(uint8 n, kprint_format* formats, void** objects);
#define ksprint(ARGS...) __ksprint(count_args(ARGS), __kprint_argsToArrs(count_args(ARGS),ARGS))
Maybe __kfprint(FILE* fd, uint8 n, uint16 sizes[32], ...);
#define kfprint(FD, ARGS...) __kfprint(FD, count_va_args(ARGS), get_va_args_sizes(ARGS), ARGS)
Maybe __kfprint(FILE* fd, uint8 n, kprint_format* formats, void** objects);
#define kfprint(FD, ARGS...) __kfprint(FD, count_args(ARGS), __kprint_argsToArrs(count_args(ARGS),ARGS))
void __kprint(uint8 n, uint16 sizes[32], ...);
#define kprint(ARGS...) __kprint(count_va_args(ARGS), get_va_args_sizes(ARGS), ARGS)
void __kprint(uint8 n, kprint_format* formats, void** objects);
#define kprint(ARGS...) __kprint(count_args(ARGS), __kprint_argsToArrs(count_args(ARGS),ARGS))
#if __cplusplus
}