From a3a46b4fbefaf2ca7a93f623a3ef25b12921e1d2 Mon Sep 17 00:00:00 2001 From: David Hendriks <davidhendriks93@gmail.com> Date: Mon, 18 Nov 2019 15:42:41 +0000 Subject: [PATCH] almost there i think --- Makefile | 25 +- .../binary_c_python.h | 0 setup.py | 1 + src/binary_c_python_api.c | 242 ++++++++++++++++++ 4 files changed, 260 insertions(+), 8 deletions(-) rename binary_c_python.h => include/binary_c_python.h (100%) create mode 100644 src/binary_c_python_api.c diff --git a/Makefile b/Makefile index c0b18ca30..687115f05 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,9 @@ endif # Name of program PROGRAM := binary_c_python_api +SRC_DIR := src +OBJ_DIR := obj + # some commands CC := gcc LD := gcc @@ -20,28 +23,32 @@ LIBS := -lbinary_c $(shell $(BINARY_C)/binary_c-config --libs) # Source files and cflags C_SRC := binary_c_python_api.c CFLAGS := -fPIC $(shell $(BINARY_C)/binary_c-config --flags | sed s/-fvisibility=hidden// ) +C_SRC_NEW := src/binary_c_python_api.c + +# SRC = $(wildcard $(SRC_DIR)/binary_c_python_api.c) +# OBJECTS = $(C_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) # Incdirs -INCDIRS := -I$(BINARY_C)/src/ -I$(BINARY_C)/src/API +INCDIRS := -I$(BINARY_C)/src/ -I$(BINARY_C)/src/API -Iinclude/ # Object files and flags OBJECTS := $(C_SRC:.c=.o) OBJ_FLAGS := -c +OBJ_NEW := $(C_SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o) # Shared lib files and flags SO_NAME := libbinary_c_api.so -SO_FLAGS := -shared -o +SO_FLAGS := -shared # To create python shared library PY_EXEC := python3 PY_SETUP := setup.py PY_OPTIONS := build_ext --inplace - all: - $(CC) -DBINARY_C=$(BINARY_C) $(CFLAGS) $(INCDIRS) $(C_SRC) $(OBJ_FLAGS) $(LIBS) - $(CC) -DBINARY_C=$(BINARY_C) $(SO_FLAGS) $(SO_NAME) $(OBJECTS) - $(PY_EXEC) $(PY_SETUP) $(PY_OPTIONS) + $(CC) -DBINARY_C=$(BINARY_C) $(CFLAGS) $(INCDIRS) $(C_SRC) -o $(OBJECTS) $(OBJ_FLAGS) $(LIBS) + $(CC) -DBINARY_C=$(BINARY_C) $(SO_FLAGS) -o $(SO_NAME) $(OBJECTS) +# $(PY_EXEC) $(PY_SETUP) $(PY_OPTIONS) test: @echo Objects: $(OBJECTS) @@ -49,7 +56,9 @@ test: @echo C_SRC: $(C_SRC) @echo CFLAGS: $(CFLAGS) @echo INCDIRS: $(INCDIRS) + @echo OBJS_NEW: $(OBJ_NEW) + clean: - rm -f *.o *.so - rm -rf build/ + $(RM) -f *.o *.so + $(RM) -r build/ \ No newline at end of file diff --git a/binary_c_python.h b/include/binary_c_python.h similarity index 100% rename from binary_c_python.h rename to include/binary_c_python.h diff --git a/setup.py b/setup.py index 84868603a..c955c7583 100644 --- a/setup.py +++ b/setup.py @@ -67,6 +67,7 @@ setup( include_dirs=[ os.environ["BINARY_C"] + "/src", os.environ["BINARY_C"] + "/src/API", + 'include', ] + binary_c_incdirs, library_dirs=[os.environ["BINARY_C"] + "/src", "./"] + binary_c_libdirs, diff --git a/src/binary_c_python_api.c b/src/binary_c_python_api.c new file mode 100644 index 000000000..98aa26883 --- /dev/null +++ b/src/binary_c_python_api.c @@ -0,0 +1,242 @@ +#include "binary_c_python.h" +#include <time.h> +#include <sys/timeb.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + + +/* + * apitest + * + * Short test programme to throw random binary systems at binary_c's + * library via its API. + * + * Note that it looks more complicated than it is because I have included + * code to capture binary_c's stdout stream and output it here. + * + * This code sends output to stderr : you should use apitest.sh to run it + * and hence force output to your terminal's stdout. + * + * Output lines: + * + * APITEST .... is information about what this code is doing. + * STATUS .... is information about the binary system. + * BINARY_C .... is output from binary_c (see iterate_logging.c etc.) + * which would have gone to stdout + * + * If you define the NO_OUTPUT macro, there will be no output except + * the memory allocation and test system information. This is useful for speed tests, + * but note that you may end up in a race condition where the pipe which replaces + * stdout's buffer fills and hence the code stops. + * + * Note: + * I have tested this with gcc 4.7.2 (Ubuntu 12.10) only. + */ + +// #define _CAPTURE +#ifdef _CAPTURE +static void show_stdout(void); +static void capture_stdout(void); +#endif + +/* global variables */ +int out_pipe[2]; +int stdoutwas; + +int run_binary(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, + NULL, + NULL, + &store, + &argstring, + -1); + + /* 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; + + /* 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,TRUE,TRUE,FALSE,FALSE); + binary_c_free_store_contents(store); + + return 0; +} + +int run_binary_custom_logging(char * argstring, + long int func_memaddr, + 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, + NULL, + NULL, + &store, + &argstring, + -1); + + /* 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; + stardata->preferences->custom_output_function = (void*)(struct stardata_t *)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,TRUE,TRUE,FALSE,FALSE); + binary_c_free_store_contents(store); + + return 0; +} + +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, + NULL, + NULL, + &store, + &empty_str, + -1); + + /* 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,TRUE,TRUE,FALSE,FALSE); + binary_c_free_store_contents(store); + + return 0; +} + +int run_binary_with_logfile(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, + NULL, + NULL, + &store, + &argstring, + -1); + + /* output to strings */ + stardata->preferences->internal_buffering = INTERNAL_BUFFERING_STORE; + stardata->preferences->batchmode = BATCHMODE_LIBRARY; + + /* 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,TRUE,TRUE,FALSE,FALSE); + binary_c_free_store_contents(store); + return 0; +} \ No newline at end of file -- GitLab