Files
Toy/source/literal.c

72 lines
1.6 KiB
C

#include "literal.h"
#include "memory.h"
#include <stdio.h>
#include <string.h>
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;
}