int main( int argc, char **argv ) { char *buffer; size_t length; struct program *basic_program; int error; progname = argv[0]; if( argc < 2 ) { fprintf( stderr, "%s: usage: %s <basic file>\n", progname, progname ); return 1; } error = utils_read_file( &buffer, &length, argv[1] ); if( error ) return error; basic_program = parse_program( buffer, length ); if( !basic_program ) return 1; free( buffer ); error = interpret_program( basic_program ); if( error ) { program_free( basic_program ); return error; } if( program_free( basic_program ) ) { fprintf( stderr, "%s: error freeing program\n", progname ); return 1; } return 0; }
static void ctx_free_programs(struct context *ctx) { struct program *p = NULL; list_t ps = ctx->programs; while ((p = list_pop(&ps)) && p) { program_free(p); } }
static int interpret_program( struct program *program ) { if( program_find_functions( program ) ) { fprintf( stderr, "%s: error finding functions\n", progname ); return 1; } while( !program->error ) { if( program_execute_statement( program ) ) { program_free( program ); return 1; } } printf( "%s\n", program_strerror( program->error ) ); return 0; }
void ast_free(ast_t* ast) { if(ast == NULL) return; ast_t* child = ast->child; ast_t* next; while(child != NULL) { next = child->sibling; ast_free(child); child = next; } ast_free(ast->type); switch(token_get_id(ast->t)) { case TK_PROGRAM: program_free((program_t*)ast->data); break; case TK_PACKAGE: package_free((package_t*)ast->data); break; case TK_MODULE: source_close((source_t*)ast->data); break; default: break; } token_free(ast->t); symtab_free(ast->symtab); POOL_FREE(ast_t, ast); }