#include "../includes/token.h" const Token TokenEmpty = { 0 }; struct _token* TokenCreate(TokenType type, int lineNumber, int columnNumber, bool resolved) { struct _token* token = calloc(1, sizeof(Token)); token->Type = type; token->LineNumber = lineNumber; token->ColumnNumber = columnNumber; token->Resolved = resolved; return token; } char* TokenStringify(const struct _token* token) { if (!token) return NULL; size_t bufferSize = 64; char* str; if (token->Type == String) { // Add three for 2 quotes and a NUL byte. bufferSize = strlen(token->Value.String) + 3; str = malloc(bufferSize); snprintf(str, bufferSize, "\"%s\"", token->Value.String); return str; } else if (token->Type == Symbol) { // Add three for 2 backticks and a NUL byte. bufferSize = strlen(token->Value.String) + 3; str = calloc(bufferSize, sizeof(char)); snprintf(str, bufferSize, "`%s`", token->Value.String); return str; } else if (token->Type == Label) { // Add 2 for the colon and Nul byte. bufferSize = strlen(token->Value.String) + 2; str = calloc(bufferSize, sizeof(char)); snprintf(str, bufferSize, "%s:", token->Value.String); return str; } else { str = malloc(bufferSize * sizeof(char)); } char buffer[32] = { 0 }; switch(token->Type) { case Register: GetRegisterText(token->Value.Register, buffer); break; case Mnemonic: GetMnemonicText(token->Value.Mnemonic, buffer); break; case Keyword: GetKeywordText(token->Value.Keyword, buffer); break; case Empty: strcpy(str, "(Empty)"); break; case Number: sprintf(str, "%d", token->Value.Number); break; case LineEnd: strcpy(str, "(LineEnd)"); break; case FileEnd: strcpy(str, "(FileEnd)"); break; default: sprintf(str, "%s", token->Value.Operator); break; } if (strlen(buffer) > 0) strncpy(str, buffer, sizeof(buffer) - 1); return str; }