+static int parse_aggregate (const char *aggr) /* {{{ */
+{
+ char *aggr_copy;
+ char *dummy;
+ char *a;
+
+ aggr_copy = strdup (aggr);
+ if (aggr_copy == NULL)
+ return (ENOMEM);
+
+ free (aggregation_types);
+ aggregation_types = NULL;
+ aggregation_types_num = 0;
+
+ dummy = aggr_copy;
+ while ((a = strtok (dummy, ",")) != NULL)
+ {
+ int status;
+
+ dummy = NULL;
+
+ status = aggregation_type_add (a);
+ if (status != 0)
+ exit_usage (EXIT_FAILURE);
+ } /* while (strtok) */
+
+ free (aggr_copy);
+
+ return (0);
+} /* }}} int parse_group */
+
+static int parse_group (const char *group) /* {{{ */
+{
+ char *group_copy;
+ char *dummy;
+ char *g;
+
+ group_copy = strdup (group);
+ if (group_copy == NULL)
+ return (ENOMEM);
+
+ grouping = 0;
+
+ dummy = group_copy;
+ while ((g = strtok (dummy, ",")) != NULL)
+ {
+ int pos = 0;
+
+ dummy = NULL;
+
+ if (strcasecmp ("host", g) == 0)
+ pos = 0;
+ else if (strcasecmp ("plugin", g) == 0)
+ pos = 1;
+ else if ((strcasecmp ("plugin_instance", g) == 0)
+ || (strcasecmp ("plugininstance", g) == 0)
+ || (strcasecmp ("pinst", g) == 0))
+ pos = 2;
+ else if (strcasecmp ("type", g) == 0)
+ pos = 3;
+ else if ((strcasecmp ("type_instance", g) == 0)
+ || (strcasecmp ("typeinstance", g) == 0)
+ || (strcasecmp ("tinst", g) == 0))
+ pos = 4;
+ else
+ {
+ fprintf (stderr, "Unknown grouping field: \"%s\"\n", g);
+ exit_usage (EXIT_FAILURE);
+ }
+
+ grouping |= 1 << pos;
+ } /* while (strtok) */
+
+ free (group_copy);
+
+ return (0);
+} /* }}} int parse_group */
+
+static int parse_arg (const char *arg) /* {{{ */
+{
+ if (arg == NULL)
+ return (EINVAL);
+ else if (strncasecmp ("host=", arg, strlen ("host=")) == 0)
+ re_host = arg + strlen ("host=");
+ else if (strncasecmp ("plugin=", arg, strlen ("plugin=")) == 0)
+ re_plugin = arg + strlen ("plugin=");
+ else if (strncasecmp ("plugin_instance=", arg, strlen ("plugin_instance=")) == 0)
+ re_plugin_instance = arg + strlen ("plugin_instance=");
+ else if (strncasecmp ("type=", arg, strlen ("type=")) == 0)
+ re_type = arg + strlen ("type=");
+ else if (strncasecmp ("type_instance=", arg, strlen ("type_instance=")) == 0)
+ re_type_instance = arg + strlen ("type_instance=");
+
+ /* Grouping */
+ else if (strncasecmp ("group=", arg, strlen ("group=")) == 0)
+ return (parse_group (arg + strlen ("group=")));
+
+ /* Aggregations */
+ else if (strncasecmp ("aggregate=", arg, strlen ("aggregate=")) == 0)
+ return (parse_aggregate (arg + strlen ("aggregate=")));
+
+ /* Some alternative spellings to make it easier to guess a working argument
+ * name: */
+ else if (strncasecmp ("hostname=", arg, strlen ("hostname=")) == 0)
+ re_host = arg + strlen ("hostname=");
+ else if (strncasecmp ("plugininstance=", arg, strlen ("plugininstance=")) == 0)
+ re_plugin_instance = arg + strlen ("plugininstance=");
+ else if (strncasecmp ("typeinstance=", arg, strlen ("typeinstance=")) == 0)
+ re_type_instance = arg + strlen ("typeinstance=");
+ else if (strncasecmp ("pinst=", arg, strlen ("pinst=")) == 0)
+ re_plugin_instance = arg + strlen ("pinst=");
+ else if (strncasecmp ("tinst=", arg, strlen ("tinst=")) == 0)
+ re_type_instance = arg + strlen ("tinst=");
+ else if (strncasecmp ("aggr=", arg, strlen ("aggr=")) == 0)
+ return (parse_aggregate (arg + strlen ("aggr=")));
+
+ /* Don't know what that is ... */
+ else
+ {
+ fprintf (stderr, "Unknown argument: \"%s\"\n", arg);
+ exit_usage (EXIT_FAILURE);
+ }
+
+ return (0);
+} /* }}} int parse_arg */
+