Guys,

Andrei sent this Email a while ago and I don't remember anyone giving 
feedback. We'd be happy to hear what people think about this new parameter 
API in the Zend Engine. I think it has good potential especially for 
simplifying functions which accept read-only arguments (which is the case 
for most functions) of pre-determined types.
Please take another look at what Andrei wrote and see what you think.
Andi


>Date: Tue, 10 Jul 2001 10:35:04 -0500
>From: Andrei Zmievski <[EMAIL PROTECTED]>
>To: PHP Developers <[EMAIL PROTECTED]>
>User-Agent: Mutt/1.2.5i
>Subject: [PHP-DEV] * New Parameter Parsing Functions *
>
>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(2, "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 */
>}
>
>Comments and feedback are welcome.
>
>-Andrei
>* If it's never finished, you can't prove it doesn't work. *
>
>--
>PHP Development Mailing List <http://www.php.net/>
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>To contact the list administrators, e-mail: [EMAIL PROTECTED]


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to