feat: add basic CLI (load files)

This commit is contained in:
Matthieu Bessat 2022-05-15 19:45:27 +02:00
parent 538205e8a5
commit 906949d691
11 changed files with 112 additions and 26 deletions

View file

@ -3,4 +3,4 @@ set a to input_number()
set b to input_number()
set res to a+b
eval print_int(c)
print_int(res)

View file

@ -1,2 +1,3 @@
# just print 42
eval print_number(42)
print_number(42)

5
examples/sequence.ltor Normal file
View file

@ -0,0 +1,5 @@
set i to 0
while !(i = 10) do
print_number(i)
set i to i+1
end

6
src/config.h Normal file
View file

@ -0,0 +1,6 @@
#ifndef G_CONFIG_H_
#define G_CONFIG_H_
#define G_DEBUG_LEVEL 0
#endif

View file

@ -539,7 +539,7 @@ int evaluate(struct StateContainer* state, char* inputStr, int* resultPtr, unsig
// identify token
// first try a variable then a func name
// not a float, check if this is a common function name
if (EVALUATOR_DEBUG_LEVEL >= 2) printf("now going to identify token '%s' \n");
if (EVALUATOR_DEBUG_LEVEL >= 2) printf("now going to identify token '%s' \n", buff);
if (EVALUATOR_DEBUG_LEVEL >= 2) var_store_print(state->varStore);
int varKey = (int) var_store_get_key(state->varStore, buff);

View file

@ -2,6 +2,7 @@
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include "./config.h"
#include "./types.h"
#include "./utils.h"
@ -246,7 +247,7 @@ int execute_func(short funcID, short argsLen, unsigned char* argsTypes, int* arg
return 1;
}
char* name = intros[funcID].name;
printf("Executing func '%s' \n", name);
if (G_DEBUG_LEVEL >= 2) printf("Executing func '%s' \n", name);
if (argsLen < intros[funcID].nbArgs) {
printf("ERR: Too few arguments for func call '%s' \n", name);
return 1;
@ -260,7 +261,7 @@ int execute_func(short funcID, short argsLen, unsigned char* argsTypes, int* arg
// first cast the function ptr
impl(resPtr, resTypePtr, argsTypes, argsValues);
printf("Got %s \n", get_repr(*resTypePtr, resPtr));
if (G_DEBUG_LEVEL >= 2) printf("Got %s \n", get_repr(*resTypePtr, resPtr));
return 0;
}

View file

@ -432,7 +432,7 @@ int process_line(struct StateContainer* state, char* str)
for (int z = 0; z < nameLen; z++) {
name[z] = str[setStatementParsing.name_start + z];
}
name[len] = '\0';
name[nameLen] = '\0';
int res;
byte resType;

View file

@ -2,7 +2,7 @@
#ifndef LINE_PROCESSING_H_
#define LINE_PROCESSING_H_
#define LINE_PROCESSING_DEBUG_LEVEL 1
#define LINE_PROCESSING_DEBUG_LEVEL 0
#define BLOCK_IF 2
#define BLOCK_WHILE 3

View file

@ -1,45 +1,114 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "./config.h"
#include "./types.h"
#include "./utils.h"
#include "./stack.h"
#include "./list.h"
#include "./number_parsing.h"
#include "./evaluator.h"
#include "./utils.h"
#include "./types.h"
#include "./state.h"
#include "./var_store.h"
#include "./line_processing.h"
byte load_file(char* filename, char** resultPtr) {
FILE* f = fopen(filename, "rb");
#define HELP_FLAG 1
#define VERSION_FLAG 4
#define INTERACTIVE_FLAG 8
#define STDIN_EXP_FLAG 16
int help_mode() {
char* helpStr = "Usage: langatator [options] [file]\n"
" -h --help print this usage and exit\n"
" -v --version print version information and exit\n"
" -i --interactive force interactive mode\n"
" -e --stdin-expression evaluate expression from stdin\n";
printf(helpStr);
return 0;
}
int version_mode() {
char* helpStr = "Langatator 0.0.1\n";
printf(helpStr);
return 0;
}
int interactive_mode() {
printf("Interactive not implemented yet ¯\\_(ツ)_/¯ \n");
return 1;
}
int stdin_expression_mode() {
printf("This mode is not implemented yet ¯\\_(ツ)_/¯ \n");
return 1;
}
int file_mode(char* fileName) {
FILE* f = fopen(fileName, "rb");
if (!f) {
return 0;
printf(stderr, "Cannot load file '%s' status: %d\n", fileName, f);
return 1;
}
fseek(f, 0, SEEK_END);
long length = ftell(f);
fseek(f, 0, SEEK_SET);
char* buffer = (char*) malloc(length);
if (!buffer) {
return 0;
char* buff = (char*) malloc(length);
if (!buff) {
printf(stderr, "Could not allocate buffer to process file content\n");
return 1;
}
if (buffer) {
fread(buffer, 1, length, f);
if (buff) {
fread(buff, 1, length, f);
}
fclose(f);
*resultPtr = buffer;
struct StateContainer* state = state_init();
process_script(state, buff);
return 1;
return 0;
}
int main (int argc, char** argv) {
// if (argc == 1) {
// printf("One arg '%s'", argv[0]);
int flags = INTERACTIVE_FLAG;
// return 0;
// }
int nonFlagArgumentCount = 0;
int nonFlagArgumentPos = 0;
// printf("Invalid usage use --help to document your self\n");
printf("CLI not implemented yet ¯\\_(ツ)_/¯ \n");
char* cmdName = argv[0];
for (int i = 1; i < argc; i++) {
if (str_starts_with("--help", argv[i]) || str_starts_with("-h", argv[i])) {
flags = HELP_FLAG;
break;
}
if (str_starts_with("--version", argv[i]) || str_starts_with("-v", argv[i])) {
flags = VERSION_FLAG;
break;
}
if (str_starts_with("--interactive", argv[i]) || str_starts_with("-i", argv[i])) {
flags = INTERACTIVE_FLAG;
break;
}
if (str_starts_with("--stdin-expression", argv[i]) || str_starts_with("-e", argv[i])) {
flags = STDIN_EXP_FLAG;
break;
}
// no flag match
if (str_starts_with("--", argv[i])) {
printf(stderr, "Invalid flag '%s'\n", argv[i]);
return 1;
}
nonFlagArgumentCount++;
nonFlagArgumentPos = i;
}
if (nonFlagArgumentCount == 1) return file_mode(argv[nonFlagArgumentPos]);
if (flags & HELP_FLAG) return help_mode();
if (flags & VERSION_FLAG) return version_mode();
if (flags & INTERACTIVE_FLAG) return interactive_mode();
if (flags & STDIN_EXP_FLAG) return stdin_expression_mode();
help_mode();
return 1;
}

View file

@ -1,3 +1,5 @@
#include "./config.h"
#ifndef UTILS_H_
#define UTILS_H_

View file

@ -61,4 +61,6 @@ byte var_store_set(struct VariableStore* store, char* varName, byte type, void*
byte var_store_delete(struct VariableStore* store, char* varName);
void var_store_print(struct VariableStore* store);
#endif