optimize for pure string on printf

support unlimited pika_printf impl
This commit is contained in:
pikastech 2023-04-14 19:12:48 +08:00
parent afc99c7b35
commit c89f873fab
11 changed files with 101 additions and 44 deletions

View File

@ -15,7 +15,7 @@
// "--gtest_filter=doc.*"
// "--gtest_filter=packtool.*"
// "--gtest_filter=os.path"
"--gtest_filter=packtool.packread"
// "--gtest_filter=packtool.packread"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",

View File

@ -125,7 +125,7 @@ CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item)
CJSON_PUBLIC(const char*) cJSON_Version(void)
{
static char version[15];
pika_platform_sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH);
pika_sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH);
return version;
}
@ -561,18 +561,18 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out
/* This checks for NaN and Infinity */
if (isnan(d) || isinf(d))
{
length = pika_platform_sprintf((char*)number_buffer, "null");
length = pika_sprintf((char*)number_buffer, "null");
}
else
{
/* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */
length = pika_platform_sprintf((char*)number_buffer, "%1.15g", d);
length = pika_sprintf((char*)number_buffer, "%1.15g", d);
/* Check whether the original double can be recovered */
if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d))
{
/* If not, print with 17 decimal places of precision */
length = pika_platform_sprintf((char*)number_buffer, "%1.17g", d);
length = pika_sprintf((char*)number_buffer, "%1.17g", d);
}
}
@ -1005,7 +1005,7 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe
break;
default:
/* escape and print as unicode codepoint */
pika_platform_sprintf((char*)output_pointer, "u%04x", *input_pointer);
pika_sprintf((char*)output_pointer, "u%04x", *input_pointer);
output_pointer += 4;
break;
}

View File

@ -714,7 +714,7 @@ int Lib_loadLibraryFileToArray(char* origin_file_name, char* out_folder) {
if (i % 12 == 0) {
pika_fputs("\n ", fp);
}
pika_platform_sprintf(byte_buff, "0x%02x, ", array[i]);
pika_sprintf(byte_buff, "0x%02x, ", array[i]);
pika_fputs(byte_buff, fp);
}

View File

@ -2468,7 +2468,7 @@ void pks_printVersion(void) {
}
void pks_getVersion(char* buff) {
pika_platform_sprintf(buff, "%d.%d.%d", PIKA_VERSION_MAJOR,
pika_sprintf(buff, "%d.%d.%d", PIKA_VERSION_MAJOR,
PIKA_VERSION_MINOR, PIKA_VERSION_MICRO);
}

View File

@ -2856,7 +2856,7 @@ char* AST_genAsm_sub(AST* ast, AST* subAst, Args* outBuffs, char* pikaAsm) {
char* astNodeVal = AST_getNodeAttr(subAst, rule.ast);
if (NULL != astNodeVal) {
/* e.g. "0 RUN print \n" */
pika_platform_sprintf(buff, "%d %s ", deepth, rule.ins);
pika_sprintf(buff, "%d %s ", deepth, rule.ins);
Arg* abuff = arg_newStr(buff);
if (rule.type == VAL_DYNAMIC) {
abuff = arg_strAppend(abuff, astNodeVal);
@ -2897,7 +2897,7 @@ char* GenRule_toAsm(GenRule rule,
/* parse stmt ast */
pikaAsm = AST_genAsm_sub(ast, ast, buffs, pikaAsm);
/* e.g. "0 CTN \n" */
pika_platform_sprintf(buff, "%d %s ", deepth, rule.ins);
pika_sprintf(buff, "%d %s ", deepth, rule.ins);
Arg* abuff = arg_newStr(buff);
if (rule.type == VAL_DYNAMIC) {
abuff = arg_strAppend(abuff, obj_getStr(ast, rule.ast));

View File

@ -105,15 +105,12 @@ PIKA_WEAK int64_t pika_platform_get_tick(void) {
#endif
}
PIKA_WEAK int pika_platform_vsprintf(char* buff, char* fmt, va_list args) {
int pika_vsprintf(char* buff, char* fmt, va_list args) {
/* vsnprintf */
return pika_platform_vsnprintf(buff, PIKA_SPRINTF_BUFF_SIZE, fmt, args);
}
PIKA_WEAK int pika_platform_snprintf(char* buff,
size_t size,
const char* fmt,
...) {
int pika_snprintf(char* buff, size_t size, const char* fmt, ...) {
va_list args;
va_start(args, fmt);
int ret = pika_platform_vsnprintf(buff, size, fmt, args);
@ -125,14 +122,76 @@ PIKA_WEAK int pika_platform_putchar(char ch) {
return putchar(ch);
}
PIKA_WEAK int pika_platform_vprintf(char* fmt, va_list args) {
/* vsprintf to vprintf */
char buff[PIKA_SPRINTF_BUFF_SIZE];
pika_platform_vsprintf(buff, fmt, args);
/* putchar */
int pika_pvsprintf(char** buff, const char* fmt, va_list args) {
int required_size;
int current_size = PIKA_SPRINTF_BUFF_SIZE;
*buff = (char*)pika_platform_malloc(current_size * sizeof(char));
if (*buff == NULL) {
return -1; // Memory allocation failed
}
va_list args_copy;
va_copy(args_copy, args);
required_size =
pika_platform_vsnprintf(*buff, current_size, fmt, args_copy);
va_end(args_copy);
while (required_size >= current_size) {
current_size *= 2;
char* new_buff =
(char*)pika_platform_realloc(*buff, current_size * sizeof(char));
if (new_buff == NULL) {
pika_platform_free(*buff);
return -1; // Memory allocation failed
} else {
*buff = new_buff;
}
va_copy(args_copy, args);
required_size =
pika_platform_vsnprintf(*buff, current_size, fmt, args_copy);
va_end(args_copy);
}
return required_size;
}
PIKA_BOOL contains_format_specifier(const char* str) {
for (size_t i = 0; i < strlen(str); i++) {
if (str[i] == '%') {
if (i + 1 < strlen(str) && str[i + 1] != '%') {
return PIKA_TRUE;
}
}
}
return PIKA_FALSE;
}
int pika_vprintf(char* fmt, va_list args) {
if (!contains_format_specifier(fmt)) {
// No format specifier in the fmt string, print it directly
for (int i = 0; i < strlen(fmt); i++) {
pika_platform_putchar(fmt[i]);
}
return 0;
}
char* buff = NULL;
int required_size = pika_pvsprintf(&buff, fmt, args);
if (required_size < 0) {
return -1; // Memory allocation or other error occurred
}
// putchar
for (int i = 0; i < strlen(buff); i++) {
pika_platform_putchar(buff[i]);
}
pika_platform_free(buff);
return 0;
}
@ -140,7 +199,7 @@ PIKA_WEAK int pika_platform_vprintf(char* fmt, va_list args) {
PIKA_WEAK void pika_platform_printf(char* fmt, ...) {
va_list args;
va_start(args, fmt);
pika_platform_vprintf(fmt, args);
pika_vprintf(fmt, args);
va_end(args);
}
#endif
@ -164,7 +223,7 @@ PIKA_WEAK int pika_platform_vsnprintf(char* buff,
return vsnprintf(buff, size, fmt, args);
}
PIKA_WEAK int pika_platform_sprintf(char* buff, char* fmt, ...) {
int pika_sprintf(char* buff, char* fmt, ...) {
va_list args;
va_start(args, fmt);
int res = pika_platform_vsnprintf(buff, PIKA_SPRINTF_BUFF_SIZE, fmt, args);

View File

@ -138,13 +138,14 @@ void pika_platform_disable_irq_handle(void);
#ifndef pika_platform_printf
void pika_platform_printf(char* fmt, ...);
#endif
int pika_platform_sprintf(char* buff, char* fmt, ...);
int pika_platform_vsprintf(char* buff, char* fmt, va_list args);
int pika_vprintf(char* fmt, va_list args);
int pika_sprintf(char* buff, char* fmt, ...);
int pika_vsprintf(char* buff, char* fmt, va_list args);
int pika_platform_vsnprintf(char* buff,
size_t size,
const char* fmt,
va_list args);
int pika_platform_snprintf(char* buff, size_t size, const char* fmt, ...);
int pika_snprintf(char* buff, size_t size, const char* fmt, ...);
char* pika_platform_strdup(const char* src);
size_t pika_platform_tick_from_millisecond(size_t ms);

View File

@ -268,7 +268,7 @@ Arg* arg_toStrArg(Arg* arg) {
uint8_t* bytes = arg_getBytes(arg);
Arg* str_arg = arg_newStr("b\'");
for (size_t i = 0; i < bytes_size; i++) {
pika_platform_snprintf(buff_item, 16, "\\x%02x", bytes[i]);
pika_snprintf(buff_item, 16, "\\x%02x", bytes[i]);
char* str_item = (char*)buff_item;
str_arg = arg_strAppend(str_arg, str_item);
}
@ -277,7 +277,7 @@ Arg* arg_toStrArg(Arg* arg) {
}
if (type == ARG_TYPE_INT) {
#if PIKA_PRINT_LLD_ENABLE
pika_platform_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE, "%lld",
pika_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE, "%lld",
(long long int)arg_getInt(arg));
#else
pika_platform_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE, "%d",
@ -292,7 +292,7 @@ Arg* arg_toStrArg(Arg* arg) {
return arg_newStr("False");
}
if (type == ARG_TYPE_FLOAT) {
pika_platform_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE, "%f",
pika_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE, "%f",
arg_getFloat(arg));
return arg_newStr(buff);
}
@ -300,7 +300,7 @@ Arg* arg_toStrArg(Arg* arg) {
return arg_newStr(arg_getStr(arg));
}
if (type == ARG_TYPE_POINTER) {
pika_platform_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE, "%p",
pika_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE, "%p",
arg_getPtr(arg));
return arg_newStr(buff);
}
@ -316,21 +316,21 @@ Arg* arg_toStrArg(Arg* arg) {
strEqu(method_store->name, "list") ||
strEqu(method_store->name, "dict") ||
strEqu(method_store->name, "tuple")) {
pika_platform_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
pika_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
"<class '%s'>", method_store->name);
return arg_newStr(buff);
}
pika_platform_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
pika_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
"<built-in function %s>",
method_store->name);
return arg_newStr(buff);
}
if (argType_isConstructor(type)) {
pika_platform_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
pika_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
"<class 'object'>");
return arg_newStr(buff);
}
pika_platform_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
pika_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
"<class 'function'>");
return arg_newStr(buff);
}
@ -341,7 +341,7 @@ Arg* arg_toStrArg(Arg* arg) {
return arg_newStr(obj_toStr(arg_getPtr(arg)));
}
if (type == ARG_TYPE_OBJECT_META) {
pika_platform_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
pika_snprintf(buff, PIKA_SPRINTF_BUFF_SIZE,
"<meta object at %p>", arg_getPtr(arg));
return arg_newStr(buff);
}

View File

@ -17,10 +17,8 @@ extern "C" {
#define __platform_enable_irq_handle pika_platform_enable_irq_handle
#define __platform_disable_irq_handle pika_platform_disable_irq_handle
#define __platform_printf pika_platform_printf
#define __platform_sprintf pika_platform_sprintf
#define __platform_vsprintf pika_platform_vsprintf
#define __platform_vsnprintf pika_platform_vsnprintf
#define __platform_snprintf pika_platform_snprintf
#define __platform_sprintf pika_sprintf
#define __platform_strdup pika_platform_strdup
#define __platform_tick_from_millisecond pika_platform_tick_from_millisecond
#define __platform_malloc pika_platform_malloc

View File

@ -20,7 +20,7 @@ extern "C" {
#define rt_memcpy pika_platform_memcpy
#define rt_memcmp pika_platform_memcmp
#define rt_kprintf pika_platform_printf
#define rt_snprintf pika_platform_snprintf
#define rt_snprintf pika_snprintf
#define rt_vsnprintf pika_platform_vsnprintf
#define rt_strdup pika_platform_strdup
#define rt_tick_from_millisecond pika_platform_tick_from_millisecond

View File

@ -8,17 +8,16 @@ uint32_t log_index = 0;
/* save printf content to log_buff */
void pika_platform_printf(char* fmt, ...) {
va_list args;
for (int i = LOG_BUFF_MAX - 2; i >= 0; i--) {
memcpy(log_buff[i + 1], log_buff[i], LOG_SIZE);
}
va_list args;
va_start(args, fmt);
__platform_vsnprintf(log_buff[0], LOG_SIZE - 1, fmt, args);
pika_platform_vsnprintf(log_buff[0], LOG_SIZE - 1, fmt, args);
va_end(args);
va_start(args, fmt);
pika_vprintf(fmt, args);
va_end(args);
/* putchar */
for (int i = 0; i < strlen(log_buff[0]); i++) {
__platform_putchar(log_buff[0][i]);
}
}
// static volatile uint64_t tick_ms = 0;