HTTP_END_ARGS;
#ifndef WONKY
-HTTP_BEGIN_ARGS(getInstance, 0)
+HTTP_BEGIN_ARGS(singleton, 0)
HTTP_ARG_VAL(global, 0)
HTTP_END_ARGS;
#endif
HTTP_END_ARGS;
#ifdef HAVE_ICONV
-HTTP_BEGIN_ARGS(iconv, 2)
+HTTP_BEGIN_ARGS(xlate, 2)
HTTP_ARG_VAL(from_encoding, 0)
HTTP_ARG_VAL(to_encoding, 0)
HTTP_END_ARGS;
HTTP_ARG_VAL(serialized, 0)
HTTP_END_ARGS;
-#define http_querystring_object_declare_default_properties() _http_querystring_object_declare_default_properties(TSRMLS_C)
-static inline void _http_querystring_object_declare_default_properties(TSRMLS_D);
-
-#define GET_STATIC_PROP(n) *GET_STATIC_PROP_EX(http_querystring_object_ce, n)
-#define SET_STATIC_PROP(n, v) SET_STATIC_PROP_EX(http_querystring_object_ce, n, v)
#define OBJ_PROP_CE http_querystring_object_ce
zend_class_entry *http_querystring_object_ce;
zend_function_entry http_querystring_object_fe[] = {
HTTP_QUERYSTRING_ME(get, ZEND_ACC_PUBLIC)
HTTP_QUERYSTRING_ME(set, ZEND_ACC_PUBLIC)
-#ifndef WONKY
- HTTP_QUERYSTRING_ME(getInstance, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
-#endif
-
HTTP_QUERYSTRING_GME(getBool, ZEND_ACC_PUBLIC)
HTTP_QUERYSTRING_GME(getInt, ZEND_ACC_PUBLIC)
HTTP_QUERYSTRING_GME(getFloat, ZEND_ACC_PUBLIC)
HTTP_QUERYSTRING_GME(getArray, ZEND_ACC_PUBLIC)
HTTP_QUERYSTRING_GME(getObject, ZEND_ACC_PUBLIC)
+#ifndef WONKY
+ HTTP_QUERYSTRING_ME(singleton, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
+#endif
#ifdef HAVE_ICONV
- HTTP_QUERYSTRING_ME(iconv, ZEND_ACC_PUBLIC)
+ HTTP_QUERYSTRING_ME(xlate, ZEND_ACC_PUBLIC)
#endif
/* Implements Serializable */
zend_class_implements(http_querystring_object_ce TSRMLS_CC, 1, zend_ce_serializable);
#endif
+ DCL_STATIC_PROP_N(PRIVATE, instance);
+ DCL_PROP_N(PRIVATE, queryArray);
+ DCL_PROP(PRIVATE, string, queryString, "");
+
+#ifndef WONKY
+ DCL_CONST(long, "TYPE_BOOL", HTTP_QUERYSTRING_TYPE_BOOL);
+ DCL_CONST(long, "TYPE_INT", HTTP_QUERYSTRING_TYPE_INT);
+ DCL_CONST(long, "TYPE_FLOAT", HTTP_QUERYSTRING_TYPE_FLOAT);
+ DCL_CONST(long, "TYPE_STRING", HTTP_QUERYSTRING_TYPE_STRING);
+ DCL_CONST(long, "TYPE_ARRAY", HTTP_QUERYSTRING_TYPE_ARRAY);
+ DCL_CONST(long, "TYPE_OBJECT", HTTP_QUERYSTRING_TYPE_OBJECT);
+#endif
+
HTTP_LONG_CONSTANT("HTTP_QUERYSTRING_TYPE_BOOL", HTTP_QUERYSTRING_TYPE_BOOL);
HTTP_LONG_CONSTANT("HTTP_QUERYSTRING_TYPE_INT", HTTP_QUERYSTRING_TYPE_INT);
HTTP_LONG_CONSTANT("HTTP_QUERYSTRING_TYPE_FLOAT", HTTP_QUERYSTRING_TYPE_FLOAT);
return ov;
}
-static inline void _http_querystring_object_declare_default_properties(TSRMLS_D)
-{
- zend_class_entry *ce = http_querystring_object_ce;
-
- DCL_STATIC_PROP_N(PRIVATE, instance);
-
- DCL_PROP_N(PRIVATE, queryArray);
- DCL_PROP(PRIVATE, string, queryString, "");
-
-#ifndef WONKY
- DCL_CONST(long, "TYPE_BOOL", HTTP_QUERYSTRING_TYPE_BOOL);
- DCL_CONST(long, "TYPE_INT", HTTP_QUERYSTRING_TYPE_INT);
- DCL_CONST(long, "TYPE_FLOAT", HTTP_QUERYSTRING_TYPE_FLOAT);
- DCL_CONST(long, "TYPE_STRING", HTTP_QUERYSTRING_TYPE_STRING);
- DCL_CONST(long, "TYPE_ARRAY", HTTP_QUERYSTRING_TYPE_ARRAY);
- DCL_CONST(long, "TYPE_OBJECT", HTTP_QUERYSTRING_TYPE_OBJECT);
-#endif
-}
-
void _http_querystring_object_free(zend_object *object TSRMLS_DC)
{
http_querystring_object *o = (http_querystring_object *) object;
/* {{{ querystring helpers */
#define http_querystring_update(qa, qs) _http_querystring_update((qa), (qs) TSRMLS_CC)
static inline void _http_querystring_update(zval *qarray, zval *qstring TSRMLS_DC);
-#define http_querystring_modify_ex(a, k, l, v) _http_querystring_modify_ex((a), (k), (l), (v) TSRMLS_CC)
-static inline int _http_querystring_modify_ex(zval *qarray, char *key, uint keylen, zval *data TSRMLS_DC);
#define http_querystring_modify_array_ex(q, k, kl, pe) _http_querystring_modify_array_ex((q), (k), (kl), (pe) TSRMLS_CC)
static inline int _http_querystring_modify_array_ex(zval *qarray, char *key, int keylen, zval *params_entry TSRMLS_DC);
#define http_querystring_modify_array(q, p) _http_querystring_modify_array((q), (p) TSRMLS_CC)
http_error(HE_WARNING, HTTP_E_QUERYSTRING, "Failed to update query string");
}
}
-static inline int _http_querystring_modify_ex(zval *qarray, char *key, uint keylen, zval *data TSRMLS_DC)
-{
- if (Z_TYPE_P(data) == IS_NULL) {
- if (SUCCESS != zend_hash_del(Z_ARRVAL_P(qarray), key, keylen)) {
- return 0;
- }
- } else {
- ZVAL_ADDREF(data);
- add_assoc_zval(qarray, key, data);
- }
- return 1;
-}
static inline int _http_querystring_modify_array_ex(zval *qarray, char *key, int keylen, zval *params_entry TSRMLS_DC)
{
zval **qarray_entry;
- if ( (Z_TYPE_P(params_entry) == IS_ARRAY) &&
- (SUCCESS == zend_hash_find(Z_ARRVAL_P(qarray), key, keylen, (void**) &qarray_entry))) {
- if (http_querystring_modify_array(*qarray_entry, params_entry)) {
- return 1;
+ /* delete */
+ if (Z_TYPE_P(params_entry) == IS_NULL) {
+ return (SUCCESS == zend_hash_del(Z_ARRVAL_P(qarray), key, keylen));
+ }
+
+ /* update */
+ if (SUCCESS == zend_hash_find(Z_ARRVAL_P(qarray), key, keylen, (void **) &qarray_entry)) {
+ zval equal;
+
+ /* recursive */
+ if (Z_TYPE_P(params_entry) == IS_ARRAY) {
+ return http_querystring_modify_array(*qarray_entry, params_entry);
}
- } else {
- if (http_querystring_modify_ex(qarray, key, keylen, params_entry)) {
- return 1;
+ /* equal */
+ if ((SUCCESS == is_equal_function(&equal, *qarray_entry, params_entry TSRMLS_CC)) && Z_BVAL(equal)) {
+ return 0;
}
}
- return 0;
+
+ /* add */
+ ZVAL_ADDREF(params_entry);
+ add_assoc_zval_ex(qarray, key, keylen, params_entry);
+ return 1;
}
static inline int _http_querystring_modify_array(zval *qarray, zval *params TSRMLS_DC)
{
if (Z_TYPE_P(ztype) == IS_LONG) {
type = Z_LVAL_P(ztype);
} else if(Z_TYPE_P(ztype) == IS_STRING) {
- switch (tolower(Z_STRVAL_P(ztype)[0]))
+ switch (Z_STRVAL_P(ztype)[0])
{
+ case 'B':
case 'b': type = HTTP_QUERYSTRING_TYPE_BOOL; break;
+ case 'I':
case 'i': type = HTTP_QUERYSTRING_TYPE_INT; break;
+ case 'F':
case 'f': type = HTTP_QUERYSTRING_TYPE_FLOAT; break;
+ case 'S':
case 's': type = HTTP_QUERYSTRING_TYPE_STRING; break;
+ case 'A':
case 'a': type = HTTP_QUERYSTRING_TYPE_ARRAY; break;
+ case 'O':
case 'o': type = HTTP_QUERYSTRING_TYPE_OBJECT; break;
}
}
/* }}} */
#ifndef WONKY
-/* {{{ proto HttpQueryString HttpQueryString::getInstance([bool global = true])
+/* {{{ proto HttpQueryString HttpQueryString::singleton([bool global = true])
*
* Get a single instance (differentiates between the global setting).
*/
-PHP_METHOD(HttpQueryString, getInstance)
+PHP_METHOD(HttpQueryString, singleton)
{
zend_bool global = 1;
zval *instance = GET_STATIC_PROP(instance);
/* }}} */
#ifdef HAVE_ICONV
-/* {{{ proto bool HttpQueryString::iconv(string ie, string oe)
+/* {{{ proto bool HttpQueryString::xlate(string ie, string oe)
*
* Converts the query string from the source encoding ie to the target encoding oe.
+ * WARNING: Don't use any character set that can contain NUL bytes like UTF-16.
*
* Returns TRUE on success or FALSE on failure.
*/
-PHP_METHOD(HttpQueryString, iconv)
+PHP_METHOD(HttpQueryString, xlate)
{
char *ie, *oe, *er = NULL;
int ie_len, oe_len;