diff --git a/src/include/vm_types.hpp b/src/include/vm_types.hpp index 6f8b725..b53fc77 100644 --- a/src/include/vm_types.hpp +++ b/src/include/vm_types.hpp @@ -1,6 +1,7 @@ #define MAX_SLOTS 256 #define MAX_STACK_SIZE 64 #define MAX_PRINT_BUFFER 1024 +#define MAX_PRINT_CURSOR MAX_PRINT_BUFFER - 1 #define vt_null 0 #define vt_identifier 1 @@ -12,6 +13,7 @@ #define vt_string 7 static char *printBuffer = (char *)malloc(MAX_PRINT_BUFFER); +static int printBufferCursor = 0; typedef unsigned char byte; typedef unsigned char *byteref; @@ -181,73 +183,85 @@ class Program return 1; } - void printf(const char *format, va_list args) + void flush() { + onSend(printBuffer, printBufferCursor); + printBufferCursor = 0; os_memset(printBuffer, 0, MAX_PRINT_BUFFER); - int len = 0; + } + + void putchar(char c) + { + if (printBufferCursor >= MAX_PRINT_CURSOR) + { + flush(); + } + printBuffer[printBufferCursor++] = c; + + if (c == '\n') + { + flush(); + } + } + + void putchars(const char *c, int len) + { + int i = 0; + + for (; i < len; i++) + { + putchar(c[i]); + } + } + + void printf(const char *format, va_list args) + { + + char *s = va_arg(args, char *); char *p = (char *)format; + char number[8]; for (; *p; p++) { - if (len >= MAX_PRINT_BUFFER) - break; - if (*p != '%') { - printBuffer[len++] = (*p); + putchar(*p); continue; } + switch (*++p) { case 'd': { - if (sizeof(int) > MAX_PRINT_BUFFER - len) - { - break; - } - int d = va_arg(args, int); - int c = os_sprintf(printBuffer + len, "%d", d); - len += c - 1; + int c = os_sprintf(number, "%d", d); + putchars(number, c); break; } case 'x': { int d = va_arg(args, int); - int c = os_sprintf(printBuffer + len, "%02x", d); - len += c - 1; + int c = os_sprintf(number, "%02x", d); + putchars(number, c); break; } case 'c': { char c = va_arg(args, int); - printBuffer[len++] = c; + putchar(c); break; } case 's': { char *s = va_arg(args, char *); - int slen = os_strlen(s); - - if (slen > MAX_PRINT_BUFFER - len) - { - slen = MAX_PRINT_BUFFER - len - 1; - } - - os_memcpy(printBuffer + len, s, slen); - len += slen; + putchars(s, strlen(s)); break; } default: - printBuffer[len++] = (*p); + putchar(*p); break; } } - - if (len) - { - onSend(printBuffer, len); - } } }; diff --git a/src/index.cpp b/src/index.cpp index 70ffbe2..1d4afba 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1,4 +1,4 @@ -#define WITH_DEBUG +// #define WITH_DEBUG #define SERIAL_SPEED 115200 #define __CHIP_ESP8266__ @@ -155,7 +155,6 @@ void onReceive(void *arg, char *data, unsigned short length) void onSend(char *data, int length) { - // TRACE("send %d bytes, state %d\n", length, conn->state); if (conn->state == ESPCONN_CONNECT || conn->state == ESPCONN_WRITE) { espconn_send(conn, (uint8 *)data, length); @@ -164,7 +163,6 @@ void onSend(char *data, int length) void onHalt() { - TRACE("halt, state %d\n", conn->state); if (conn->state == ESPCONN_CONNECT) { espconn_disconnect(conn);