diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..7c7727320efe5ec04bd8bc43d4cbd7012f118e72 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +CC=gcc +CFLAGS=-Wall -pedantic -Wextra -g +LFLAGS= + +OUTPUT=fml + +SRC_DIR=./src +BUILD_DIR=./build + +.PHONY: init fml + +all: init fml + +fml: $(BUILD_DIR)/arena.o $(BUILD_DIR)/parser.o $(SRC_DIR)/fml.c #$(BUILD_DIR)/%.o + $(CC) $(CFLAGS) $(LFLAGS) $? -o $(OUTPUT) + + +%.o: $(SRC_DIR)/%.c + $(CC) $(CFLAGS) -c $< -o $@ + +$(BUILD_DIR)/parser.o: $(SRC_DIR)/parser.c + $(CC) $(CFLAGS) -c $< -o $@ + +$(BUILD_DIR)/arena.o: $(SRC_DIR)/arena.c + $(CC) $(CFLAGS) -c $< -o $@ + + +init: + mkdir -p build diff --git a/src/fml.c b/src/fml.c index 67325264b57a317c6253a6f1e9e7bf3efb24d8fa..ed1cf6de40bb19f2f841ef7be6d45503214386b0 100644 --- a/src/fml.c +++ b/src/fml.c @@ -1,5 +1,60 @@ -int main ( int argc, const char * argv [] ) { +#include <stdio.h> +#include <string.h> +#include <stddef.h> +#include <ctype.h> +#include "arena.h" +#include "parser.h" - return 0; -} \ No newline at end of file +#define AST_INTERPRETER_COMMAND "ast_interpret" +#define RUN "run" +#define MAX_ARG_LEN 20 + +int main ( int argc, char **argv ) { + if ( argc < 2 ) { + fprintf( stderr, "Error: expected at least one argument\n" ); + return 1; + } + + u8 flag = 0; + u8 ast_interpret = 0; + size_t len; + for ( int arg = 1; arg < argc; ++arg ) { + len = strlen ( argv [ arg ] ); + if ( len > MAX_ARG_LEN ) { + fprintf( stderr, "Error: unsupported argument.\n" ); + flag = 1; + } + for ( size_t j = 0; j < len; j++ ) + argv [ arg ] [ j ] = tolower ( argv [ arg ] [ j ] ); + if ( strncpy ( argv [ arg ], AST_INTERPRETER_COMMAND, len ) == 0 ) + ast_interpret = 1; + else if ( strncpy ( argv [ arg ], RUN, len ) == 0 ) + ast_interpret = 1; + else { + fprintf( stderr, "Error: unsupported argument.\n" ); + flag = 1; + } + } + + if ( flag ) + return 1; + + Arena arena; + arena_init( &arena ); + + Ast *ast = parse_src ( &arena, (Str) { .str = (u8 *) argv[1], .len = strlen(argv[1]) } ); + + if ( ast == NULL ) { + fprintf ( stderr, "Failed to parse source\n" ); + arena_destroy ( &arena ); + return 1; + } + + if ( ast_interpret ) + return 88; + + arena_destroy( &arena ); + + return 0; +}