-/*
- * remove escaped strings from i.e. the url string (like %20 for blanks)
- */
-long unescape_input(char *buf)
-{
- int a, b;
- char hex[3];
- long buflen;
- long len;
-
- buflen = strlen(buf);
-
- while ((buflen > 0) && (isspace(buf[buflen - 1]))){
- buf[buflen - 1] = 0;
- buflen --;
- }
-
- a = 0;
- while (a < buflen) {
- if (buf[a] == '+')
- buf[a] = ' ';
- if (buf[a] == '%') {
- /* don't let % chars through, rather truncate the input. */
- if (a + 2 > buflen) {
- buf[a] = '\0';
- buflen = a;
- }
- else {
- hex[0] = buf[a + 1];
- hex[1] = buf[a + 2];
- hex[2] = 0;
- b = 0;
- sscanf(hex, "%02x", &b);
- buf[a] = (char) b;
- len = buflen - a - 2;
- if (len > 0)
- memmove(&buf[a + 1], &buf[a + 3], len);
-
- buflen -=2;
- }
- }
- a++;
- }
- return a;
-}
-
-void free_url(void *U)
-{
- urlcontent *u = (urlcontent*) U;
- free(u->url_data);
- free(u);
-}
-
-/*
- * Extract variables from the URL.
- */
-void addurls(char *url, long ulen)
-{
- char *aptr, *bptr, *eptr;
- char *up;
- char *buf;
- int len, keylen;
- urlcontent *u;
- struct wcsession *WCC = WC;
-
- if (WCC->urlstrings == NULL)
- WCC->urlstrings = NewHash(1, NULL);
- buf = (char*) malloc (ulen + 1);
- memcpy(buf, url, ulen);
- buf[ulen] = '\0';
- eptr = buf + ulen;
- up = buf;
- while ((up < eptr) && (!IsEmptyStr(up))) {
- aptr = up;
- while ((aptr < eptr) && (*aptr != '\0') && (*aptr != '='))
- aptr++;
- if (*aptr != '=')
- return;
- *aptr = '\0';
- aptr++;
- bptr = aptr;
- while ((bptr < eptr) && (*bptr != '\0')
- && (*bptr != '&') && (*bptr != '?') && (*bptr != ' ')) {
- bptr++;
- }
- *bptr = '\0';
- u = (urlcontent *) malloc(sizeof(urlcontent));
-
- keylen = safestrncpy(u->url_key, up, sizeof u->url_key);
- if (keylen < 0){
- lprintf(1, "URLkey to long! [%s]", up);
- continue;
- }
-
- Put(WCC->urlstrings, u->url_key, keylen, u, free_url);
- len = bptr - aptr;
- u->url_data = malloc(len + 2);
- safestrncpy(u->url_data, aptr, len + 2);
- u->url_data_size = unescape_input(u->url_data);
- u->url_data[u->url_data_size] = '\0';
- up = bptr;
- ++up;
-#ifdef DEBUG_URLSTRINGS
- lprintf(9, "%s = [%ld] %s\n", u->url_key, u->url_data_size, u->url_data);
-#endif
- }
- free(buf);
-}
-
-/*
- * free urlstring memory
- */
-void free_urls(void)
-{
- DeleteHash(&WC->urlstrings);
-}
-
-/*
- * Diagnostic function to display the contents of all variables
- */
-
-void dump_vars(void)
-{
- struct wcsession *WCC = WC;
- urlcontent *u;
- void *U;
- long HKLen;
- char *HKey;
- HashPos *Cursor;
-
- Cursor = GetNewHashPos ();
- while (GetNextHashPos(WCC->urlstrings, Cursor, &HKLen, &HKey, &U)) {
- u = (urlcontent*) U;
- wprintf("%38s = %s\n", u->url_key, u->url_data);
- }
-}
-
-/*
- * Return the value of a variable supplied to the current web page (from the url or a form)
- */
-
-const char *XBstr(char *key, size_t keylen, size_t *len)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, keylen, &U)) {
- *len = ((urlcontent *)U)->url_data_size;
- return ((urlcontent *)U)->url_data;
- }
- else {
- *len = 0;
- return ("");
- }
-}
-
-const char *XBSTR(char *key, size_t *len)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, strlen (key), &U)){
- *len = ((urlcontent *)U)->url_data_size;
- return ((urlcontent *)U)->url_data;
- }
- else {
- *len = 0;
- return ("");
- }
-}
-
-
-const char *BSTR(char *key)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, strlen (key), &U))
- return ((urlcontent *)U)->url_data;
- else
- return ("");
-}
-
-const char *Bstr(char *key, size_t keylen)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, keylen, &U))
- return ((urlcontent *)U)->url_data;
- else
- return ("");
-}
-
-long LBstr(char *key, size_t keylen)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, keylen, &U))
- return atol(((urlcontent *)U)->url_data);
- else
- return (0);
-}
-
-long LBSTR(char *key)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, strlen(key), &U))
- return atol(((urlcontent *)U)->url_data);
- else
- return (0);
-}
-
-int IBstr(char *key, size_t keylen)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, keylen, &U))
- return atoi(((urlcontent *)U)->url_data);
- else
- return (0);
-}
-
-int IBSTR(char *key)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, strlen(key), &U))
- return atoi(((urlcontent *)U)->url_data);
- else
- return (0);
-}
-
-int HaveBstr(char *key, size_t keylen)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, keylen, &U))
- return ((urlcontent *)U)->url_data_size != 0;
- else
- return (0);
-}
-
-int HAVEBSTR(char *key)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, strlen(key), &U))
- return ((urlcontent *)U)->url_data_size != 0;
- else
- return (0);
-}
-
-
-int YesBstr(char *key, size_t keylen)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, keylen, &U))
- return strcmp( ((urlcontent *)U)->url_data, "yes") == 0;
- else
- return (0);
-}
-
-int YESBSTR(char *key)
-{
- void *U;
-
- if ((WC->urlstrings != NULL) &&
- GetHash(WC->urlstrings, key, strlen(key), &U))
- return strcmp( ((urlcontent *)U)->url_data, "yes") == 0;
- else
- return (0);
-}