summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-31 15:51:05 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-31 15:51:05 +0100
commit63016ce5c71019de315434de3e91adbf535d4986 (patch)
treeb2368aecbbc790a600f7dfebfaabc8c28fa806b0 /src/config
parentb9952b4938da95de07bff748cfd6d2c7e8471796 (diff)
Still working on it...
Diffstat (limited to 'src/config')
-rw-r--r--src/config/config_file.c149
-rw-r--r--src/config/parameters/parameters.c (renamed from src/config/parameters.c)208
-rw-r--r--src/config/parameters/parameters_accessors.c60
3 files changed, 217 insertions, 200 deletions
diff --git a/src/config/config_file.c b/src/config/config_file.c
index ad060a5..2e5ef0c 100644
--- a/src/config/config_file.c
+++ b/src/config/config_file.c
@@ -1,3 +1,4 @@
+/**** POSIX *******************************************************************/
#include <errno.h>
#include <string.h>
#include <stdio.h>
@@ -6,38 +7,27 @@
#include <sys/time.h>
-#include "error.h"
-#include "pervasive.h"
-#include "axis.h"
-#include "config.h"
+/**** RELABSD *****************************************************************/
+#include <relabsd/debug.h>
+
+#include <relabsd/config/config_file.h>
#ifndef RELABSD_OPTION_MAX_SIZE
#define RELABSD_OPTION_MAX_SIZE 64
#endif
-/*
- * "errno is never set to zero by any system call or library function."
- * This file makes use of this, by setting it to zero and checking if
- * it was modified after calling an function (I'm guessing this is common
- * practice, but I think it's worth explaining).
- * Following the principle of least astonishment, if a function sets errno to
- * zero, it will not return before setting it back either to its previous
- * value or to a arbitrary nonzero value.
- */
+/******************************************************************************/
+/**** LOCAL FUNCTIONS *********************************************************/
+/******************************************************************************/
/*
* Returns -1 on (fatal) error,
* 0 on EOF,
* 1 on newline.
*/
-static int reach_next_line_or_eof (FILE * const f)
+static int reach_next_line_or_eof (FILE f [const restrict static 1])
{
- int prev_errno;
char c;
- prev_errno = errno;
-
- errno = 0;
-
c = (char) getc(f);
while ((c != '\n') && c != EOF)
@@ -45,21 +35,22 @@ static int reach_next_line_or_eof (FILE * const f)
c = (char) getc(f);
}
- if (errno != 0)
+ if (ferror(f))
{
- RELABSD_FATAL
+ /*
+ * The 'ferror' function's manual specifically states that it does not
+ * sets errno. There is no mention of errno in the 'getc' function's
+ * either, so I am assuming that errno cannot be used to indicate the
+ * error.
+ */
+ RELABSD_S_FATAL
(
- "[CONFIG] Error while attempting to reach EOF or next line: %s.",
- strerror(errno)
+ "[CONFIG] Error while attempting to reach EOF or next line: %s."
);
- errno = prev_errno;
-
return -1;
}
- errno = prev_errno;
-
if (c == EOF)
{
return 0;
@@ -643,6 +634,7 @@ static int parse_options
return 0;
}
+
int relabsd_config_parse
(
struct relabsd_config * const conf,
@@ -681,106 +673,6 @@ int relabsd_config_parse
return 0;
}
-static int direct_filter
-(
- struct relabsd_config_axis * const axis,
- int * const value
-)
-{
- if (abs(*value - axis->previous_value) <= axis->fuzz)
- {
- if (axis->option[RELABSD_REAL_FUZZ_OPTION])
- {
- axis->previous_value = *value;
- }
-
- return -1;
- }
-
- if (*value < axis->min)
- {
- *value = axis->min;
- }
- else if (*value > axis->max)
- {
- *value = axis->max;
- }
- else if (abs(*value) <= axis->flat)
- {
- *value = 0;
- }
-
- if (*value == axis->previous_value)
- {
- return -1;
- }
-
- axis->previous_value = *value;
-
- return 1;
-}
-
-static int rel_to_abs_filter
-(
- struct relabsd_config_axis * const axis,
- int * const value
-)
-{
- long int guard;
-
- guard = (((long int) axis->previous_value) + ((long int) *value));
-
- if (guard < ((long int) INT_MIN))
- {
- guard = ((long int) INT_MIN);
- }
- else if (guard > ((long int) INT_MAX))
- {
- guard = ((long int) INT_MAX);
- }
-
- *value = (int) guard;
-
- if (axis->option[RELABSD_FRAMED_OPTION])
- {
- if (*value < axis->min)
- {
- *value = axis->min;
- }
- else if (*value > axis->max)
- {
- *value = axis->max;
- }
-
- if (*value == axis->previous_value)
- {
- return 0;
- }
-
- axis->previous_value = *value;
-
- return 1;
- }
- else
- {
- if (*value == axis->previous_value)
- {
- return 0;
- }
-
- axis->previous_value = *value;
-
- if ((*value < axis->min) || (*value > axis->max))
- {
- return 0;
- }
- else
- {
- return 1;
- }
- }
-}
-
int relabsd_config_filter
(
struct relabsd_config * const conf,
@@ -805,6 +697,9 @@ int relabsd_config_filter
}
}
+/******************************************************************************/
+/**** EXPORTED FUNCTIONS ******************************************************/
+/******************************************************************************/
void relabsd_config_get_absinfo
(
const struct relabsd_config * const conf,
diff --git a/src/config/parameters.c b/src/config/parameters/parameters.c
index 5e79fa2..c8db4fa 100644
--- a/src/config/parameters.c
+++ b/src/config/parameters/parameters.c
@@ -14,50 +14,6 @@
/******************************************************************************/
/**** LOCAL FUNCTIONS *********************************************************/
/******************************************************************************/
-static void print_usage (const char exec [const restrict static 1])
-{
- printf
- (
- "USAGE: %s <MODE> [<OPTION>+]\n\n"
-
- "<MODE>:\n"
- "\t[-? | --compatible] <physical_device_file>:\n"
- "\t\tDevice compatibility test.\n\n"
-
- "\t[-c | --client] <server_file>:\n"
- "\t\tSends the commands to a given server instance.\n\n"
-
- "\t[-s | --server] <server_file> <physical_device_file>:\n"
- "\t\tCreates a named server instance.\n\n"
-
- "\t[-1 | --self] <physical_device_file>:\n"
- "\t\tCreates a unnamed server instance.\n\n"
-
- "<OPTION>:\n"
- "\t[-d | --daemon]:\n"
- "\t\tRuns server instance in the background.\n\n"
-
- "\t[-n | --name] <relabsd_device_name>:\n"
- "\t\tNames the virtual device.\n\n"
-
- "\t[-t | --timeout] <timeout_in_ms>:\n"
- "\t\tSets a zeroing timeout (0 to disable).\n\n"
-
- "\t[-a | --axis] <name> <min> <max> <fuzz> <flat> <resolution> "
- "<options>:\n"
- "\t\t(Re)defines an axis.\n\n"
-
- "\t[-m | --mod-axis] <name> <min> <max> <fuzz> <flat> <resolution> "
- "<signed_options>:\n"
- "\t\tModifies an axis (use + and - signs for the options).\n\n"
-
- "\t[-f | --config] <config_file>"
- "<options>:\n"
- "\t\t(Re)defines an axis.\n",
- exec
- );
-}
-
static int parse_axis
(
const int argc,
@@ -135,14 +91,14 @@ int relabsd_parameters_parse_execution_mode
(
const int argc,
const char * argv [const restrict static argc],
- struct relabsd_parameters params [const restrict static 1]
+ struct relabsd_parameters parameters [const restrict static 1]
)
{
RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsing exec mode...");
if (argc < 3)
{
- print_usage(argv[0]);
+ relabsd_parameters_print_usage(argv[0]);
return -1;
}
@@ -153,9 +109,9 @@ int relabsd_parameters_parse_execution_mode
|| RELABSD_STRING_EQUALS("--compatibility", argv[1])
)
{
- params->mode = RELABSD_PARAMETERS_COMPATIBILITY_TEST_MODE;
- params->physical_device_name = argv[2];
- params->read_argc = 2;
+ parameters->mode = RELABSD_PARAMETERS_COMPATIBILITY_TEST_MODE;
+ parameters->physical_device_name = argv[2];
+ parameters->read_argc = 2;
}
else if
(
@@ -163,10 +119,10 @@ int relabsd_parameters_parse_execution_mode
|| RELABSD_STRING_EQUALS("--client", argv[1])
)
{
- params->mode = RELABSD_PARAMETERS_CLIENT_MODE;
- params->communication_node_name = argv[2];
- params->physical_device_name = (char *) NULL;
- params->read_argc = 2;
+ 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
(
@@ -174,10 +130,10 @@ int relabsd_parameters_parse_execution_mode
|| RELABSD_STRING_EQUALS("--server", argv[1])
)
{
- params->mode = RELABSD_PARAMETERS_SERVER_MODE;
- params->communication_node_name = argv[2];
- params->physical_device_name = argv[3];
- params->read_argc = 3;
+ parameters->mode = RELABSD_PARAMETERS_SERVER_MODE;
+ parameters->communication_node_name = argv[2];
+ parameters->physical_device_name = argv[3];
+ parameters->read_argc = 3;
}
else if
(
@@ -185,14 +141,14 @@ int relabsd_parameters_parse_execution_mode
|| RELABSD_STRING_EQUALS("--self", argv[1])
)
{
- params->mode = RELABSD_PARAMETERS_SERVER_MODE;
- params->communication_node_name = (char *) NULL;
- params->physical_device_name = argv[2];
- params->read_argc = 2;
+ parameters->mode = RELABSD_PARAMETERS_SERVER_MODE;
+ parameters->communication_node_name = (char *) NULL;
+ parameters->physical_device_name = argv[2];
+ parameters->read_argc = 2;
}
else
{
- print_usage(argv[0]);
+ relabsd_parameters_print_usage(argv[0]);
return -1;
}
@@ -205,15 +161,15 @@ int relabsd_parameters_parse_execution_mode
int relabsd_parameters_parse_options
(
const int argc,
- const char * argv [const restrict static argc],
- struct relabsd_parameters params [const restrict static 1]
+ 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...");
- set_default_options(params);
+ relabsd_parameters_initialize_options(parameters);
/*
* i = (params->read_argc + 1) because reading 2 params is actually reaching
@@ -252,7 +208,7 @@ int relabsd_parameters_parse_options
}
++i;
- params->name = argv[i];
+ params->device_name = argv[i];
}
else if
(
@@ -263,7 +219,7 @@ int relabsd_parameters_parse_options
if (argc == i)
{
RELABSD_FATAL("Missing value for \"%s\" <OPTION>.", argv[i]);
- print_usage(argv[0]);
+ relabsd_parameters_print_usage(argv[0]);
return -1;
}
@@ -284,7 +240,7 @@ int relabsd_parameters_parse_options
INT_MAX
);
- print_usage(argv[0]);
+ relabsd_parameters_print_usage(argv[0]);
return -1;
}
@@ -298,7 +254,7 @@ int relabsd_parameters_parse_options
if (argc == i)
{
RELABSD_FATAL("Missing values for \"%s\" <OPTION>.", argv[i]);
- print_usage(argv[0]);
+ relabsd_parameters_print_usage(argv[0]);
return -1;
}
@@ -307,7 +263,7 @@ int relabsd_parameters_parse_options
if (parse_axis((argc - i), (argv + i), params->axes) < 0)
{
- print_usage(argv[0]);
+ relabsd_parameters_print_usage(argv[0]);
return -1;
}
@@ -321,18 +277,18 @@ int relabsd_parameters_parse_options
if (argc == i)
{
RELABSD_FATAL("Missing value for \"%s\" <OPTION>.", argv[i]);
- print_usage(argv[0]);
+ relabsd_parameters_print_usage(argv[0]);
return -1;
}
++i;
- params->config_file = argv[i];
+ params->configuration_file = argv[i];
}
else
{
RELABSD_FATAL("Unknown <OPTION> \"%s\".", argv[i]);
- print_usage(argv[0]);
+ relabsd_parameters_print_usage(argv[0]);
return -1;
}
@@ -342,3 +298,109 @@ int relabsd_parameters_parse_options
return 0;
}
+
+int relabsd_parameters_argument_count_for
+(
+ const char option [const restrict static 1],
+ int result [const restrict static 1]
+)
+{
+ if
+ (
+ RELABSD_STRING_EQUALS("-n", option)
+ || RELABSD_STRING_EQUALS("--name", option)
+ )
+ {
+ *result = 0;
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-n", option)
+ || RELABSD_STRING_EQUALS("--name", option)
+ )
+ {
+ *result = 1;
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-t", option)
+ || RELABSD_STRING_EQUALS("--timeout", option)
+ )
+ {
+ *result = 1;
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-a", option)
+ || RELABSD_STRING_EQUALS("--axis", option)
+ )
+ {
+ *result = 7;
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-m", option)
+ || RELABSD_STRING_EQUALS("--mod-axis", option)
+ )
+ {
+ *result = 7;
+ }
+ else if
+ (
+ RELABSD_STRING_EQUALS("-f", option)
+ || RELABSD_STRING_EQUALS("--config", option)
+ )
+ {
+ *result = 1;
+ }
+ else
+ {
+ return -1;
+ }
+
+ return 0;
+}
+
+void relabsd_parameters_print_usage (const char exec [const restrict static 1])
+{
+ printf
+ (
+ "USAGE: %s <MODE> [<OPTION>+]\n\n"
+
+ "<MODE>:\n"
+ "\t[-? | --compatible] <physical_device_file>:\n"
+ "\t\tDevice compatibility test.\n\n"
+
+ "\t[-c | --client] <server_file>:\n"
+ "\t\tSends the commands to a given server instance.\n\n"
+
+ "\t[-s | --server] <server_file> <physical_device_file>:\n"
+ "\t\tCreates a named server instance.\n\n"
+
+ "\t[-1 | --self] <physical_device_file>:\n"
+ "\t\tCreates a unnamed server instance.\n\n"
+
+ "<OPTION>:\n"
+ "\t[-d | --daemon]:\n"
+ "\t\tRuns server instance in the background.\n\n"
+
+ "\t[-n | --name] <relabsd_device_name>:\n"
+ "\t\tNames the virtual device.\n\n"
+
+ "\t[-t | --timeout] <timeout_in_ms>:\n"
+ "\t\tSets a zeroing timeout (0 to disable).\n\n"
+
+ "\t[-a | --axis] <name> <min> <max> <fuzz> <flat> <resolution> "
+ "<options>:\n"
+ "\t\t(Re)defines an axis.\n\n"
+
+ "\t[-m | --mod-axis] <name> <min> <max> <fuzz> <flat> <resolution> "
+ "<signed_options>:\n"
+ "\t\tModifies an axis (use + and - signs for the options).\n\n"
+
+ "\t[-f | --config] <config_file>"
+ "<options>:\n"
+ "\t\t(Re)defines an axis.\n",
+ exec
+ );
+}
diff --git a/src/config/parameters/parameters_accessors.c b/src/config/parameters/parameters_accessors.c
new file mode 100644
index 0000000..e53cfe0
--- /dev/null
+++ b/src/config/parameters/parameters_accessors.c
@@ -0,0 +1,60 @@
+#include <relabsd/config/parameters.h>
+
+/******************************************************************************/
+/**** LOCAL FUNCTIONS *********************************************************/
+/******************************************************************************/
+
+/******************************************************************************/
+/**** EXPORTED FUNCTIONS ******************************************************/
+/******************************************************************************/
+void relabsd_parameters_initialize_options
+(
+ const struct relabsd_parameters parameters [const restrict static 1]
+)
+{
+ parameters->run_as_daemon = 0;
+ parameters->communication_node_name = (const char *) NULL;
+ parameters->device_name = (const char *) NULL;
+ parameters->physical_device_file_name = (const char *) NULL;
+ parameters->configuration_file = (const char *) NULL;
+}
+
+int relabsd_parameters_get_run_as_daemon
+(
+ const struct relabsd_parameters parameters [const restrict static 1]
+)
+{
+ return parameters->run_as_daemon;
+}
+
+const char * relabsd_parameters_get_communication_node_name
+(
+ const struct relabsd_parameters parameters [const restrict static 1]
+)
+{
+ return parameters->communication_node_name;
+}
+
+const char * relabsd_parameters_get_device_name
+(
+ const struct relabsd_parameters parameters [const restrict static 1]
+)
+{
+ return parameters->device_name;
+}
+
+const char * relabsd_parameters_get_physical_device_file_name
+(
+ const struct relabsd_parameters parameters [const restrict static 1]
+)
+{
+ return parameters->physical_device_file_name;
+}
+
+enum relabsd_parameters_run_mode relabsd_parameters_get_execution_mode
+(
+ const struct relabsd_parameters parameters [const restrict static 1]
+)
+{
+ return parameters->mode;
+}