1 #ifndef DS_PARAMETERS_H 2 #define DS_PARAMETERS_H 3 4 #define SETUP_CALLABLE_VARS() \ 5 zend_fcall_info fci = empty_fcall_info; \ 6 zend_fcall_info_cache fci_cache = empty_fcall_info_cache; 7 8 #define PARSE_1(spec, a) if (zend_parse_parameters(ZEND_NUM_ARGS(), spec, a) == FAILURE) return 9 #define PARSE_2(spec, a, b) if (zend_parse_parameters(ZEND_NUM_ARGS(), spec, a, b) == FAILURE) return 10 #define PARSE_3(spec, a, b, c) if (zend_parse_parameters(ZEND_NUM_ARGS(), spec, a, b, c) == FAILURE) return 11 12 #define PARSE_NONE if (zend_parse_parameters_none() == FAILURE) return 13 14 #define PARSE_OPTIONAL_ZVAL(v) \ 15 zval *v = NULL; \ 16 PARSE_1("|z", &v) 17 18 #define PARSE_OPTIONAL_ZVAL_OPTIONAL_ZVAL(v1, v2) \ 19 zval *v1 = NULL; \ 20 zval *v2 = NULL; \ 21 PARSE_2("|zz", &v1, &v2) 22 23 #define PARSE_STRING() \ 24 char *str; \ 25 size_t len; \ 26 PARSE_2("s", &str, &len) 27 28 #define PARSE_CALLABLE_AND_OPTIONAL_ZVAL(v) \ 29 SETUP_CALLABLE_VARS(); \ 30 zval *v = NULL; \ 31 PARSE_3("f|z", &fci, &fci_cache, &v) 32 33 #define PARSE_CALLABLE() \ 34 SETUP_CALLABLE_VARS(); \ 35 PARSE_2("f", &fci, &fci_cache) 36 37 #define PARSE_LONG_AND_LONG(a, b) \ 38 zend_long a = 0; \ 39 zend_long b = 0; \ 40 PARSE_2("ll", &a, &b) 41 42 #define PARSE_LONG_AND_ZVAL(l, z) \ 43 zend_long l = 0; \ 44 zval *z = NULL; \ 45 PARSE_2("lz", &l, &z) 46 47 #define PARSE_LONG_AND_OPTIONAL_ZVAL(l, z) \ 48 zend_long l = 0; \ 49 zval *z = NULL; \ 50 PARSE_2("l|z", &l, &z) 51 52 #define PARSE_ZVAL_AND_LONG(z, l) \ 53 zval *z = NULL; \ 54 zend_long l = 0; \ 55 PARSE_2("zl", &z, &l) 56 57 #define PARSE_VARIADIC_ZVAL() \ 58 zval *argv = NULL; \ 59 int argc = 0; \ 60 PARSE_2("*", &argv, &argc) 61 62 #define PARSE_LONG_AND_VARIADIC_ZVAL(_l) \ 63 zval *argv = NULL; \ 64 int argc = 0; \ 65 zend_long _l = 0; \ 66 PARSE_3("l*", &_l, &argv, &argc) 67 68 #define PARSE_LONG(a) \ 69 zend_long a = 0; \ 70 PARSE_1("l", &a) 71 72 #define PARSE_COMPARE_CALLABLE() \ 73 DSG(user_compare_fci) = empty_fcall_info; \ 74 DSG(user_compare_fci_cache) = empty_fcall_info_cache; \ 75 PARSE_2("f", &DSG(user_compare_fci), &DSG(user_compare_fci_cache)) 76 77 #define PARSE_ZVAL(z) \ 78 zval *z = NULL; \ 79 PARSE_1("z", &z) 80 81 #define PARSE_OBJ(o, ce) \ 82 zval *o = NULL; \ 83 PARSE_2("O", &o, ce) 84 85 #define PARSE_ZVAL_ZVAL(z1, z2) \ 86 zval *z1 = NULL; \ 87 zval *z2 = NULL; \ 88 PARSE_2("zz", &z1, &z2) 89 90 #define PARSE_ZVAL_OPTIONAL_ZVAL(z1, z2) \ 91 zval *z1 = NULL; \ 92 zval *z2 = NULL; \ 93 PARSE_2("z|z", &z1, &z2) 94 95 #endif 96