summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-04-22 22:24:06 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-04-22 22:24:06 +0200
commit7c321d614e8d91b23434b13bfcf89274797815ec (patch)
tree58b8e4fcba63b38a052423401df413606a7e8076 /src/parameters
Initial Commit.
Diffstat (limited to 'src/parameters')
-rw-r--r--src/parameters/CMakeLists.txt7
-rw-r--r--src/parameters/parameters.c250
-rw-r--r--src/parameters/parameters.h60
-rw-r--r--src/parameters/parameters_getters.c73
-rw-r--r--src/parameters/parameters_types.h21
5 files changed, 411 insertions, 0 deletions
diff --git a/src/parameters/CMakeLists.txt b/src/parameters/CMakeLists.txt
new file mode 100644
index 0000000..2aa7ece
--- /dev/null
+++ b/src/parameters/CMakeLists.txt
@@ -0,0 +1,7 @@
+set(
+ SRC_FILES ${SRC_FILES}
+ ${CMAKE_CURRENT_SOURCE_DIR}/parameters.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/parameters_getters.c
+)
+set(SRC_FILES ${SRC_FILES} PARENT_SCOPE)
+
diff --git a/src/parameters/parameters.c b/src/parameters/parameters.c
new file mode 100644
index 0000000..63556f0
--- /dev/null
+++ b/src/parameters/parameters.c
@@ -0,0 +1,250 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <limits.h>
+
+#include "../error/error.h"
+
+#include "parameters.h"
+
+static int parse_port
+(
+ struct JH_parameters param [const restrict static 1],
+ const char argv [const restrict]
+)
+{
+ long long int input;
+ const int old_errno = errno;
+
+ errno = 0;
+
+ input = strtoll(argv, (char **) NULL, 10);
+
+ if
+ (
+ (errno != 0)
+ || (input > (long long int) USHRT_MAX)
+ || (input < 1)
+ )
+ {
+ JH_FATAL
+ (
+ stderr,
+ "Invalid or value for parameter 'port', accepted "
+ "range is "
+ "[1, %hu] (integer).",
+ USHRT_MAX
+ );
+
+ errno = old_errno;
+
+ return -1;
+ }
+
+ param->port = (unsigned short) input;
+
+ errno = old_errno;
+
+ return 0;
+}
+
+static void set_default_to_all_fields
+(
+ struct JH_parameters param [const restrict static 1]
+)
+{
+ param->socket_name = (const char *) NULL;
+ param->server = (const char *) NULL;
+ param->password = (const char *) NULL;
+ param->nick = (const char *) NULL;
+ param->username = (const char *) NULL;
+ param->realname = (const char *) NULL;
+ param->channel = (const char *) NULL;
+ param->port = 0;
+ param->use_ipv6 = 0;
+}
+
+static int is_valid
+(
+ struct JH_parameters param [const restrict static 1]
+)
+{
+ int valid;
+
+ valid = 1;
+
+ if (param->socket_name == (const char *) NULL)
+ {
+ JH_S_FATAL(stderr, "Missing parameter: Zero of One socket name.");
+
+ valid = 0;
+ }
+
+ if (param->server == (const char *) NULL)
+ {
+ JH_S_FATAL(stderr, "Missing parameter: IRC server address.");
+
+ valid = 0;
+ }
+
+ if (param->nick == (const char *) NULL)
+ {
+ JH_S_FATAL(stderr, "Missing parameter: IRC nick.");
+
+ valid = 0;
+ }
+
+ if (param->channel == (const char *) NULL)
+ {
+ JH_S_FATAL(stderr, "Missing parameter: IRC channel.");
+
+ valid = 0;
+ }
+
+ if (param->port == 0)
+ {
+ JH_S_FATAL(stderr, "Missing parameter: IRC port.");
+
+ valid = 0;
+ }
+
+ return valid;
+}
+
+static void set_parameters
+(
+ struct JH_parameters param [const restrict static 1],
+ int const argc,
+ const char * argv [const static argc]
+)
+{
+ if (argc < 2)
+ {
+ return;
+ }
+
+ param->socket_name = argv[1];
+
+ if (argc < 3)
+ {
+ return;
+ }
+
+ param->server = argv[2];
+
+ if (argc < 4)
+ {
+ return;
+ }
+
+ param->nick = argv[3];
+
+ if (argc < 5)
+ {
+ return;
+ }
+
+ param->channel = argv[4];
+
+ if (argc < 6)
+ {
+ return;
+ }
+
+ parse_port(param, argv[5]);
+}
+
+static int set_options
+(
+ struct JH_parameters param [const restrict static 1],
+ int const argc,
+ const char * argv [const static argc]
+)
+{
+ int i;
+
+ for (i = (JH_PARAMETERS_COUNT + 1); i < argc; ++i)
+ {
+
+ if
+ (
+ JH_STRING_EQUALS("-6", argv[i])
+ || JH_STRING_EQUALS("--ipv6", argv[i])
+ )
+ {
+ param->use_ipv6 = 1;
+ }
+ else if
+ (
+ JH_STRING_EQUALS("-u", argv[i])
+ || JH_STRING_EQUALS("--username", argv[i])
+ )
+ {
+ if (i == (argc - 1))
+ {
+ JH_FATAL(stderr, "Missing value for option \"%s\".", argv[i]);
+
+ return -1;
+ }
+
+ param->username = argv[++i];
+ }
+ else if
+ (
+ JH_STRING_EQUALS("-r", argv[i])
+ || JH_STRING_EQUALS("--realname", argv[i])
+ )
+ {
+ if (i == (argc - 1))
+ {
+ JH_FATAL(stderr, "Missing value for option \"%s\".", argv[i]);
+
+ return -1;
+ }
+
+ param->realname = argv[++i];
+ }
+ else if
+ (
+ JH_STRING_EQUALS("-p", argv[i])
+ || JH_STRING_EQUALS("--password", argv[i])
+ )
+ {
+ if (i == (argc - 1))
+ {
+ JH_FATAL(stderr, "Missing value for option \"%s\".", argv[i]);
+
+ return -1;
+ }
+
+ param->password = argv[++i];
+ }
+ else
+ {
+ JH_FATAL(stderr, "Unrecognized option \"%s\".", argv[i]);
+
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+int JH_parameters_initialize
+(
+ struct JH_parameters param [const restrict static 1],
+ int const argc,
+ const char * argv [const static argc]
+)
+{
+ set_default_to_all_fields(param);
+
+ set_parameters(param, argc, argv);
+
+ if (!is_valid(param))
+ {
+ return -1;
+ }
+
+ return set_options(param, argc, argv);
+}
diff --git a/src/parameters/parameters.h b/src/parameters/parameters.h
new file mode 100644
index 0000000..58fc957
--- /dev/null
+++ b/src/parameters/parameters.h
@@ -0,0 +1,60 @@
+#ifndef _JH_CLI_PARAMETERS_H_
+#define _JH_CLI_PARAMETERS_H_
+
+#include "parameters_types.h"
+
+int JH_parameters_initialize
+(
+ struct JH_parameters param [const restrict static 1],
+ int const argc,
+ const char * argv [const static argc]
+);
+
+const char * JH_parameters_get_socket_name
+(
+ const struct JH_parameters param [const restrict static 1]
+);
+
+const char * JH_parameters_get_irc_server
+(
+ const struct JH_parameters param [const restrict static 1]
+);
+
+unsigned short JH_parameters_get_irc_port
+(
+ const struct JH_parameters param [const restrict static 1]
+);
+
+/* Having it as an invocation parameter makes it readable by other users on the
+ * machine.
+ */
+const char * JH_parameters_get_irc_password
+(
+ const struct JH_parameters param [const restrict static 1]
+);
+
+const char * JH_parameters_get_irc_nick
+(
+ const struct JH_parameters param [const restrict static 1]
+);
+
+const char * JH_parameters_get_irc_username
+(
+ const struct JH_parameters param [const restrict static 1]
+);
+
+const char * JH_parameters_get_irc_realname
+(
+ const struct JH_parameters param [const restrict static 1]
+);
+
+const char * JH_parameters_get_irc_channel
+(
+ const struct JH_parameters param [const restrict static 1]
+);
+
+int JH_parameters_get_irc_is_ipv6
+(
+ const struct JH_parameters param [const restrict static 1]
+);
+#endif
diff --git a/src/parameters/parameters_getters.c b/src/parameters/parameters_getters.c
new file mode 100644
index 0000000..ee2bdee
--- /dev/null
+++ b/src/parameters/parameters_getters.c
@@ -0,0 +1,73 @@
+#include "parameters.h"
+
+const char * JH_parameters_get_socket_name
+(
+ const struct JH_parameters param [const restrict static 1]
+)
+{
+ return param->socket_name;
+}
+
+const char * JH_parameters_get_irc_server
+(
+ const struct JH_parameters param [const restrict static 1]
+)
+{
+ return param->server;
+}
+
+unsigned short JH_parameters_get_irc_port
+(
+ const struct JH_parameters param [const restrict static 1]
+)
+{
+ return param->port;
+}
+
+const char * JH_parameters_get_irc_password
+(
+ const struct JH_parameters param [const restrict static 1]
+)
+{
+ return param->password;
+}
+
+const char * JH_parameters_get_irc_nick
+(
+ const struct JH_parameters param [const restrict static 1]
+)
+{
+ return param->nick;
+}
+
+const char * JH_parameters_get_irc_username
+(
+ const struct JH_parameters param [const restrict static 1]
+)
+{
+ return param->username;
+}
+
+const char * JH_parameters_get_irc_realname
+(
+ const struct JH_parameters param [const restrict static 1]
+)
+{
+ return param->realname;
+}
+
+const char * JH_parameters_get_irc_channel
+(
+ const struct JH_parameters param [const restrict static 1]
+)
+{
+ return param->channel;
+}
+
+int JH_parameters_get_irc_is_ipv6
+(
+ const struct JH_parameters param [const restrict static 1]
+)
+{
+ return param->use_ipv6;
+}
diff --git a/src/parameters/parameters_types.h b/src/parameters/parameters_types.h
new file mode 100644
index 0000000..7d8dd1c
--- /dev/null
+++ b/src/parameters/parameters_types.h
@@ -0,0 +1,21 @@
+#ifndef _JH_CLI_PARAMETERS_TYPES_H_
+#define _JH_CLI_PARAMETERS_TYPES_H_
+
+#define JH_PARAMETERS_COUNT 5
+
+struct JH_parameters
+{
+ const char * restrict socket_name;
+
+ const char * server;
+ const char * password;
+ const char * nick;
+ const char * username;
+ const char * realname;
+ const char * channel;
+ unsigned short port;
+
+ int use_ipv6;
+};
+
+#endif