| iMatix home page | << | < | > | >> |
SFL Version 2.11 |
#include "sflhttp.h" char ** http_query2strt ( const char *original_query)
Parses a HTTP query string, building an array of strings of the format "name=value". The query string is assumed to be in escaped format, so http unescape() is always applied to the query string. Within the query string, field=value pairs are delimited by & or ;. Returns a pointer to the array. The array is allocated dynamically. The array ends with a NULL string. To free the table, call strtfree(). If there was not enough memory to allocate the table, returns NULL.
{ char *query, /* Local copy of query string */ *query_ptr, /* Pointer into query string */ *query_next, /* Pointer to next query chunk */ **strings; /* Returned string array */ int char_nbr, /* Index into query string */ string_count, /* Size of string table */ string_nbr; /* Index into string table */ ASSERT (original_query); if (*original_query == '&') /* Skip leading & if present */ original_query++; if ((query = mem_strdup (original_query)) == NULL) return (NULL); /* Could not allocate memory */ /* Break query string at & and ; delimiters and count strt size */ string_count = 1; /* Last string has no delimiter */ for (char_nbr = 0; original_query [char_nbr]; char_nbr++) if (query [char_nbr] == '&' || query [char_nbr] == ';') { query [char_nbr] = '\0'; string_count++; } /* Allocate the array of pointers with one slot for the final NULL */ if ((strings = mem_alloc (sizeof (char *) * (string_count + 1))) == NULL) { mem_free (query); return (NULL); /* Could not allocate memory */ } /* Query string now consists of a series of substrings, each ending in * a null character. We have to unescape each substring, which we do * in-place: the unescaped string is never larger than the original * string. */ query_ptr = query; for (string_nbr = 0; string_nbr < string_count; string_nbr++) { /* Unescape next query string component */ query_next = query_ptr + strlen (query_ptr) + 1; http unescape (query_ptr, NULL); /* Allocate space for "name=value" plus final null char */ strings [string_nbr] = mem_strdup (query_ptr); query_ptr = query_next; } strings [string_nbr] = NULL; /* Store final null pointer */ mem_free (query); /* Release temporary memory */ return (strings); }
| << | < | > | >> | Copyright © 1996-2000 iMatix Corporation |