#include "../include/common.h" #include "../include/chunk.h" #include "../include/debug.h" #include "../include/vm.h" #include #include static void repl(){ char line[1024]; for(;;){ printf("_> "); if(!fgets(line,sizeof(line),stdin)){ printf("\n"); break; } interpret(line); } } static char* readFile(const char *path){ FILE *file = fopen(path,"rb"); if(file == NULL){ fprintf(stderr,"Could not open file \"%s\".\n",path); exit(74); } fseek(file, 0L, SEEK_END); size_t fileSize = ftell(file); rewind(file); char *buffer = (char *)malloc(fileSize+1); if(buffer == NULL){ fprintf(stderr,"Out of memory for \"%s\".\n",path); exit(74); } size_t bytesRead = fread(buffer, sizeof(char), fileSize, file); if(bytesRead < fileSize){ fprintf(stderr,"Could not read file \"%s\".\n",path); exit(74); } buffer[bytesRead] = '\0'; fclose(file); return buffer; } static void runFile(const char *path){ char *source = readFile(path); InterpretResult result = interpret(source); free(source); if(result == INTERPRET_COMPILE_ERROR) exit(65); if(result == INTERPRET_RUNTIME_ERROR) exit(70); } int main(int argc, char *argv[]){ initVM(); if(argc == 1){ repl(); } else if(argc == 2){ runFile(argv[1]); } else { fprintf(stderr,"Usage: Clox [path]\n"); exit(64); } freeVM(); return 0; }