#include "binary_c_python.h" #include <time.h> #include <sys/timeb.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <stdint.h> /* Binary_c python API * Set of c-functions that interface with the binary_c api. * These functions are called by python, first through binary_c_python.c, * and there further instructions are given on how to interface * * Contains several functions: * // evolution * run_system * // utility * return_arglines * return_help_info * return_help_all_info * return_version_info * // other * create_store * */ // #define _CAPTURE #ifdef _CAPTURE static void show_stdout(void); static void capture_stdout(void); #endif /* global variables */ int out_pipe[2]; int stdoutwas; /* =================================================================== */ /* Functions to evolve systems */ /* =================================================================== */ /* Function that runs a system. Has multiple input parameters: Big function. Takes several arguments. See binary_c_python.c docstring. */ int run_system(char * argstring, long int custom_logging_func_memaddr, long int store_memaddr, int write_logfile, int population, char ** const buffer, char ** const error_buffer, size_t * const nbytes) { /* memory for system */ struct libbinary_c_stardata_t *stardata; // Store: /* Check the value of the store_memaddr */ struct libbinary_c_store_t * store; if(store_memaddr != -1) { // load the store from the integer that has been passed // struct libbinary_c_store_t * store = (void*)store_memaddr; store = (void*)store_memaddr; } else { // struct libbinary_c_store_t * store = NULL; store = NULL; } struct persistent_data_t * persistent_data; /* make new stardata */ stardata = NULL; binary_c_new_system(&stardata, // stardata NULL, // previous_stardatas NULL, // preferences &store, // store &persistent_data, // persistent_data TODO: see if this use is correct &argstring, // argv -1 // argc ); // Add flag to enable /* disable logging */ if(write_logfile != 1) { snprintf(stardata->preferences->log_filename, STRING_LENGTH-1, "%s", "/dev/null"); snprintf(stardata->preferences->api_log_filename_prefix, STRING_LENGTH-1, "%s", "/dev/null"); } /* output to strings */ stardata->preferences->internal_buffering = INTERNAL_BUFFERING_STORE; stardata->preferences->batchmode = BATCHMODE_LIBRARY; /* Check the value of the custom_logging_memaddr */ if(custom_logging_func_memaddr != -1) { stardata->preferences->custom_output_function = (void*)(struct stardata_t *)custom_logging_func_memaddr; } /* do binary evolution */ binary_c_evolve_for_dt(stardata, stardata->model.max_evolution_time); /* get buffer pointer */ binary_c_buffer_info(stardata,buffer,nbytes); /* get error buffer pointer */ binary_c_error_buffer(stardata,error_buffer); /* set raw_buffer_size = -1 to prevent it being freed */ stardata->tmpstore->raw_buffer_size = -1; /* free stardata (except the buffer) */ binary_c_free_memory(&stardata, // Stardata TRUE, // free_preferences TRUE, // free_stardata FALSE, // free_store FALSE, // free_raw_buffer TRUE // free_persistent TODO: check if this is correct here ); // add flag or logic to free store contents. if (store_memaddr == -1) { binary_c_free_store_contents(store); } // TODO: Ask rob whether to free the memory here or not? or to free it manually. return 0; } /* =================================================================== */ /* Functions to call other API functionality like help and arglines */ /* =================================================================== */ int return_arglines(char ** const buffer, char ** const error_buffer, size_t * const nbytes) { /* memory for N binary systems */ struct libbinary_c_stardata_t *stardata; struct libbinary_c_store_t * store = NULL; /* make new stardata */ stardata = NULL; char * empty_str = ""; binary_c_new_system(&stardata, // stardata NULL, // previous_stardatas NULL, // preferences &store, // store NULL, // persistent_data &empty_str, // argv -1 // argc ); /* disable logging */ snprintf(stardata->preferences->log_filename, STRING_LENGTH-1, "%s", "/dev/null"); snprintf(stardata->preferences->api_log_filename_prefix, STRING_LENGTH-1, "%s", "/dev/null"); /* output to strings */ stardata->preferences->internal_buffering = INTERNAL_BUFFERING_STORE; stardata->preferences->batchmode = BATCHMODE_LIBRARY; /* List available arguments */ binary_c_list_args(stardata); /* get buffer pointer */ binary_c_buffer_info(stardata,buffer,nbytes); /* get error buffer pointer */ binary_c_error_buffer(stardata,error_buffer); /* set raw_buffer_size = -1 to prevent it being freed */ stardata->tmpstore->raw_buffer_size = -1; /* free stardata (except the buffer) */ binary_c_free_memory(&stardata, // Stardata TRUE, // free_preferences TRUE, // free_stardata FALSE, // free_store FALSE, // free_raw_buffer TRUE // free_persistent TODO: check if this is correct here ); // TODO: check what this does binary_c_free_store_contents(store); return 0; } int return_help_info(char * argstring, char ** const buffer, char ** const error_buffer, size_t * const nbytes) { /* memory for N binary systems */ struct libbinary_c_stardata_t *stardata; struct libbinary_c_store_t * store = NULL; /* make new stardata */ stardata = NULL; binary_c_new_system(&stardata, // stardata NULL, // previous_stardatas NULL, // preferences &store, // store NULL, // persistent_data &argstring, // argv -1 // argc ); /* output to strings */ stardata->preferences->internal_buffering = INTERNAL_BUFFERING_STORE; stardata->preferences->batchmode = BATCHMODE_LIBRARY; /* Ask the help api */ binary_c_help(stardata, argstring); /* get buffer pointer */ binary_c_buffer_info(stardata,buffer,nbytes); /* get error buffer pointer */ binary_c_error_buffer(stardata,error_buffer); /* set raw_buffer_size = -1 to prevent it being freed */ stardata->tmpstore->raw_buffer_size = -1; /* free stardata (except the buffer) */ binary_c_free_memory(&stardata, // Stardata TRUE, // free_preferences TRUE, // free_stardata FALSE, // free_store FALSE, // free_raw_buffer TRUE // free_persistent TODO: check if this is correct here ); // Ask rob whether this can be replaced with setting the thing above to true binary_c_free_store_contents(store); return 0; } int return_help_all_info(char ** const buffer, char ** const error_buffer, size_t * const nbytes) { /* memory for N binary systems */ struct libbinary_c_stardata_t *stardata; struct libbinary_c_store_t * store = NULL; /* make new stardata */ stardata = NULL; char * empty_str = ""; binary_c_new_system(&stardata, // stardata NULL, // previous_stardatas NULL, // preferences &store, // store NULL, // persistent_data &empty_str, // argv -1 // argc ); /* output to strings */ stardata->preferences->internal_buffering = INTERNAL_BUFFERING_STORE; stardata->preferences->batchmode = BATCHMODE_LIBRARY; /* Ask the help api */ binary_c_help_all(stardata); /* get buffer pointer */ binary_c_buffer_info(stardata,buffer,nbytes); /* get error buffer pointer */ binary_c_error_buffer(stardata,error_buffer); /* set raw_buffer_size = -1 to prevent it being freed */ stardata->tmpstore->raw_buffer_size = -1; /* free stardata (except the buffer) */ binary_c_free_memory(&stardata, // Stardata TRUE, // free_preferences TRUE, // free_stardata FALSE, // free_store FALSE, // free_raw_buffer TRUE // free_persistent TODO: check if this is correct here ); binary_c_free_store_contents(store); return 0; } int return_version_info(char ** const buffer, char ** const error_buffer, size_t * const nbytes) { /* memory for N binary systems */ struct libbinary_c_stardata_t *stardata; struct libbinary_c_store_t * store = NULL; /* make new stardata */ stardata = NULL; char * empty_str = ""; binary_c_new_system(&stardata, // stardata NULL, // previous_stardatas NULL, // preferences &store, // store NULL, // persistent_data TODO: see if this use is correct &empty_str, // argv -1 // argc ); /* output to strings */ stardata->preferences->internal_buffering = INTERNAL_BUFFERING_STORE; stardata->preferences->batchmode = BATCHMODE_LIBRARY; /* Ask the help api */ binary_c_version(stardata); /* get buffer pointer */ binary_c_buffer_info(stardata,buffer,nbytes); /* get error buffer pointer */ binary_c_error_buffer(stardata,error_buffer); /* set raw_buffer_size = -1 to prevent it being freed */ stardata->tmpstore->raw_buffer_size = -1; /* free stardata (except the buffer) */ binary_c_free_memory(&stardata, // Stardata TRUE, // free_preferences TRUE, // free_stardata FALSE, // free_store FALSE, // free_raw_buffer TRUE // free_persistent TODO: check if this is correct here ); binary_c_free_store_contents(store); return 0; } /* =================================================================== */ /* Functions to call other functionality */ /* =================================================================== */ long int return_store(char * argstring, char ** const buffer, char ** const error_buffer, size_t * const nbytes) { /* memory for N binary systems */ struct libbinary_c_stardata_t *stardata; struct libbinary_c_store_t * store = NULL; /* make new stardata */ stardata = NULL; binary_c_new_system(&stardata, // stardata NULL, // previous_stardatas NULL, // preferences &store, // store NULL, // persistent_data &argstring, // argv -1 // argc ); /* output to strings */ // stardata->preferences->internal_buffering = INTERNAL_BUFFERING_STORE; // stardata->preferences->batchmode = BATCHMODE_LIBRARY; /* get buffer pointer */ binary_c_buffer_info(stardata, buffer, nbytes); /* get error buffer pointer */ binary_c_error_buffer(stardata, error_buffer); /* set raw_buffer_size = -1 to prevent it being freed */ stardata->tmpstore->raw_buffer_size = -1; /* free stardata (except the buffer) */ binary_c_free_memory(&stardata, // Stardata TRUE, // free_preferences TRUE, // free_stardata FALSE, // free_store FALSE, // free_raw_buffer TRUE // free_persistent TODO: check if this is correct here ); /* convert the pointer */ uintptr_t store_memaddr_int = (uintptr_t)store; // C Version converting ptr to int /* Return the memaddr as an int */ return store_memaddr_int; }