X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=utils_params.c;fp=utils_params.c;h=0000000000000000000000000000000000000000;hb=0ab3085f89e64eecd67d3179ea87f0463e918a10;hp=6e5dc892e377a43fb8b619772767dd1d13e02854;hpb=af2ed61b280e1ec169aba2bcb9df30ac76b006d2;p=collection4.git diff --git a/utils_params.c b/utils_params.c deleted file mode 100644 index 6e5dc89..0000000 --- a/utils_params.c +++ /dev/null @@ -1,259 +0,0 @@ -#include -#include -#include -#include -#include - -#include "utils_params.h" - -struct parameter_s -{ - char *key; - char *value; -}; -typedef struct parameter_s parameter_t; - -static parameter_t *parameters = NULL; -static size_t parameters_num = 0; -static _Bool parameters_init = 0; - -static int parameter_add (const char *key, const char *value) /* {{{ */ -{ - parameter_t *ptr; - - if (value == NULL) - return (EINVAL); - - ptr = realloc (parameters, sizeof (*parameters) * (parameters_num + 1)); - if (ptr == NULL) - return (ENOMEM); - parameters = ptr; - - ptr = parameters + parameters_num; - if (key == NULL) - { - ptr->key = NULL; - } - else - { - ptr->key = strdup (key); - if (ptr->key == NULL) - return (ENOMEM); - } - - ptr->value = strdup (value); - if (ptr->value == NULL) - { - free (ptr->key); - return (ENOMEM); - } - - parameters_num++; - return (0); -} /* }}} int parameter_add */ - -static char *parameter_lookup (const char *key) /* {{{ */ -{ - size_t i; - - for (i = 0; i < parameters_num; i++) - { - if ((key == NULL) && (parameters[i].key == NULL)) - return (parameters[i].value); - else if ((key != NULL) && (parameters[i].key != NULL) - && (strcmp (key, parameters[i].key) == 0)) - return (parameters[i].value); - } - - return (NULL); -} /* }}} char *parameter_lookup */ - -static char *uri_unescape (char *string) /* {{{ */ -{ - char *in; - char *out; - - if (string == NULL) - return (NULL); - - in = string; - out = string; - - while (*in != 0) - { - if (*in == '+') - { - *out = ' '; - } - else if ((in[0] == '%') - && isxdigit ((int) in[1]) && isxdigit ((int) in[2])) - { - char tmpstr[3]; - char *endptr; - long value; - - tmpstr[0] = in[1]; - tmpstr[1] = in[2]; - tmpstr[2] = 0; - - errno = 0; - endptr = NULL; - value = strtol (tmpstr, &endptr, /* base = */ 16); - if ((endptr == tmpstr) || (errno != 0)) - { - *out = '?'; - } - else - { - *out = (char) value; - } - - in += 2; - } - else - { - *out = *in; - } - - in++; - out++; - } /* while (*in != 0) */ - - *out = 0; - return (string); -} /* }}} char *uri_unescape */ - -static int parse_keyval (char *keyval) /* {{{ */ -{ - char *key; - char *val; - - val = strchr (keyval, '='); - if (val == NULL) - { - key = NULL; - val = keyval; - } - else - { - key = keyval; - *val = 0; - val++; - } - - parameter_add (uri_unescape (key), uri_unescape (val)); - - return (0); -} /* }}} int parse_keyval */ - -static int parse_query_string (char *query_string) /* {{{ */ -{ - char *dummy; - char *keyval; - - if (query_string == NULL) - return (EINVAL); - - dummy = query_string; - while ((keyval = strtok (dummy, ";&")) != NULL) - { - dummy = NULL; - parse_keyval (keyval); - } - - return (0); -} /* }}} int parse_query_string */ - -int param_init (void) /* {{{ */ -{ - const char *query_string; - char *copy; - int status; - - if (parameters_init) - return (0); - - query_string = getenv ("QUERY_STRING"); - if (query_string == NULL) - return (ENOENT); - - copy = strdup (query_string); - if (copy == NULL) - return (ENOMEM); - - status = parse_query_string (copy); - free (copy); - - parameters_init = 1; - - return (status); -} /* }}} int param_init */ - -void param_finish (void) /* {{{ */ -{ - size_t i; - - if (!parameters_init) - return; - - for (i = 0; i < parameters_num; i++) - { - free (parameters[i].key); - free (parameters[i].value); - } - free (parameters); - - parameters = NULL; - parameters_num = 0; - parameters_init = 0; -} /* }}} void param_finish */ - -const char *param (const char *key) /* {{{ */ -{ - param_init (); - - return (parameter_lookup (key)); -} /* }}} const char *param */ - -int uri_escape (char *dst, const char *src, size_t size) /* {{{ */ -{ - size_t in; - size_t out; - - in = 0; - out = 0; - while (42) - { - if (src[in] == 0) - { - dst[out] = 0; - return (0); - } - else if ((src[in] < 32) - || (src[in] == '&') - || (src[in] == ';') - || (src[in] >= 128)) - { - char esc[4]; - - if ((size - out) < 4) - break; - - snprintf (esc, sizeof (esc), "%%%02x", (unsigned int) src[in]); - dst[out] = esc[0]; - dst[out+1] = esc[1]; - dst[out+2] = esc[2]; - - out += 3; - in++; - } - else - { - dst[out] = src[in]; - out++; - in++; - } - } /* while (42) */ -} /* }}} int uri_escape */ - -/* vim: set sw=2 sts=2 et fdm=marker : */