+ tmp = realloc (pl->parameters,
+ sizeof (*pl->parameters) * (pl->parameters_num + 1));
+ if (tmp == NULL)
+ return (ENOMEM);
+ pl->parameters = tmp;
+ tmp = pl->parameters + pl->parameters_num;
+
+ memset (tmp, 0, sizeof (*tmp));
+ tmp->key = strdup (key);
+ if (tmp->key == NULL)
+ return (ENOMEM);
+
+ tmp->value = strdup (value);
+ if (tmp->value == NULL)
+ {
+ free (tmp->key);
+ return (ENOMEM);
+ }
+
+ pl->parameters_num++;
+
+ return (0);
+} /* }}} int param_add */
+
+static int param_delete (param_list_t *pl, /* {{{ */
+ const char *name)
+{
+ size_t i;
+
+ if ((pl == NULL) || (name == NULL))
+ return (EINVAL);
+
+ for (i = 0; i < pl->parameters_num; i++)
+ if (strcasecmp (pl->parameters[i].key, name) == 0)
+ break;
+
+ if (i >= pl->parameters_num)
+ return (ENOENT);
+
+ if (i < (pl->parameters_num - 1))
+ {
+ parameter_t p;
+
+ p = pl->parameters[i];
+ pl->parameters[i] = pl->parameters[pl->parameters_num - 1];
+ pl->parameters[pl->parameters_num - 1] = p;
+ }
+
+ pl->parameters_num--;
+ free (pl->parameters[pl->parameters_num].key);
+ free (pl->parameters[pl->parameters_num].value);
+
+ return (0);
+} /* }}} int param_delete */
+
+int param_set (param_list_t *pl, const char *name, /* {{{ */
+ const char *value)
+{
+ parameter_t *p;
+ char *value_copy;
+ size_t i;
+
+ if ((pl == NULL) || (name == NULL))
+ return (EINVAL);
+
+ if (value == NULL)
+ return (param_delete (pl, name));
+
+ p = NULL;
+ for (i = 0; i < pl->parameters_num; i++)
+ {
+ if (strcasecmp (pl->parameters[i].key, name) == 0)
+ {
+ p = pl->parameters + i;
+ break;
+ }
+ }
+
+ if (p == NULL)
+ return (param_add (pl, name, value));
+
+ value_copy = strdup (value);
+ if (value_copy == NULL)
+ return (ENOMEM);
+
+ free (p->value);
+ p->value = value_copy;
+
+ return (0);
+} /* }}} int param_set */
+
+const char *param_as_string (param_list_t *pl) /* {{{ */
+{
+ char buffer[4096];
+ char key[2048];
+ char value[2048];
+ size_t i;
+
+ if (pl == NULL)
+ return (NULL);
+
+ buffer[0] = 0;
+ for (i = 0; i < pl->parameters_num; i++)
+ {
+ uri_escape_copy (key, pl->parameters[i].key, sizeof (key));
+ uri_escape_copy (value, pl->parameters[i].value, sizeof (value));
+
+ if (i != 0)
+ strlcat (buffer, ";", sizeof (buffer));
+ strlcat (buffer, key, sizeof (buffer));
+ strlcat (buffer, "=", sizeof (buffer));
+ strlcat (buffer, value, sizeof (buffer));
+ }
+
+ return (strdup (buffer));
+} /* }}} char *param_as_string */