Newer
Older
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
#include "arena.h"
#include "parser.h"
#define AST_INTERPRETER_COMMAND "ast_interpret"
#define RUN "run"
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;
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 ) {
f = ++arg;
} else if ( strncmp ( argv [ arg ], RUN, len ) == 0 ) {
f = ++arg;
} else {
fprintf( stderr, "Input error: unknown argument %s.\n", argv [ arg ] );
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 );
}
arena_destroy( &arena );
return 0;
}