mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
optimize for pure string on printf
support unlimited pika_printf impl
This commit is contained in:
parent
afc99c7b35
commit
c89f873fab
2
port/linux/.vscode/launch.json
vendored
2
port/linux/.vscode/launch.json
vendored
@ -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}",
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user