#include "literal.h" #include "memory.h" #include #include static void stdoutWrapper(const char* output) { fprintf(stdout, output); } void printLiteral(Literal literal) { printLiteralCustom(literal, stdoutWrapper); } void printLiteralCustom(Literal literal, void (printFn)(const char*)) { switch(literal.type) { case LITERAL_NULL: printFn("null"); break; case LITERAL_BOOLEAN: printFn(AS_BOOLEAN(literal) ? "true" : "false"); break; case LITERAL_INTEGER: { char buffer[256]; snprintf(buffer, 256, "%d", AS_INTEGER(literal)); printFn(buffer); } break; case LITERAL_FLOAT: { char buffer[256]; snprintf(buffer, 256, "%g", AS_FLOAT(literal)); printFn(buffer); } break; case LITERAL_STRING: { char buffer[256]; snprintf(buffer, 256, "%.*s", STRLEN(literal), AS_STRING(literal)); printFn(buffer); } break; default: //should never bee seen fprintf(stderr, "[Internal] Unrecognized literal type: %d", literal.type); } } void freeLiteral(Literal literal) { if (IS_STRING(literal)) { FREE(char, AS_STRING(literal)); return; } } bool _isTruthy(Literal x) { return (IS_NULL(x) || (IS_BOOLEAN(x) && AS_BOOLEAN(x)) || (IS_INTEGER(x) && AS_INTEGER(x) != 0) || (IS_FLOAT(x) && AS_FLOAT(x) != 0)); } Literal _toStringLiteral(char* cstr) { return ((Literal){LITERAL_STRING, { .string.ptr = (char*)cstr, .string.length = strlen((char*)cstr) }}); } char* copyString(char* original, int length) { char* buffer = ALLOCATE(char, length + 1); strncpy(buffer, original, length); buffer[length] = '\0'; return buffer; }