Files
lang-assm/src/token.c
T

86 lines
2.2 KiB
C

#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;
}