From 63016ce5c71019de315434de3e91adbf535d4986 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Tue, 31 Dec 2019 15:51:05 +0100 Subject: Still working on it... --- src/config/parameters/parameters.c | 406 +++++++++++++++++++++++++++ src/config/parameters/parameters_accessors.c | 60 ++++ 2 files changed, 466 insertions(+) create mode 100644 src/config/parameters/parameters.c create mode 100644 src/config/parameters/parameters_accessors.c (limited to 'src/config/parameters') diff --git a/src/config/parameters/parameters.c b/src/config/parameters/parameters.c new file mode 100644 index 0000000..c8db4fa --- /dev/null +++ b/src/config/parameters/parameters.c @@ -0,0 +1,406 @@ +/**** POSIX *******************************************************************/ +#include + +/**** RELABSD *****************************************************************/ +#include +#include + +#include + +#include + +#include + +/******************************************************************************/ +/**** LOCAL FUNCTIONS *********************************************************/ +/******************************************************************************/ +static int parse_axis +( + const int argc, + const char * argv [const restrict static argc], + struct relabsd_axis axes [const restrict static RELABSD_AXIS_AXES_COUNT] +) +{ + enum relabsd_axis_name axis_name; + struct relabsd_axis *axis; + + if (argc < 7) + { + RELABSD_S_FATAL("7 parameters must be provided for axis definition."); + + return -1; + } + + axis_index = relabsd_axis_from_name(argv[0]); + + if (axis_index == RELABSD_UNKNOWN) + { + RELABSD_FATAL("Unknown axis \"%s\".", argv[0]); + + return -1; + } + + axis = (axes + axis_index); + + if (relabsd_util_parse_int(argv[1], INT_MIN, INT_MAX, &(axis->min)) < 0) + { + RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); + + return -1; + } + + if (relabsd_util_parse_int(argv[2], INT_MIN, INT_MAX, &(axis->max)) < 0) + { + RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); + + return -1; + } + + if (relabsd_util_parse_int(argv[3], INT_MIN, INT_MAX, &(axis->fuzz)) < 0) + { + RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); + + return -1; + } + + if (relabsd_util_parse_int(argv[4], INT_MIN, INT_MAX, &(axis->flat)) < 0) + { + RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); + + return -1; + } + + if + ( + relabsd_util_parse_int(argv[5], INT_MIN, INT_MAX, &(axis->resolution)) + < 0 + ) + { + RELABSD_FATAL("Invalid value for axis \"%s\".", argv[0]); + + return -1; + } + + return 0; +} + +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ +int relabsd_parameters_parse_execution_mode +( + const int argc, + const char * argv [const restrict static argc], + struct relabsd_parameters parameters [const restrict static 1] +) +{ + RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsing exec mode..."); + + if (argc < 3) + { + relabsd_parameters_print_usage(argv[0]); + + return -1; + } + + if + ( + RELABSD_STRING_EQUALS("-?", argv[1]) + || RELABSD_STRING_EQUALS("--compatibility", argv[1]) + ) + { + parameters->mode = RELABSD_PARAMETERS_COMPATIBILITY_TEST_MODE; + parameters->physical_device_name = argv[2]; + parameters->read_argc = 2; + } + else if + ( + RELABSD_STRING_EQUALS("-c", argv[1]) + || RELABSD_STRING_EQUALS("--client", argv[1]) + ) + { + parameters->mode = RELABSD_PARAMETERS_CLIENT_MODE; + parameters->communication_node_name = argv[2]; + parameters->physical_device_name = (const char *) NULL; + parameters->read_argc = 2; + } + else if + ( + RELABSD_STRING_EQUALS("-s", argv[1]) + || RELABSD_STRING_EQUALS("--server", argv[1]) + ) + { + parameters->mode = RELABSD_PARAMETERS_SERVER_MODE; + parameters->communication_node_name = argv[2]; + parameters->physical_device_name = argv[3]; + parameters->read_argc = 3; + } + else if + ( + RELABSD_STRING_EQUALS("-1", argv[1]) + || RELABSD_STRING_EQUALS("--self", argv[1]) + ) + { + parameters->mode = RELABSD_PARAMETERS_SERVER_MODE; + parameters->communication_node_name = (char *) NULL; + parameters->physical_device_name = argv[2]; + parameters->read_argc = 2; + } + else + { + relabsd_parameters_print_usage(argv[0]); + + return -1; + } + + RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsed exec mode."); + + return 0; +} + +int relabsd_parameters_parse_options +( + const int argc, + const char * const argv [const restrict static argc], + struct relabsd_parameters parameters [const restrict static 1] +) +{ + int i; + + RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsing options..."); + + relabsd_parameters_initialize_options(parameters); + + /* + * i = (params->read_argc + 1) because reading 2 params is actually reaching + * the [2] element of the array, since the [0] element is the executable + * name. + */ + for (i = (params->read_argc + 1); i < argc; ++i) + { + if + ( + RELABSD_STRING_EQUALS("-d", argv[i]) + || RELABSD_STRING_EQUALS("--daemon", argv[i]) + ) + { + params->run_as_daemon = 1; + + if (params->node == ((char *) NULL)) + { + RELABSD_S_WARNING + ( + "Running as a daemon without any communication file." + ); + } + } + else if + ( + RELABSD_STRING_EQUALS("-n", argv[i]) + || RELABSD_STRING_EQUALS("--name", argv[i]) + ) + { + if (argc == i) + { + RELABSD_FATAL("Missing value for \"%s\"