7 #include "utils_params.h"
14 typedef struct parameter_s parameter_t;
16 static parameter_t *parameters = NULL;
17 static size_t parameters_num = 0;
18 static _Bool parameters_init = 0;
20 static int parameter_add (const char *key, const char *value) /* {{{ */
27 ptr = realloc (parameters, sizeof (*parameters) * (parameters_num + 1));
32 ptr = parameters + parameters_num;
39 ptr->key = strdup (key);
44 ptr->value = strdup (value);
45 if (ptr->value == NULL)
53 } /* }}} int parameter_add */
55 static char *parameter_lookup (const char *key) /* {{{ */
59 for (i = 0; i < parameters_num; i++)
61 if ((key == NULL) && (parameters[i].key == NULL))
62 return (parameters[i].value);
63 else if ((key != NULL) && (parameters[i].key != NULL)
64 && (strcmp (key, parameters[i].key) == 0))
65 return (parameters[i].value);
69 } /* }}} char *parameter_lookup */
71 static char *uri_unescape (char *string) /* {{{ */
88 else if ((in[0] == '%')
89 && isxdigit ((int) in[1]) && isxdigit ((int) in[2]))
101 value = strtol (tmpstr, &endptr, /* base = */ 16);
102 if ((endptr == tmpstr) || (errno != 0))
120 } /* while (*in != 0) */
124 } /* }}} char *uri_unescape */
126 static int parse_keyval (char *keyval) /* {{{ */
131 val = strchr (keyval, '=');
144 parameter_add (uri_unescape (key), uri_unescape (val));
147 } /* }}} int parse_keyval */
149 static int parse_query_string (char *query_string) /* {{{ */
154 if (query_string == NULL)
157 dummy = query_string;
158 while ((keyval = strtok (dummy, ";&")) != NULL)
161 parse_keyval (keyval);
165 } /* }}} int parse_query_string */
167 int param_init (void) /* {{{ */
169 const char *query_string;
176 query_string = getenv ("QUERY_STRING");
177 if (query_string == NULL)
180 copy = strdup (query_string);
184 status = parse_query_string (copy);
190 } /* }}} int param_init */
192 void param_finish (void) /* {{{ */
196 if (!parameters_init)
199 for (i = 0; i < parameters_num; i++)
201 free (parameters[i].key);
202 free (parameters[i].value);
209 } /* }}} void param_finish */
211 const char *param (const char *key) /* {{{ */
215 return (parameter_lookup (key));
216 } /* }}} const char *param */
218 int uri_escape (char *dst, const char *src, size_t size) /* {{{ */
232 else if ((src[in] < 32)
239 if ((size - out) < 4)
242 snprintf (esc, sizeof (esc), "%%%02x", (unsigned int) src[in]);
257 } /* }}} int uri_escape */
259 /* vim: set sw=2 sts=2 et fdm=marker : */