#include <stdio.h> #include <string.h> #include <stddef.h> #include <ctype.h> #include "arena.h" #include "parser.h" #include "ast_interpreter.h" #define AST_INTERPRETER_COMMAND "ast_interpret" #define RUN "run" #define MAX_ARG_LEN 70 #define HEAP_SIZE 256 * (1024 * 1024) int main ( int argc, char **argv ) { if ( argc < 2 ) { fprintf( stderr, "Input error: expected at least one argument\n" ); return 1; } u8 flag = 0; u8 ast_interpret = 0; size_t len; int f = -1; for ( int arg = 1; arg < argc; ++arg ) { len = strlen ( argv [ arg ] ); if ( len > MAX_ARG_LEN ) { fprintf( stderr, "Input error: argument %s is too long.\n", argv [ arg ] ); flag = 1; } for ( size_t j = 0; j < len; j++ ) argv [ arg ] [ j ] = tolower ( argv [ arg ] [ j ] ); if ( strncmp ( argv [ arg ], AST_INTERPRETER_COMMAND, len ) == 0 ) { ast_interpret = 1; f = ++arg; } else if ( strncmp ( argv [ arg ], RUN, len ) == 0 ) { ast_interpret = 1; f = ++arg; } else { fprintf( stderr, "Input error: unknown argument %s.\n", argv [ arg ] ); flag = 1; } } if ( flag || f <= 0 ) return 1; FILE * fp = fopen ( argv [ f ], "r" ); if ( ! fp ) { fprintf ( stderr, "Input error: file does not exists.\n" ); return 1; } if ( fseek ( fp, 0, SEEK_END ) ) { fprintf ( stderr, "Input error: could not advance to the end of the file.\n" ); return 1; } int file_len = ftell ( fp ); if ( file_len < 0 ) { fprintf ( stderr, "Input error: could not count the size of the file.\n" ); return 1; } size_t flen = file_len; rewind ( fp ); u8 * buffer = malloc ( flen ); if ( fread ( buffer, 1, flen, fp ) != flen ) { fprintf ( stderr, "Input error: could not read to the file.\n" ); return 1; } fclose ( fp ); Arena arena; arena_init( &arena ); Ast *ast = parse_src ( &arena, (Str) { .str = buffer, .len = flen } ); if ( ast == NULL ) { fprintf ( stderr, "Failed to parse source\n" ); arena_destroy ( &arena ); return 1; } if ( ast_interpret ) { ASTInterpreterState state; Heap heap; heap_init ( &heap, HEAP_SIZE ); state_init ( &state, &heap ); evaluate ( &state, ast ); state_destroy ( &state ); } free ( buffer ); arena_destroy( &arena ); return 0; }