Skip to content
Snippets Groups Projects
fml.c 2.28 KiB
Newer Older
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
michal's avatar
michal committed

#include "arena.h"
#include "parser.h"
#include "ast_interpreter.h"
michal's avatar
michal committed

#define AST_INTERPRETER_COMMAND "ast_interpret"
#define RUN "run"
#define MAX_ARG_LEN 70
Michal Štěpánek's avatar
Michal Štěpánek committed
#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 ] );
  if ( flag || f <= 0 ) 
  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;
}