| 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/parameters.c | |
Initial Commit.
Diffstat (limited to 'src/parameters/parameters.c')
| -rw-r--r-- | src/parameters/parameters.c | 250 |
1 files changed, 250 insertions, 0 deletions
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); +} |


