/* $Id$ */ /* * Copyright (c) 2006 Dimitri A. Sokolyuk * * 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 #include #include #include #include #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; }