int run_script_from_buffer(char* script_data, int script_len, char* filename) { if (!hasInitializedEdify) { RegisterBuiltins(); RegisterRecoveryHooks(); FinishRegistration(); hasInitializedEdify = 1; } Expr* root; int error_count = 0; yy_scan_bytes(script_data, script_len); int error = yyparse(&root, &error_count); printf("parse returned %d; %d errors encountered\n", error, error_count); if (error == 0 || error_count > 0) { //ExprDump(0, root, buffer); State state; state.cookie = NULL; state.script = script_data; state.errmsg = NULL; char* result = Evaluate(&state, root); if (result == NULL) { printf("result was NULL, message is: %s\n", (state.errmsg == NULL ? "(NULL)" : state.errmsg)); free(state.errmsg); return -1; } else { printf("result is [%s]\n", result); } } return 0; }
int edify_main(int argc, char** argv) { load_volume_table(); process_volumes(); RegisterBuiltins(); RegisterRecoveryHooks(); FinishRegistration(); if (argc != 2) { printf("edify <filename>\n"); return 1; } FILE* f = fopen(argv[1], "r"); if (f == NULL) { printf("%s: %s: No such file or directory\n", argv[0], argv[1]); return 1; } char buffer[8192]; int size = fread(buffer, 1, 8191, f); fclose(f); buffer[size] = '\0'; Expr* root; int error_count = 0; yy_scan_bytes(buffer, size); int error = yyparse(&root, &error_count); printf("parse returned %d; %d errors encountered\n", error, error_count); if (error == 0 || error_count > 0) { //ExprDump(0, root, buffer); State state; state.cookie = NULL; state.script = buffer; state.errmsg = NULL; char* result = Evaluate(&state, root); if (result == NULL) { printf("result was NULL, message is: %s\n", (state.errmsg == NULL ? "(NULL)" : state.errmsg)); free(state.errmsg); } else { printf("result is [%s]\n", result); } } return 0; }