:<
This commit is contained in:
@@ -30,7 +30,9 @@
|
|||||||
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
// ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡘⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
|
||||||
|
|
||||||
typedef struct noomC_LocalInfo {
|
typedef struct noomC_LocalInfo {
|
||||||
enum { NOOMC_GLOBAL, NOOMC_LOCAL, NOOMC_UPVAL } type;
|
enum { NOOMC_GLOBAL,
|
||||||
|
NOOMC_LOCAL,
|
||||||
|
NOOMC_UPVAL } type;
|
||||||
unsigned int idx;
|
unsigned int idx;
|
||||||
} noomC_LocalInfo;
|
} noomC_LocalInfo;
|
||||||
|
|
||||||
@@ -165,8 +167,7 @@ static noom_Exit noomC_compile_expr(
|
|||||||
noomV_Function* func,
|
noomV_Function* func,
|
||||||
const noomP_Node* node,
|
const noomP_Node* node,
|
||||||
// retc of -1 means all values!!!!!!!!!!!
|
// retc of -1 means all values!!!!!!!!!!!
|
||||||
int retc
|
int retc) {
|
||||||
) {
|
|
||||||
noom_Exit result;
|
noom_Exit result;
|
||||||
if (node->type == NOOMP_NODE_NILLITERAL) {
|
if (node->type == NOOMP_NODE_NILLITERAL) {
|
||||||
compiler->curstack++;
|
compiler->curstack++;
|
||||||
|
|||||||
@@ -82,8 +82,7 @@ noom_uint_t noom_format_error(const noomP_Parser* parser, const char* program_na
|
|||||||
if (parser->code[i] == '\n') {
|
if (parser->code[i] == '\n') {
|
||||||
row++;
|
row++;
|
||||||
column = 1;
|
column = 1;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
column++;
|
column++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -127,8 +126,7 @@ noom_uint_t noom_format_error(const noomP_Parser* parser, const char* program_na
|
|||||||
|
|
||||||
if (row == 0) {
|
if (row == 0) {
|
||||||
num_buf[num_len++] = '0';
|
num_buf[num_len++] = '0';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
noom_uint_t temp = row;
|
noom_uint_t temp = row;
|
||||||
noom_uint_t divisor = 1;
|
noom_uint_t divisor = 1;
|
||||||
while (temp / divisor >= 10) divisor *= 10;
|
while (temp / divisor >= 10) divisor *= 10;
|
||||||
|
|||||||
35
src/helper.c
35
src/helper.c
@@ -13,7 +13,7 @@ double noom_strtod(const char* s, const char** endptr, int* error) {
|
|||||||
s++;
|
s++;
|
||||||
|
|
||||||
if (!noomL_isnumber(s[*s == '.'])) goto fuck;
|
if (!noomL_isnumber(s[*s == '.'])) goto fuck;
|
||||||
|
|
||||||
if (*s == '0' && noomL_lower(s[1]) == 'x') {
|
if (*s == '0' && noomL_lower(s[1]) == 'x') {
|
||||||
s += 2;
|
s += 2;
|
||||||
// if the string starts with "0x" but does not contain digits it's invalid
|
// if the string starts with "0x" but does not contain digits it's invalid
|
||||||
@@ -22,14 +22,14 @@ double noom_strtod(const char* s, const char** endptr, int* error) {
|
|||||||
int digit;
|
int digit;
|
||||||
if (noomL_isnumber(*s)) digit = *s - '0';
|
if (noomL_isnumber(*s)) digit = *s - '0';
|
||||||
else digit = noomL_lower(*s) - 'a' + 10;
|
else digit = noomL_lower(*s) - 'a' + 10;
|
||||||
|
|
||||||
num = num * 16.0 + digit;
|
num = num * 16.0 + digit;
|
||||||
are_we_cooked = 0;
|
are_we_cooked = 0;
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (are_we_cooked) goto fuck;
|
if (are_we_cooked) goto fuck;
|
||||||
|
|
||||||
if (noomL_lower(*s) == 'p') {
|
if (noomL_lower(*s) == 'p') {
|
||||||
// damn then
|
// damn then
|
||||||
s++;
|
s++;
|
||||||
@@ -37,18 +37,17 @@ double noom_strtod(const char* s, const char** endptr, int* error) {
|
|||||||
const noom_bool_t exponent_negative = *s == '-';
|
const noom_bool_t exponent_negative = *s == '-';
|
||||||
if (*s == '-' || *s == '+')
|
if (*s == '-' || *s == '+')
|
||||||
s++;
|
s++;
|
||||||
|
|
||||||
if (!noomL_isnumber(*s)) goto fuck;
|
if (!noomL_isnumber(*s)) goto fuck;
|
||||||
|
|
||||||
while (noomL_isnumber(*s)) {
|
while (noomL_isnumber(*s)) {
|
||||||
exponent = exponent * 10 + (*s - '0');
|
exponent = exponent * 10 + (*s - '0');
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
|
|
||||||
num *= noom_pow(2.0, exponent_negative ? -exponent : exponent);
|
num *= noom_pow(2.0, exponent_negative ? -exponent : exponent);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
noom_bool_t are_we_cooked = 1;
|
noom_bool_t are_we_cooked = 1;
|
||||||
while (noomL_isnumber(*s)) {
|
while (noomL_isnumber(*s)) {
|
||||||
num = num * 10.0 + (*s - '0');
|
num = num * 10.0 + (*s - '0');
|
||||||
@@ -57,7 +56,7 @@ double noom_strtod(const char* s, const char** endptr, int* error) {
|
|||||||
}
|
}
|
||||||
if (*s == '.') {
|
if (*s == '.') {
|
||||||
s++;
|
s++;
|
||||||
|
|
||||||
double fraction_divisor = 10.0;
|
double fraction_divisor = 10.0;
|
||||||
while (noomL_isnumber(*s)) {
|
while (noomL_isnumber(*s)) {
|
||||||
are_we_cooked = 0;
|
are_we_cooked = 0;
|
||||||
@@ -67,21 +66,21 @@ double noom_strtod(const char* s, const char** endptr, int* error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (are_we_cooked) goto fuck;
|
if (are_we_cooked) goto fuck;
|
||||||
|
|
||||||
if (noomL_lower(*s) == 'e') {
|
if (noomL_lower(*s) == 'e') {
|
||||||
s++;
|
s++;
|
||||||
int exponent = 0;
|
int exponent = 0;
|
||||||
const noom_bool_t exponent_negative = *s == '-';
|
const noom_bool_t exponent_negative = *s == '-';
|
||||||
if (*s == '-' || *s == '+')
|
if (*s == '-' || *s == '+')
|
||||||
s++;
|
s++;
|
||||||
|
|
||||||
if (!noomL_isnumber(*s)) goto fuck;
|
if (!noomL_isnumber(*s)) goto fuck;
|
||||||
|
|
||||||
while (noomL_isnumber(*s)) {
|
while (noomL_isnumber(*s)) {
|
||||||
exponent = exponent * 10 + (*s - '0');
|
exponent = exponent * 10 + (*s - '0');
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
|
|
||||||
num *= noom_pow(10.0, exponent_negative ? -exponent : exponent);
|
num *= noom_pow(10.0, exponent_negative ? -exponent : exponent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -99,16 +98,16 @@ double noom_pow(double x, int y) {
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
const double temp = noom_pow(x, y / 2);
|
const double temp = noom_pow(x, y / 2);
|
||||||
|
|
||||||
if (y % 2 == 0) {
|
if (y % 2 == 0) {
|
||||||
return temp * temp;
|
return temp * temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (y > 0)
|
if (y > 0)
|
||||||
return x * temp * temp;
|
return x * temp * temp;
|
||||||
|
|
||||||
return temp * temp / x;
|
return temp * temp / x;
|
||||||
}
|
}
|
||||||
|
|
||||||
int noom_startswith(const char* str, const char* compare) {
|
int noom_startswith(const char* str, const char* compare) {
|
||||||
#ifdef __has_builtin
|
#ifdef __has_builtin
|
||||||
|
|||||||
35
src/main.c
35
src/main.c
@@ -39,7 +39,7 @@ void print_node(const noomP_Node* node, noom_uint_t depth) {
|
|||||||
int execute(const char* code, noom_LuaVersion version, const char* program_name, const char* filename) {
|
int execute(const char* code, noom_LuaVersion version, const char* program_name, const char* filename) {
|
||||||
noomP_Parser parser;
|
noomP_Parser parser;
|
||||||
noomP_Node* program;
|
noomP_Node* program;
|
||||||
|
|
||||||
// goodbye "shitass" you will be missed
|
// goodbye "shitass" you will be missed
|
||||||
int success = noomP_parse(code, filename, version, &program, &parser);
|
int success = noomP_parse(code, filename, version, &program, &parser);
|
||||||
if (success == 0) {
|
if (success == 0) {
|
||||||
@@ -84,15 +84,14 @@ int execute(const char* code, noom_LuaVersion version, const char* program_name,
|
|||||||
puts("\x1b[0m");
|
puts("\x1b[0m");
|
||||||
puts("PARSE OUTPUT:");
|
puts("PARSE OUTPUT:");
|
||||||
print_node(program, 0);
|
print_node(program, 0);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
noom_uint_t bleh = noom_format_error(&parser, program_name, NULL, 0);
|
noom_uint_t bleh = noom_format_error(&parser, program_name, NULL, 0);
|
||||||
char* buf = noom_alloc(bleh);
|
char* buf = noom_alloc(bleh);
|
||||||
noom_format_error(&parser, program_name, buf, bleh);
|
noom_format_error(&parser, program_name, buf, bleh);
|
||||||
fputs(buf, stdout);
|
fputs(buf, stdout);
|
||||||
noom_free(buf);
|
noom_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// freeing time
|
// freeing time
|
||||||
noomP_Node* last_node = parser.last_node;
|
noomP_Node* last_node = parser.last_node;
|
||||||
while (last_node) {
|
while (last_node) {
|
||||||
@@ -102,7 +101,7 @@ int execute(const char* code, noom_LuaVersion version, const char* program_name,
|
|||||||
noom_free(last_node);
|
noom_free(last_node);
|
||||||
last_node = next;
|
last_node = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
noom_LuaVM* vm = noom_createVM(version);
|
noom_LuaVM* vm = noom_createVM(version);
|
||||||
noomV_Value peak;
|
noomV_Value peak;
|
||||||
@@ -138,7 +137,7 @@ int execute(const char* code, noom_LuaVersion version, const char* program_name,
|
|||||||
}
|
}
|
||||||
noom_destroyVM(vm);
|
noom_destroyVM(vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,19 +263,18 @@ int main(int argc, char** argv) {
|
|||||||
params.script_exec = argv[i];
|
params.script_exec = argv[i];
|
||||||
params.do_i_already_know_what_to_do = 1;
|
params.do_i_already_know_what_to_do = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argv[i][1] == 'l') {
|
if (argv[i][1] == 'l') {
|
||||||
const char* version_string = 0;
|
const char* version_string = 0;
|
||||||
if (argv[i][2] != '\0') {
|
if (argv[i][2] != '\0') {
|
||||||
version_string = argv[i] + 2;
|
version_string = argv[i] + 2;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (++i >= argc) {
|
if (++i >= argc) {
|
||||||
err = "-l needs an argument";
|
err = "-l needs an argument";
|
||||||
goto die;
|
goto die;
|
||||||
}
|
}
|
||||||
version_string = argv[i];
|
version_string = argv[i];
|
||||||
}
|
}
|
||||||
if (noom_strcmp(version_string, "51") == 0) params.lua_version = NOOM_VERSION_51;
|
if (noom_strcmp(version_string, "51") == 0) params.lua_version = NOOM_VERSION_51;
|
||||||
else if (noom_strcmp(version_string, "52") == 0) params.lua_version = NOOM_VERSION_52;
|
else if (noom_strcmp(version_string, "52") == 0) params.lua_version = NOOM_VERSION_52;
|
||||||
else if (noom_strcmp(version_string, "53") == 0) params.lua_version = NOOM_VERSION_53;
|
else if (noom_strcmp(version_string, "53") == 0) params.lua_version = NOOM_VERSION_53;
|
||||||
@@ -314,7 +312,8 @@ int main(int argc, char** argv) {
|
|||||||
char* code = read_file(params.script_path);
|
char* code = read_file(params.script_path);
|
||||||
if (code == 0) return 1;
|
if (code == 0) return 1;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
if (code[0] == '#' && code[1] == '!') for (offset = 2; code[offset] && code[offset] != '\n'; offset++);
|
if (code[0] == '#' && code[1] == '!')
|
||||||
|
for (offset = 2; code[offset] && code[offset] != '\n'; offset++);
|
||||||
const int e = execute(code + offset, params.lua_version, argv[0], params.script_path);
|
const int e = execute(code + offset, params.lua_version, argv[0], params.script_path);
|
||||||
noom_free(code);
|
noom_free(code);
|
||||||
return e;
|
return e;
|
||||||
@@ -336,12 +335,12 @@ int main(int argc, char** argv) {
|
|||||||
}
|
}
|
||||||
die:
|
die:
|
||||||
fprintf(stderr, "%s: %s\n"
|
fprintf(stderr, "%s: %s\n"
|
||||||
"usage: %s [options] [script [args]]\n"
|
"usage: %s [options] [script [args]]\n"
|
||||||
"Available options are:\n"
|
"Available options are:\n"
|
||||||
" - execute stdin\n"
|
" - execute stdin\n"
|
||||||
" -e stat execute string 'stat'\n"
|
" -e stat execute string 'stat'\n"
|
||||||
" -v show version\n"
|
" -v show version\n"
|
||||||
" -l [51|52|53|54] select lua version\n",
|
" -l [51|52|53|54] select lua version\n",
|
||||||
argv[0], err, argv[0]);
|
argv[0], err, argv[0]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user