Rev 3 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/* $Id: query.c 41 2024-08-22 04:26:35Z nishi $ */
#include "rv_query.h"
#include "rv_util.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
struct query_entry {
char* key;
char* value;
};
struct query_entry** qentries;
struct query_entry** query = NULL;
struct query_entry** postquery = NULL;
void rv_save_query(char c) {
if(c == 'Q') {
query = qentries;
} else if(c == 'P') {
postquery = qentries;
}
}
void rv_load_query(char c) {
if(c == 'Q') {
qentries = query;
} else if(c == 'P') {
qentries = postquery;
}
}
void rv_parse_query(const char* oldquery) {
char* query = rv_strdup(oldquery);
int i;
int incr = 0;
qentries = malloc(sizeof(*qentries));
qentries[0] = NULL;
for(i = 0;; i++) {
if(query[i] == '&' || query[i] == 0) {
char oldc = query[i];
query[i] = 0;
char* key = query + incr;
char* value = "";
int j;
for(j = 0; key[j] != 0; j++) {
if(key[j] == '=') {
key[j] = 0;
value = key + j + 1;
break;
}
}
struct query_entry* entry = malloc(sizeof(*entry));
entry->key = rv_url_decode(key);
entry->value = rv_url_decode(value);
struct query_entry** old_entries = qentries;
for(j = 0; old_entries[j] != NULL; j++)
;
qentries = malloc(sizeof(*qentries) * (j + 2));
for(j = 0; old_entries[j] != NULL; j++) {
qentries[j] = old_entries[j];
}
qentries[j] = entry;
qentries[j + 1] = NULL;
free(old_entries);
incr = i + 1;
if(oldc == 0) break;
}
}
free(query);
}
void rv_free_query(void) {
int i;
for(i = 0; qentries[i] != NULL; i++) {
free(qentries[i]->key);
free(qentries[i]->value);
free(qentries[i]);
}
free(qentries);
}
char* rv_get_query(const char* key) {
int i;
if(qentries == NULL) return NULL;
for(i = 0; qentries[i] != NULL; i++) {
if(strcmp(qentries[i]->key, key) == 0) {
return qentries[i]->value;
}
}
return NULL;
}