summaryrefslogtreecommitdiff
path: root/math/query.c
diff options
context:
space:
mode:
Diffstat (limited to 'math/query.c')
-rw-r--r--math/query.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/math/query.c b/math/query.c
new file mode 100644
index 0000000..c275547
--- /dev/null
+++ b/math/query.c
@@ -0,0 +1,81 @@
+/* $Id$ */
+
+/*
+ * Copyright (c) 2006 Dimitri A. Sokolyuk <demon@vhost.dyndns.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "query.h"
+
+char *
+decode(const char *s)
+{
+ char *buf, *t;
+
+ assert(s);
+ buf = malloc(sizeof(char) * strlen(s) + 1);
+ assert(buf);
+
+ for (t = buf; *s != '\0'; ++t, ++s) {
+ if (*s == '%') {
+ *t = *++s;
+ *t -= isdigit(*s) ? '0' : ((isupper(*s) ? 'A' : 'a') - 0x0a);
+ *t *= 0x10;
+ *t += *++s;
+ *t -= isdigit(*s) ? '0' : ((isupper(*s) ? 'A' : 'a') - 0x0a);
+ } else if (*s == '+')
+ *t = ' ';
+ else
+ *t = *s;
+ }
+ *t = '\0';
+
+ return buf;
+}
+
+char *
+getquery(char *var)
+{
+ const char *qstr;
+ char *buf, *s, *p;
+
+ assert(var);
+ qstr = getenv("QUERY_STRING");
+ if (!qstr)
+ return NULL;
+ buf = decode(qstr);
+
+ for (s = buf; *s != '\0'; s = p + 1) {
+ for (p = s; *p && *p != '&'; ++p)
+ ;
+ *p = '\0';
+ if (strncmp(s, var, strlen(var)) == 0) {
+ s = strchr(s, '=') + 1;
+ if (strlen(s) == 0)
+ break; /* XXX */
+ p = strdup(s);
+ free(buf);
+ return p;
+ }
+ }
+
+ free(buf);
+ return NULL;
+}