| 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); +} | 


