2018-06-06 06:09:17 +00:00
|
|
|
#include "common.h"
|
|
|
|
#include "chunk.h"
|
|
|
|
#include "debug.h"
|
|
|
|
#include "vm.h"
|
|
|
|
|
|
|
|
#include <time.h>
|
2018-06-08 21:17:50 +00:00
|
|
|
#include <string.h>
|
2018-06-06 06:09:17 +00:00
|
|
|
|
|
|
|
static void repl( VM* vm ) {
|
|
|
|
char line[512];
|
|
|
|
|
|
|
|
for ( ; ; ) {
|
|
|
|
printf( "> " );
|
|
|
|
if ( !fgets( line, sizeof(line), stdin ) ) {
|
|
|
|
printf( "\n" ); break;
|
|
|
|
}
|
2018-06-08 21:17:50 +00:00
|
|
|
printf( "= %s", line );
|
2018-06-06 06:09:17 +00:00
|
|
|
interpret( vm, line );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static char* readFile( const char* path ) {
|
|
|
|
FILE* file = fopen( path, "rb" );
|
|
|
|
if ( file == NULL ) {
|
|
|
|
fprintf( stderr, "Error opening file: \"%s\"\n", path );
|
|
|
|
exit( 74 );
|
|
|
|
}
|
|
|
|
|
|
|
|
fseek( file, 0, SEEK_END );
|
|
|
|
size_t sz = ftell( file );
|
|
|
|
rewind( file );
|
|
|
|
|
|
|
|
char* src = (char*)malloc( sz + 1 );
|
|
|
|
if ( src == NULL ) {
|
|
|
|
fprintf( stderr, "Error allocating memory for file: \"%s\"\n", path );
|
|
|
|
exit( 74 );
|
|
|
|
}
|
|
|
|
size_t bread = fread( src, sizeof(char), sz, file );
|
|
|
|
if ( bread < sz ) {
|
|
|
|
fprintf( stderr, "Error reading file: \"%s\"\n", path );
|
|
|
|
exit( 74 );
|
|
|
|
}
|
|
|
|
src[bread] = '\0';
|
|
|
|
|
|
|
|
fclose( file );
|
|
|
|
return src;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void runFile( VM* vm, const char* path ) {
|
|
|
|
char* source = readFile( path );
|
|
|
|
InterpretResult res = interpret( vm, source );
|
|
|
|
free( source );
|
|
|
|
if ( res == INTERPRET_COMPILE_ERROR ) exit( 65 );
|
|
|
|
if ( res == INTERPRET_RUNTIME_ERROR ) exit( 70 );
|
|
|
|
}
|
|
|
|
|
|
|
|
int main( int argc, char** argv ) {
|
|
|
|
(void)argc; (void)argv;
|
|
|
|
srand( time( NULL ) );
|
|
|
|
|
|
|
|
VM vm;
|
|
|
|
initVM( &vm );
|
|
|
|
|
|
|
|
if ( argc == 1 ) {
|
|
|
|
repl( &vm );
|
|
|
|
} else if ( argc == 2 ) {
|
|
|
|
runFile( &vm, argv[1] );
|
|
|
|
} else {
|
|
|
|
fprintf( stderr, "Usage: clox [path]\n" );
|
2018-06-08 21:17:50 +00:00
|
|
|
//exit( EXIT_FAILURE );
|
2018-06-06 06:09:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
freeVM( &vm );
|
|
|
|
|
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
//void* malloc( size_t sz ) {}
|
|
|
|
|