| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-04-22 22:24:06 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-04-22 22:24:06 +0200 |
| commit | 7c321d614e8d91b23434b13bfcf89274797815ec (patch) | |
| tree | 58b8e4fcba63b38a052423401df413606a7e8076 /src/parameters | |
Initial Commit.
Diffstat (limited to 'src/parameters')
| -rw-r--r-- | src/parameters/CMakeLists.txt | 7 | ||||
| -rw-r--r-- | src/parameters/parameters.c | 250 | ||||
| -rw-r--r-- | src/parameters/parameters.h | 60 | ||||
| -rw-r--r-- | src/parameters/parameters_getters.c | 73 | ||||
| -rw-r--r-- | src/parameters/parameters_types.h | 21 |
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 |


