kprint_format

This commit is contained in:
timerix 2022-08-31 21:44:56 +06:00
parent eca678026f
commit 2b4046313d
8 changed files with 215 additions and 0 deletions

View File

@ -11,6 +11,7 @@ extern "C" {
#include "types.h" #include "types.h"
#include "unitype.h" #include "unitype.h"
#include "init.h" #include "init.h"
#include "kprint/kprint.h"
#if __cplusplus #if __cplusplus
} }

View File

@ -0,0 +1,2 @@
## kprint
I don't really like printf function, so i made safer and more convinient replacement.

View File

@ -0,0 +1,13 @@
[data types]
int 0x2000 00100000 00000000
uint + withPostfix + uppercase 0x2001 00100000 00000001
hex + withPrefix + uppercase 0x2002 00100000 00000010
bin + withPrefix 0x2003 00100000 00000011
float + withPostfix + uppercase 0x3000 00110000 00000000
char 0x3001 00110000 00000001
string 0x3002 00110000 00000010
??? 0x3003 00110000 00000011
[optional flags]
withPrefix = withPostfix 0x0004 00000000 00000100
upperase 0x0008 00000000 00001000

22
src/base/kprint/kprint.c Normal file
View File

@ -0,0 +1,22 @@
#include "../base.h"
Maybe __ksprint(uint8 n, uint16 sizes[32], ...){
for(uint8 i=0; i<n; i++)
}
Maybe __kfprint(FILE* fd, uint8 n, uint16 sizes[32], ...){
try(__ksprint(n, sizes, ...), str,;);
if(fputs(str.value.VoidPtr, fd)==EOF)
safethrow("can't write string to file",;);
free(str.value.VoidPtr);
}
void __kprint(uint8 n, uint16 sizes[32], ...){
va_list args;
va_start(args, sizes);
va_end(args);
}

51
src/base/kprint/kprint.h Normal file
View File

@ -0,0 +1,51 @@
#pragma once
#if __cplusplus
extern "C" {
#endif
#include "../errors.h"
#include "kprint_colors.h"
#include "kprint_format.h"
#define __count_va_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(\
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(\
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)
Maybe __ksprint(uint8 n, uint16 sizes[32], ...);
#define ksprint(ARGS...) __ksprint(count_va_args(ARGS), get_va_args_sizes(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)
void __kprint(uint8 n, uint16 sizes[32], ...);
#define kprint(ARGS...) __kprint(count_va_args(ARGS), get_va_args_sizes(ARGS), ARGS)
#if __cplusplus
}
#endif

View File

@ -0,0 +1,55 @@
#pragma once
#if __cplusplus
extern "C" {
#endif
typedef enum kprint_fgColor{
// 01000000 0000000
// ^ ^^^^
// | color num
// fgColorChanged flag
kprint_fgBlack = 0x80000000, // optional
kprint_fgDarkRed = 0x81000000, // optional
kprint_fgDarkGreen = 0x82000000, // optional
kprint_fgDarkYellow = 0x83000000, // optional
kprint_fgDarkBlue = 0x84000000, // optional
kprint_fgDarkMagneta= 0x85000000, // optional
kprint_fgDarkCyan = 0x86000000, // optional
kprint_fgGray = 0x87000000, // optional
kprint_fgDarkGray = 0x88000000, // optional
kprint_fgRed = 0x89000000, // optional
kprint_fgGreen = 0x8a000000, // optional
kprint_fgYellow = 0x8b000000, // optional
kprint_fgBlue = 0x8c000000, // optional
kprint_fgMagneta = 0x8d000000, // optional
kprint_fgCyan = 0x8e000000, // optional
kprint_fgWhite = 0x8f000000 // optional
} kprint_fgColor;
typedef enum kprint_bgColor{
// 01000000 0000000
// ^ ^^^^
// bgColorChanged flag color num
kprint_bgBlack = 0x40000000, // optional
kprint_bgDarkRed = 0x40100000, // optional
kprint_bgDarkGreen = 0x40200000, // optional
kprint_bgDarkYellow = 0x40300000, // optional
kprint_bgDarkBlue = 0x40400000, // optional
kprint_bgDarkMagneta= 0x40500000, // optional
kprint_bgDarkCyan = 0x40600000, // optional
kprint_bgGray = 0x40700000, // optional
kprint_bgDarkGray = 0x40800000, // optional
kprint_bgRed = 0x40900000, // optional
kprint_bgGreen = 0x40a00000, // optional
kprint_bgYellow = 0x40b00000, // optional
kprint_bgBlue = 0x40c00000, // optional
kprint_bgMagneta = 0x40d00000, // optional
kprint_bgCyan = 0x40e00000, // optional
kprint_bgWhite = 0x40f00000 // optional
} kprint_bgColor;
#if __cplusplus
}
#endif

View File

@ -0,0 +1,70 @@
#pragma once
#if __cplusplus
extern "C" {
#endif
#include "../unitype.h"
typedef enum kprint_dataFormat{
// 00100000 00000000
// ^ ^^
// dataFmtSet flag type
kprint_fmtInt = 0x20000000, // default
// 00100000 00000001
kprint_fmtUInt = 0x20010000, // mandatory for uint
// 00100000 00000010
kprint_fmtHex = 0x20020000, // optional
// 00100000 00000011
kprint_fmtBin = 0x20030000, // optional
// 00110000 00000000
// ^^ ^^
// dataFmtSet flag┘| type
// notInteger flag
kprint_fmtFloat = 0x30000000, // mandatory for float
// 00110000 00000001
kprint_fmtChar = 0x30010000, // optional for char
// 00110000 00000010
kprint_fmtString = 0x30020000, // mandatory for char[], char* and string
// 00110000 00000011
//kprint_fmt? = 0x30030000, // unused
// 00000000 00000100
// ^
// prefix/postfix flag
kprint_fmtWithPrefix=0x00040000, // optional for hex or binary
kprint_fmtWithPostfix=kprint_fmtWithPrefix, // optional for uint or float
// 00000000 00001000
// ^
// uppercase flag // optional for hex, uint or float
kprint_fmtUppercase=0x00080000
} kprint_dataFmt;
uint16 kprint_isFmtSet = 0x2000;
typedef struct {
unsigned char fgColorChanged : 1;
unsigned char bgColorChanged : 1;
unsigned char dataFmtSet : 1;
unsigned char notInteger : 1;
unsigned char fgColor : 4;
unsigned char bgColor : 4;
unsigned char uppercase : 1;
unsigned char withPrefix : 1;
unsigned char dataFmt : 2;
kerepTypeId typeId;
} kprint_format;
#if __cplusplus
}
#endif

View File

@ -8,6 +8,7 @@ extern "C" {
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdarg.h>
#include <locale.h> #include <locale.h>
#include <time.h> #include <time.h>
#include <setjmp.h> #include <setjmp.h>