summaryrefslogtreecommitdiff
path: root/README.PARAMETER_PARSING_API
diff options
context:
space:
mode:
authorAndrei Zmievski <andrei@php.net>2001-10-22 20:28:57 +0000
committerAndrei Zmievski <andrei@php.net>2001-10-22 20:28:57 +0000
commit27d63c5b8debcb5a491dd054b5b4f04526e515f8 (patch)
tree788144a266fc906370a33390151a26965089468b /README.PARAMETER_PARSING_API
parent801cadc3b8a9d7600d8e518aed048b60c4ac89f4 (diff)
downloadphp-git-27d63c5b8debcb5a491dd054b5b4f04526e515f8.tar.gz
Adding some docs for new parameter parsing API. They really should be more
fleshed out.
Diffstat (limited to 'README.PARAMETER_PARSING_API')
-rw-r--r--README.PARAMETER_PARSING_API101
1 files changed, 101 insertions, 0 deletions
diff --git a/README.PARAMETER_PARSING_API b/README.PARAMETER_PARSING_API
new file mode 100644
index 0000000000..f6f0334862
--- /dev/null
+++ b/README.PARAMETER_PARSING_API
@@ -0,0 +1,101 @@
+New parameter parsing functions
+===============================
+
+It should be easier to parse input parameters to an extension function.
+Hence, borrowing from Python's example, there are now a set of functions
+that given the string of type specifiers, can parse the input parameters
+and store the results in the user specified variables. This avoids most
+of the IS_* checks and convert_to_* conversions. The functions also
+check for the appropriate number of parameters, and try to output
+meaningful error messages.
+
+
+Prototypes
+----------
+/* Implemented. */
+zend_parse_parameters(int num_args, char *type_spec, ...);
+zend_parse_parameters_ex(int flags, int num_args, char *type_spec, ...);
+
+/* Not implemented yet. */
+zend_parse_parameters_hash(HashTable *ht, char *type_spec, ...);
+zend_parse_parameters_hash_ex(int flags, HashTable *ht, char *type_spec, ...);
+
+
+The zend_parse_parameters() function takes the number of parameters
+passed to the extension function, the type specifier string, and the
+list of pointers to variables to store the results in. The _ex() version
+also takes 'flags' argument -- current only ZEND_PARSE_PARAMS_QUIET can
+be used as 'flags' to specify that the function should operate quietly
+and not output any error messages.
+
+The auto-conversions are performed as necessary. Arrays, objects, and
+resources cannot be autoconverted.
+
+
+Type specifiers
+---------------
+ l - long
+ d - double
+ s - string (with possible null bytes) and its length
+ b - boolean, stored in zend_bool
+ r - resource (stored in zval)
+ a - array
+ o - object (of any type)
+ O - object (of specific type, specified by class entry)
+ z - the actual zval
+
+ The following characters also have a meaning in the specifier string:
+ | - indicates that the remaining parameters are optional, they
+ should be initialized to default values by the extension since they
+ will not be touched by the parsing function if they are not
+ passed to it.
+ / - use SEPARATE_ZVAL_IF_NOT_REF() on the parameter it follows
+ ! - the parameter it follows can be of specified type or NULL (only applies
+ to 'a', 'o', 'O', 'r', and 'z'). If NULL is passed, the results
+ pointer is set to NULL as well.
+
+Examples
+--------
+/* Gets a long, a string and its length, and a zval */
+long l;
+char *s;
+int s_len;
+zval *param;
+zend_parse_parameters(ZEND_NUM_ARGS(), "lsz", &l, &s, &s_len, &param);
+
+
+/* Gets an object of class specified by my_ce, and an optional double. */
+zval *obj;
+double d = 0.5;
+zend_parse_parameters(ZEND_NUM_ARGS(), "O|d", &obj, my_ce, &d);
+
+
+/* Gets an object or null, and an array.
+ If null is passed for object, obj will be set to NULL. */
+zval *obj;
+zval *arr;
+zend_parse_parameters(ZEND_NUM_ARGS(), "O!a", &obj, &arr);
+
+
+/* Gets a separated array. */
+zval *arr;
+zend_parse_parameters(ZEND_NUM_ARGS(), "a/", &arr));
+
+
+/* Get only the first three parameters (useful for varargs functions). */
+zval *z;
+zend_bool b;
+zval *r;
+zend_parse_parameters(3, "zbr!", &z, &b, &r);
+
+
+/* Get either a set of 3 longs or a string. */
+long l1, l2, l3;
+char *s;
+if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "lll", &l1, &l2, &l3)) {
+ /* manipulate longs */
+} else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "s", &s)) {
+ /* manipulate string */
+} else {
+ /* output error */
+}