-
- if (!(val = strchr(str, '='))) {
- efree(str);
- return FAILURE;
- }
-
-#define HTTP_KEYLIST_VAL(array, k, str, len) \
- { \
- char *decoded; \
- size_t decoded_len; \
- if (decode) { \
- decode(str, len, &decoded, &decoded_len TSRMLS_CC); \
- } else { \
- decoded_len = len; \
- decoded = estrndup(str, decoded_len); \
- } \
- add_assoc_stringl(array, k, decoded, decoded_len, 0); \
- }
-#define HTTP_KEYLIST_FIXKEY() \
- { \
- while (isspace(*key)) ++key; \
- keylen = val - key; \
- while (isspace(key[keylen - 1])) --keylen; \
- }
-#define HTTP_KEYLIST_FIXVAL() \
- { \
- ++val; \
- while (isspace(*val)) ++val; \
- vallen = key - val; \
- while (isspace(val[vallen - 1])) --vallen; \
- if (val[0] == '"' && val[vallen - 1] == '"') { \
- int i; \
- ++val; \
- vallen -= 2; \
- for (i = 0; i < vallen; ++i) { \
- if (val[i] == '\\' && val[i+1] == '"' && (!i || val[i-1] != '\\')) { \
- memmove(&val[i], &val[i+1], vallen - i); \
- --vallen; \
- } \
- } \
- } \
- }
-
- HTTP_KEYLIST_FIXKEY();
-
- if (first_entry_is_name_value_pair) {
- HTTP_KEYLIST_VAL(&array, "name", key, keylen);
-
- /* just one name=value */
- if (!(key = strchr(val, separator))) {
- key = val + strlen(val);
- HTTP_KEYLIST_FIXVAL();
- HTTP_KEYLIST_VAL(&array, "value", val, vallen);
- efree(str);
- return SUCCESS;