163 lines
6.2 KiB
C
163 lines
6.2 KiB
C
#include "lib_about.h"
|
|
|
|
#include "toy_memory.h"
|
|
|
|
int Toy_hookAbout(Toy_Interpreter* interpreter, Toy_Literal identifier, Toy_Literal alias) {
|
|
//the about keys
|
|
Toy_Literal majorKeyLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString("major"));
|
|
Toy_Literal minorKeyLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString("minor"));
|
|
Toy_Literal patchKeyLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString("patch"));
|
|
Toy_Literal buildKeyLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString("build"));
|
|
Toy_Literal authorKeyLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString("author"));
|
|
|
|
//the about identifiers
|
|
Toy_Literal majorIdentifierLiteral = TOY_TO_IDENTIFIER_LITERAL(Toy_createRefString("major"));
|
|
Toy_Literal minorIdentifierLiteral = TOY_TO_IDENTIFIER_LITERAL(Toy_createRefString("minor"));
|
|
Toy_Literal patchIdentifierLiteral = TOY_TO_IDENTIFIER_LITERAL(Toy_createRefString("patch"));
|
|
Toy_Literal buildIdentifierLiteral = TOY_TO_IDENTIFIER_LITERAL(Toy_createRefString("build"));
|
|
Toy_Literal authorIdentifierLiteral = TOY_TO_IDENTIFIER_LITERAL(Toy_createRefString("author"));
|
|
|
|
//the about values
|
|
Toy_Literal majorLiteral = TOY_TO_INTEGER_LITERAL(TOY_VERSION_MAJOR);
|
|
Toy_Literal minorLiteral = TOY_TO_INTEGER_LITERAL(TOY_VERSION_MINOR);
|
|
Toy_Literal patchLiteral = TOY_TO_INTEGER_LITERAL(TOY_VERSION_PATCH);
|
|
Toy_Literal buildLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString(TOY_VERSION_BUILD));
|
|
Toy_Literal authorLiteral = TOY_TO_STRING_LITERAL(Toy_createRefString("Kayne Ruse, KR Game Studios"));
|
|
|
|
//store as an aliased dictionary
|
|
if (!TOY_IS_NULL(alias)) {
|
|
//make sure the name isn't taken
|
|
if (Toy_isDelcaredScopeVariable(interpreter->scope, alias)) {
|
|
interpreter->errorOutput("Can't override an existing variable\n");
|
|
Toy_freeLiteral(alias);
|
|
|
|
Toy_freeLiteral(majorKeyLiteral);
|
|
Toy_freeLiteral(minorKeyLiteral);
|
|
Toy_freeLiteral(patchKeyLiteral);
|
|
Toy_freeLiteral(buildKeyLiteral);
|
|
Toy_freeLiteral(authorKeyLiteral);
|
|
|
|
Toy_freeLiteral(majorIdentifierLiteral);
|
|
Toy_freeLiteral(minorIdentifierLiteral);
|
|
Toy_freeLiteral(patchIdentifierLiteral);
|
|
Toy_freeLiteral(buildIdentifierLiteral);
|
|
Toy_freeLiteral(authorIdentifierLiteral);
|
|
|
|
Toy_freeLiteral(majorLiteral);
|
|
Toy_freeLiteral(minorLiteral);
|
|
Toy_freeLiteral(patchLiteral);
|
|
Toy_freeLiteral(buildLiteral);
|
|
Toy_freeLiteral(authorLiteral);
|
|
|
|
return -1;
|
|
}
|
|
|
|
//create the dictionary to load up with values
|
|
Toy_LiteralDictionary* dictionary = TOY_ALLOCATE(Toy_LiteralDictionary, 1);
|
|
Toy_initLiteralDictionary(dictionary);
|
|
|
|
//set each key/value pair
|
|
Toy_setLiteralDictionary(dictionary, majorKeyLiteral, majorLiteral);
|
|
Toy_setLiteralDictionary(dictionary, minorKeyLiteral, minorLiteral);
|
|
Toy_setLiteralDictionary(dictionary, patchKeyLiteral, patchLiteral);
|
|
Toy_setLiteralDictionary(dictionary, buildKeyLiteral, buildLiteral);
|
|
Toy_setLiteralDictionary(dictionary, authorKeyLiteral, authorLiteral);
|
|
|
|
//build the type
|
|
Toy_Literal type = TOY_TO_TYPE_LITERAL(TOY_LITERAL_DICTIONARY, true);
|
|
Toy_Literal strType = TOY_TO_TYPE_LITERAL(TOY_LITERAL_STRING, true);
|
|
Toy_Literal anyType = TOY_TO_TYPE_LITERAL(TOY_LITERAL_ANY, true);
|
|
TOY_TYPE_PUSH_SUBTYPE(&type, strType);
|
|
TOY_TYPE_PUSH_SUBTYPE(&type, anyType);
|
|
|
|
//set scope
|
|
Toy_Literal dict = TOY_TO_DICTIONARY_LITERAL(dictionary);
|
|
Toy_declareScopeVariable(interpreter->scope, alias, type);
|
|
Toy_setScopeVariable(interpreter->scope, alias, dict, false);
|
|
|
|
//cleanup
|
|
Toy_freeLiteral(dict);
|
|
Toy_freeLiteral(type);
|
|
}
|
|
|
|
//store globally
|
|
else {
|
|
//make sure the names aren't taken
|
|
if (Toy_isDelcaredScopeVariable(interpreter->scope, majorKeyLiteral) ||
|
|
Toy_isDelcaredScopeVariable(interpreter->scope, minorKeyLiteral) ||
|
|
Toy_isDelcaredScopeVariable(interpreter->scope, patchKeyLiteral) ||
|
|
Toy_isDelcaredScopeVariable(interpreter->scope, buildKeyLiteral) ||
|
|
Toy_isDelcaredScopeVariable(interpreter->scope, authorKeyLiteral)) {
|
|
interpreter->errorOutput("Can't override an existing variable\n");
|
|
Toy_freeLiteral(alias);
|
|
|
|
Toy_freeLiteral(majorKeyLiteral);
|
|
Toy_freeLiteral(minorKeyLiteral);
|
|
Toy_freeLiteral(patchKeyLiteral);
|
|
Toy_freeLiteral(buildKeyLiteral);
|
|
Toy_freeLiteral(authorKeyLiteral);
|
|
|
|
Toy_freeLiteral(majorIdentifierLiteral);
|
|
Toy_freeLiteral(minorIdentifierLiteral);
|
|
Toy_freeLiteral(patchIdentifierLiteral);
|
|
Toy_freeLiteral(buildIdentifierLiteral);
|
|
Toy_freeLiteral(authorIdentifierLiteral);
|
|
|
|
Toy_freeLiteral(majorLiteral);
|
|
Toy_freeLiteral(minorLiteral);
|
|
Toy_freeLiteral(patchLiteral);
|
|
Toy_freeLiteral(buildLiteral);
|
|
Toy_freeLiteral(authorLiteral);
|
|
|
|
return -1;
|
|
}
|
|
|
|
Toy_Literal intType = TOY_TO_TYPE_LITERAL(TOY_LITERAL_INTEGER, true);
|
|
Toy_Literal strType = TOY_TO_TYPE_LITERAL(TOY_LITERAL_STRING, true);
|
|
|
|
//major
|
|
Toy_declareScopeVariable(interpreter->scope, majorIdentifierLiteral, intType);
|
|
Toy_setScopeVariable(interpreter->scope, majorIdentifierLiteral, majorLiteral, false);
|
|
|
|
//minor
|
|
Toy_declareScopeVariable(interpreter->scope, minorIdentifierLiteral, intType);
|
|
Toy_setScopeVariable(interpreter->scope, minorIdentifierLiteral, minorLiteral, false);
|
|
|
|
//patch
|
|
Toy_declareScopeVariable(interpreter->scope, patchIdentifierLiteral, intType);
|
|
Toy_setScopeVariable(interpreter->scope, patchIdentifierLiteral, patchLiteral, false);
|
|
|
|
//build
|
|
Toy_declareScopeVariable(interpreter->scope, buildIdentifierLiteral, strType);
|
|
Toy_setScopeVariable(interpreter->scope, buildIdentifierLiteral, buildLiteral, false);
|
|
|
|
//author
|
|
Toy_declareScopeVariable(interpreter->scope, authorIdentifierLiteral, strType);
|
|
Toy_setScopeVariable(interpreter->scope, authorIdentifierLiteral, authorLiteral, false);
|
|
|
|
Toy_freeLiteral(intType);
|
|
Toy_freeLiteral(strType);
|
|
}
|
|
|
|
//cleanup
|
|
Toy_freeLiteral(majorKeyLiteral);
|
|
Toy_freeLiteral(minorKeyLiteral);
|
|
Toy_freeLiteral(patchKeyLiteral);
|
|
Toy_freeLiteral(buildKeyLiteral);
|
|
Toy_freeLiteral(authorKeyLiteral);
|
|
|
|
Toy_freeLiteral(majorIdentifierLiteral);
|
|
Toy_freeLiteral(minorIdentifierLiteral);
|
|
Toy_freeLiteral(patchIdentifierLiteral);
|
|
Toy_freeLiteral(buildIdentifierLiteral);
|
|
Toy_freeLiteral(authorIdentifierLiteral);
|
|
|
|
Toy_freeLiteral(majorLiteral);
|
|
Toy_freeLiteral(minorLiteral);
|
|
Toy_freeLiteral(patchLiteral);
|
|
Toy_freeLiteral(buildLiteral);
|
|
Toy_freeLiteral(authorLiteral);
|
|
|
|
return 0;
|
|
}
|