Added cwasm_arena.c and cwasm_debug.c. Arena API hasn't been tested well yet. There's also something wrong with our DebugOutputLineBuffer usage for splitting lines to multiple Javascript output calls. Also added an int level to jsStdPrint and a bunch of macros to cwasm.h

This commit is contained in:
2025-08-31 17:33:48 -07:00
parent d0aa7a1d0e
commit cca61ea163
9 changed files with 566 additions and 11 deletions

186
cwasm_debug.c Normal file
View File

@@ -0,0 +1,186 @@
/*
File: cwasm_debug.c
Author: Taylor Robbins
Date: 08\29\2025
Description:
** Holds functions and macros for the debug output API we use in the application
*/
typedef enum DbgLevel DbgLevel;
enum DbgLevel
{
DbgLevel_Debug = 0,
DbgLevel_Info,
DbgLevel_Warning,
DbgLevel_Error,
DbgLevel_Count,
};
static DbgLevel DebugOutputLineBufferLevel = DbgLevel_Debug;
static u32 DebugOutputLineBufferLength = 0;
static char DebugOutputLineBuffer[CWASM_DEBUG_OUTPUT_LINE_BUFFER_SIZE];
static char DebugOutputPrintBuffer[CWASM_DEBUG_OUTPUT_PRINT_BUFFER_SIZE];
#if CWASM_DEBUG
void CwasmDebugOutput(const char* filePath, u32 lineNumber, const char* functionName, DbgLevel level, bool newLine, const char* messageNt)
#else
void CwasmDebugOutput(DbgLevel level, bool newLine, const char* messageNt)
#endif
{
if (level == DbgLevel_Debug && !CWASM_ENABLE_DBG_LEVEL_DEBUG) { return; }
if (level == DbgLevel_Info && !CWASM_ENABLE_DBG_LEVEL_INFO) { return; }
if (level == DbgLevel_Warning && !CWASM_ENABLE_DBG_LEVEL_WARNING) { return; }
if (level == DbgLevel_Error && !CWASM_ENABLE_DBG_LEVEL_ERROR) { return; }
u32 lineStart = 0;
int messageLength = (messageNt != nullptr) ? strlen(messageNt) : 0;
for (int cIndex = 0; cIndex < messageLength + (newLine ? 1 : 0); cIndex++)
{
char character = (cIndex < messageLength) ? messageNt[cIndex] : '\n';
if (character == '\n')
{
if (DebugOutputLineBufferLength > 0)
{
DebugOutputLineBufferLevel = (level > DebugOutputLineBufferLevel) ? level : DebugOutputLineBufferLevel;
u32 numCharsToCopy = ((cIndex - lineStart) < (CWASM_DEBUG_OUTPUT_LINE_BUFFER_SIZE - DebugOutputLineBufferLength))
? (cIndex - lineStart)
: (CWASM_DEBUG_OUTPUT_LINE_BUFFER_SIZE - DebugOutputLineBufferLength);
if (numCharsToCopy > 0)
{
memcpy(&DebugOutputLineBuffer[DebugOutputLineBufferLength], &messageNt[lineStart], numCharsToCopy);
DebugOutputLineBufferLength += numCharsToCopy;
}
jsStdPrint((int)DebugOutputLineBufferLevel, &DebugOutputLineBuffer[0], DebugOutputLineBufferLength);
DebugOutputLineBufferLength = 0;
DebugOutputLineBufferLevel = DbgLevel_Debug;
}
else
{
jsStdPrint((int)level, &messageNt[lineStart], messageLength - lineStart);
}
lineStart = cIndex+1;
}
}
if (lineStart < messageLength)
{
u32 numCharsToCopy = ((messageLength - lineStart) < (CWASM_DEBUG_OUTPUT_LINE_BUFFER_SIZE - DebugOutputLineBufferLength))
? (messageLength - lineStart)
: (CWASM_DEBUG_OUTPUT_LINE_BUFFER_SIZE - DebugOutputLineBufferLength);
if (numCharsToCopy > 0)
{
DebugOutputLineBufferLevel = (level > DebugOutputLineBufferLevel) ? level : DebugOutputLineBufferLevel;
memcpy(&DebugOutputLineBuffer[DebugOutputLineBufferLength], &messageNt[lineStart], numCharsToCopy);
DebugOutputLineBufferLength += numCharsToCopy;
}
}
}
#if CWASM_DEBUG
void CwasmDebugOutputPrint(const char* filePath, u32 lineNumber, const char* functionName, DbgLevel level, bool newLine, const char* formatStrNt, ...)
#else
void CwasmDebugOutputPrint(DbgLevel level, bool newLine, const char* formatStrNt, ...)
#endif
{
va_list args;
va_start(args, formatStrNt);
int printResult = vsnprintf(&DebugOutputPrintBuffer[0], CWASM_DEBUG_OUTPUT_PRINT_BUFFER_SIZE, formatStrNt, args);
va_end(args);
if (printResult >= 0)
{
DebugOutputPrintBuffer[CWASM_DEBUG_OUTPUT_PRINT_BUFFER_SIZE-1] = '\0';
#if CWASM_DEBUG
CwasmDebugOutput(filePath, lineNumber, functionName, level, newLine, &DebugOutputPrintBuffer[0]);
#else
CwasmDebugOutput(level, newLine, &DebugOutputPrintBuffer[0]);
#endif
}
else
{
#if CWASM_DEBUG
CwasmDebugOutput(filePath, lineNumber, functionName, level, false, "CWASM_PRINT_ERROR(");
CwasmDebugOutput(filePath, lineNumber, functionName, level, false, formatStrNt);
CwasmDebugOutput(filePath, lineNumber, functionName, level, true, ")");
#else
CwasmDebugOutput(level, false, "CWASM_PRINT_ERROR(");
CwasmDebugOutput(level, false, formatStrNt);
CwasmDebugOutput(level, true, ")");
#endif
}
}
#if CWASM_ENABLE_DBG_LEVEL_DEBUG
#if CWASM_DEBUG
#define Write_D(messageNt) CwasmDebugOutput(__FILE__, __LINE__, __func__, DbgLevel_Debug, false, (messageNt))
#define Print_D(formatStrNt, ...) CwasmDebugOutputPrint(__FILE__, __LINE__, __func__, DbgLevel_Debug, false, (formatStrNt), ##__VA_ARGS__)
#define WriteLine_D(messageNt) CwasmDebugOutput(__FILE__, __LINE__, __func__, DbgLevel_Debug, true, (messageNt))
#define PrintLine_D(formatStrNt, ...) CwasmDebugOutputPrint(__FILE__, __LINE__, __func__, DbgLevel_Debug, true, (formatStrNt), ##__VA_ARGS__)
#else
#define Write_D(messageNt) CwasmDebugOutput(DbgLevel_Debug, false, (messageNt))
#define Print_D(formatStrNt, ...) CwasmDebugOutputPrint(DbgLevel_Debug, false, (formatStrNt), ##__VA_ARGS__)
#define WriteLine_D(messageNt) CwasmDebugOutput(DbgLevel_Debug, true, (messageNt))
#define PrintLine_D(formatStrNt, ...) CwasmDebugOutputPrint(DbgLevel_Debug, true, (formatStrNt), ##__VA_ARGS__)
#endif
#else
#define Write_D(messageNt) //nothing
#define Print_D(formatStrNt, ...) //nothing
#define WriteLine_D(messageNt) //nothing
#define PrintLine_D(formatStrNt, ...) //nothing
#endif
#if CWASM_ENABLE_DBG_LEVEL_INFO
#if CWASM_DEBUG
#define Write_I(messageNt) CwasmDebugOutput(__FILE__, __LINE__, __func__, DbgLevel_Info, false, (messageNt))
#define Print_I(formatStrNt, ...) CwasmDebugOutputPrint(__FILE__, __LINE__, __func__, DbgLevel_Info, false, (formatStrNt), ##__VA_ARGS__)
#define WriteLine_I(messageNt) CwasmDebugOutput(__FILE__, __LINE__, __func__, DbgLevel_Info, true, (messageNt))
#define PrintLine_I(formatStrNt, ...) CwasmDebugOutputPrint(__FILE__, __LINE__, __func__, DbgLevel_Info, true, (formatStrNt), ##__VA_ARGS__)
#else
#define Write_I(messageNt) CwasmDebugOutput(DbgLevel_Info, false, (messageNt))
#define Print_I(formatStrNt, ...) CwasmDebugOutputPrint(DbgLevel_Info, false, (formatStrNt), ##__VA_ARGS__)
#define WriteLine_I(messageNt) CwasmDebugOutput(DbgLevel_Info, true, (messageNt))
#define PrintLine_I(formatStrNt, ...) CwasmDebugOutputPrint(DbgLevel_Info, true, (formatStrNt), ##__VA_ARGS__)
#endif
#else
#define Write_I(messageNt) //nothing
#define Print_I(formatStrNt, ...) //nothing
#define WriteLine_I(messageNt) //nothing
#define PrintLine_I(formatStrNt, ...) //nothing
#endif
#if CWASM_ENABLE_DBG_LEVEL_WARNING
#if CWASM_DEBUG
#define Write_W(messageNt) CwasmDebugOutput(__FILE__, __LINE__, __func__, DbgLevel_Warning, false, (messageNt))
#define Print_W(formatStrNt, ...) CwasmDebugOutputPrint(__FILE__, __LINE__, __func__, DbgLevel_Warning, false, (formatStrNt), ##__VA_ARGS__)
#define WriteLine_W(messageNt) CwasmDebugOutput(__FILE__, __LINE__, __func__, DbgLevel_Warning, true, (messageNt))
#define PrintLine_W(formatStrNt, ...) CwasmDebugOutputPrint(__FILE__, __LINE__, __func__, DbgLevel_Warning, true, (formatStrNt), ##__VA_ARGS__)
#else
#define Write_W(messageNt) CwasmDebugOutput(DbgLevel_Warning, false, (messageNt))
#define Print_W(formatStrNt, ...) CwasmDebugOutputPrint(DbgLevel_Warning, false, (formatStrNt), ##__VA_ARGS__)
#define WriteLine_W(messageNt) CwasmDebugOutput(DbgLevel_Warning, true, (messageNt))
#define PrintLine_W(formatStrNt, ...) CwasmDebugOutputPrint(DbgLevel_Warning, true, (formatStrNt), ##__VA_ARGS__)
#endif
#else
#define Write_W(messageNt) //nothing
#define Print_W(formatStrNt, ...) //nothing
#define WriteLine_W(messageNt) //nothing
#define PrintLine_W(formatStrNt, ...) //nothing
#endif
#if CWASM_ENABLE_DBG_LEVEL_ERROR
#if CWASM_DEBUG
#define Write_E(messageNt) CwasmDebugOutput(__FILE__, __LINE__, __func__, DbgLevel_Error, false, (messageNt))
#define Print_E(formatStrNt, ...) CwasmDebugOutputPrint(__FILE__, __LINE__, __func__, DbgLevel_Error, false, (formatStrNt), ##__VA_ARGS__)
#define WriteLine_E(messageNt) CwasmDebugOutput(__FILE__, __LINE__, __func__, DbgLevel_Error, true, (messageNt))
#define PrintLine_E(formatStrNt, ...) CwasmDebugOutputPrint(__FILE__, __LINE__, __func__, DbgLevel_Error, true, (formatStrNt), ##__VA_ARGS__)
#else
#define Write_E(messageNt) CwasmDebugOutput(DbgLevel_Error, false, (messageNt))
#define Print_E(formatStrNt, ...) CwasmDebugOutputPrint(DbgLevel_Error, false, (formatStrNt), ##__VA_ARGS__)
#define WriteLine_E(messageNt) CwasmDebugOutput(DbgLevel_Error, true, (messageNt))
#define PrintLine_E(formatStrNt, ...) CwasmDebugOutputPrint(DbgLevel_Error, true, (formatStrNt), ##__VA_ARGS__)
#endif
#else
#define Write_E(messageNt) //nothing
#define Print_E(formatStrNt, ...) //nothing
#define WriteLine_E(messageNt) //nothing
#define PrintLine_E(formatStrNt, ...) //nothing
#endif