diff options
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r-- | Zend/zend_builtin_functions.c | 424 |
1 files changed, 0 insertions, 424 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c deleted file mode 100644 index 342cf6913b..0000000000 --- a/Zend/zend_builtin_functions.c +++ /dev/null @@ -1,424 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | Zend Engine | - +----------------------------------------------------------------------+ - | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski | - +----------------------------------------------------------------------+ - | This source file is subject to version 0.91 of the Zend license, | - | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.zend.com/license/0_91.txt. | - | If you did not receive a copy of the Zend license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@zend.com so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Authors: Andi Gutmans <andi@zend.com> | - | Zeev Suraski <zeev@zend.com> | - +----------------------------------------------------------------------+ -*/ - - -#include "zend.h" -#include "zend_API.h" -#include "zend_builtin_functions.h" -#include "zend_operators.h" -#include "zend_variables.h" -#include "zend_constants.h" - -static ZEND_FUNCTION(zend_version); -static ZEND_FUNCTION(func_num_args); -static ZEND_FUNCTION(func_get_arg); -static ZEND_FUNCTION(func_get_args); -static ZEND_FUNCTION(strlen); -static ZEND_FUNCTION(strcmp); -static ZEND_FUNCTION(strcasecmp); -static ZEND_FUNCTION(each); -static ZEND_FUNCTION(error_reporting); -static ZEND_FUNCTION(define); -static ZEND_FUNCTION(defined); -static ZEND_FUNCTION(get_class); -static ZEND_FUNCTION(get_parent_class); -static ZEND_FUNCTION(method_exists); -static ZEND_FUNCTION(leak); - -extern unsigned char first_arg_force_ref[]; - -static zend_function_entry builtin_functions[] = { - ZEND_FE(zend_version, NULL) - ZEND_FE(func_num_args, NULL) - ZEND_FE(func_get_arg, NULL) - ZEND_FE(func_get_args, NULL) - ZEND_FE(strlen, NULL) - ZEND_FE(strcmp, NULL) - ZEND_FE(strcasecmp, NULL) - ZEND_FE(each, first_arg_force_ref) - ZEND_FE(error_reporting, NULL) - ZEND_FE(define, NULL) - ZEND_FE(defined, NULL) - ZEND_FE(get_class, NULL) - ZEND_FE(get_parent_class, NULL) - ZEND_FE(method_exists, NULL) - ZEND_FE(leak, NULL) - { NULL, NULL, NULL } -}; - - -int zend_startup_builtin_functions() -{ - return zend_register_functions(builtin_functions, NULL); -} - - -ZEND_FUNCTION(zend_version) -{ - RETURN_STRINGL(ZEND_VERSION, sizeof(ZEND_VERSION)-1, 1); -} - - -ZEND_FUNCTION(func_num_args) -{ - void **p; - int arg_count; - ELS_FETCH(); - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; /* this is the amount of arguments passed to func_num_args(); */ - - p = EG(argument_stack).top_element-1-arg_count-1; - if (p>=EG(argument_stack).elements) { - RETURN_LONG((ulong) *p); - } else { - zend_error(E_WARNING, "func_num_args(): Called from the global scope - no function context"); - RETURN_LONG(-1); - } -} - - -ZEND_FUNCTION(func_get_arg) -{ - void **p; - int arg_count; - zval **z_requested_offset; - zval *arg; - long requested_offset; - ELS_FETCH(); - - if (ARG_COUNT(ht)!=1 || getParametersEx(1, &z_requested_offset)==FAILURE) { - RETURN_FALSE; - } - convert_to_long_ex(z_requested_offset); - requested_offset = (*z_requested_offset)->value.lval; - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; /* this is the amount of arguments passed to func_num_args(); */ - - p = EG(argument_stack).top_element-1-arg_count-1; - if (p<EG(argument_stack).elements) { - zend_error(E_WARNING, "func_get_arg(): Called from the global scope - no function context"); - RETURN_FALSE; - } - arg_count = (ulong) *p; - - if (requested_offset>arg_count) { - zend_error(E_WARNING, "func_get_arg(): Only %d arguments passed to function (argument %d requested)", arg_count, requested_offset); - RETURN_FALSE; - } - - arg = *(p-(arg_count-requested_offset)); - *return_value = *arg; - zval_copy_ctor(return_value); -} - - -ZEND_FUNCTION(func_get_args) -{ - void **p; - int arg_count; - int i; - ELS_FETCH(); - - p = EG(argument_stack).top_element-1; - arg_count = (ulong) *p; /* this is the amount of arguments passed to func_num_args(); */ - - p = EG(argument_stack).top_element-1-arg_count-1; - if (p<EG(argument_stack).elements) { - zend_error(E_WARNING, "func_get_args(): Called from the global scope - no function context"); - RETURN_FALSE; - } - arg_count = (ulong) *p; - - - array_init(return_value); - for (i=0; i<arg_count; i++) { - zval *element; - - element = (zval *) emalloc(sizeof(zval)); - *element = **((zval **) (p-(arg_count-i))); - zval_copy_ctor(element); - INIT_PZVAL(element); - zend_hash_next_index_insert(return_value->value.ht, &element, sizeof(zval *), NULL); - } -} - - -/* {{{ proto int strlen(string str) - Get string length */ -ZEND_FUNCTION(strlen) -{ - zval **str; - - if (ARG_COUNT(ht) != 1 || getParametersEx(1, &str) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string_ex(str); - RETVAL_LONG((*str)->value.str.len); -} -/* }}} */ - -/* {{{ proto int strcmp(string str1, string str2) - Binary safe string comparison */ -ZEND_FUNCTION(strcmp) -{ - zval *s1,*s2; - - if (ARG_COUNT(ht) != 2 || getParameters(ht, 2, &s1, &s2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string(s1); - convert_to_string(s2); - RETURN_LONG(zend_binary_strcmp(s1,s2)); -} -/* }}} */ - -/* {{{ proto int strcasecmp(string str1, string str2) - Binary safe case-insensitive string comparison */ -ZEND_FUNCTION(strcasecmp) -{ - zval *s1,*s2; - - if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &s1, &s2) == FAILURE) { - WRONG_PARAM_COUNT; - } - convert_to_string(s1); - convert_to_string(s2); - RETURN_LONG(zend_binary_strcasecmp(s1, s2)); -} -/* }}} */ - -ZEND_FUNCTION(each) -{ - zval *array,*entry,**entry_ptr, *tmp; - char *string_key; - ulong num_key; - zval **inserted_pointer; - HashTable *target_hash; - - if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &array) == FAILURE) { - WRONG_PARAM_COUNT; - } - target_hash = HASH_OF(array); - if (!target_hash) { - zend_error(E_WARNING,"Variable passed to each() is not an array or object"); - return; - } - if (zend_hash_get_current_data(target_hash, (void **) &entry_ptr)==FAILURE) { - RETURN_FALSE; - } - array_init(return_value); - entry = *entry_ptr; - - /* add value elements */ - if (entry->EA.is_ref) { - tmp = (zval *)emalloc(sizeof(zval)); - *tmp = *entry; - zval_copy_ctor(tmp); - tmp->EA.is_ref=0; - tmp->EA.locks = 0; - tmp->refcount=0; - entry=tmp; - } - zend_hash_index_update(return_value->value.ht, 1, &entry, sizeof(zval *), NULL); - entry->refcount++; - zend_hash_update_ptr(return_value->value.ht, "value", sizeof("value"), entry, sizeof(zval *), NULL); - entry->refcount++; - - /* add the key elements */ - switch (zend_hash_get_current_key(target_hash, &string_key, &num_key)) { - case HASH_KEY_IS_STRING: - add_get_index_string(return_value,0,string_key,(void **) &inserted_pointer,0); - break; - case HASH_KEY_IS_LONG: - add_get_index_long(return_value,0,num_key, (void **) &inserted_pointer); - break; - } - zend_hash_update(return_value->value.ht, "key", sizeof("key"), inserted_pointer, sizeof(zval *), NULL); - (*inserted_pointer)->refcount++; - zend_hash_move_forward(target_hash); -} - -ZEND_FUNCTION(error_reporting) -{ - zval *arg; - int old_error_reporting; - ELS_FETCH(); - - old_error_reporting = EG(error_reporting); - switch (ARG_COUNT(ht)) { - case 0: - break; - case 1: - if (getParameters(ht,1,&arg) == FAILURE) { - RETURN_FALSE; - } - convert_to_long(arg); - EG(error_reporting)=arg->value.lval; - break; - default: - WRONG_PARAM_COUNT; - break; - } - - RETVAL_LONG(old_error_reporting); -} - -ZEND_FUNCTION(define) -{ - zval *var, *val, *non_cs; - int case_sensitive; - zend_constant c; - ELS_FETCH(); - - switch(ARG_COUNT(ht)) { - case 2: - if (getParameters(ht, 2, &var, &val)==FAILURE) { - RETURN_FALSE; - } - case_sensitive = CONST_CS; - break; - case 3: - if (getParameters(ht, 3, &var, &val, &non_cs)==FAILURE) { - RETURN_FALSE; - } - convert_to_long(non_cs); - if (non_cs->value.lval) { - case_sensitive = 0; - } else { - case_sensitive = CONST_CS; - } - break; - default: - WRONG_PARAM_COUNT; - break; - } - switch(val->type) { - case IS_LONG: - case IS_DOUBLE: - case IS_STRING: - case IS_BOOL: - case IS_RESOURCE: - break; - default: - zend_error(E_WARNING,"Constants may only evaluate to scalar values"); - RETURN_FALSE; - break; - } - convert_to_string(var); - - c.value = *val; - zval_copy_ctor(&c.value); - c.flags = case_sensitive | ~CONST_PERSISTENT; /* non persistent */ - c.name = zend_strndup(var->value.str.val, var->value.str.len); - c.name_len = var->value.str.len+1; - zend_register_constant(&c ELS_CC); - RETURN_TRUE; -} - - -ZEND_FUNCTION(defined) -{ - zval *var; - zval c; - - if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &var)==FAILURE) { - WRONG_PARAM_COUNT; - } - - convert_to_string(var); - if (zend_get_constant(var->value.str.val, var->value.str.len, &c)) { - zval_dtor(&c); - RETURN_LONG(1); - } else { - RETURN_LONG(0); - } -} - -/* {{{ proto string get_class(object object) - Retrieves the class name ... -*/ -ZEND_FUNCTION(get_class) -{ - zval *arg; - - if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &arg)==FAILURE) { - RETURN_FALSE; - } - if (arg->type != IS_OBJECT) { - RETURN_FALSE; - } - RETURN_STRINGL(arg->value.obj.ce->name, arg->value.obj.ce->name_length, 1); -} -/* }}} */ - -/* {{{ proto string get_parent_class(object object) - Retrieves the parent class name ... -*/ -ZEND_FUNCTION(get_parent_class) -{ - zval *arg; - - if (ARG_COUNT(ht)!=1 || getParameters(ht, 1, &arg)==FAILURE) { - RETURN_FALSE; - } - if ((arg->type != IS_OBJECT) || !arg->value.obj.ce->parent) { - RETURN_FALSE; - } - RETURN_STRINGL(arg->value.obj.ce->parent->name, arg->value.obj.ce->parent->name_length, 1); -} -/* }}} */ - -/* {{{ proto bool method_exists(object object, string method) - Checks if the class method exists ... -*/ -ZEND_FUNCTION(method_exists) -{ - zval *arg1, *arg2; - - if (ARG_COUNT(ht)!=2 || getParameters(ht, 2, &arg1, &arg2)==FAILURE) { - RETURN_FALSE; - } - if (arg1->type != IS_OBJECT) { - RETURN_FALSE; - } - convert_to_string(arg2); - if(zend_hash_exists(&arg1->value.obj.ce->function_table, arg2->value.str.val, arg2->value.str.len+1)) { - RETURN_TRUE; - } else { - RETURN_FALSE; - } -} -/* }}} */ - -ZEND_FUNCTION(leak) -{ - int leakbytes=3; - zval *leak; - - if (ARG_COUNT(ht)>=1) { - if (getParameters(ht, 1, &leak)==SUCCESS) { - convert_to_long(leak); - leakbytes = leak->value.lval; - } - } - - emalloc(leakbytes); -} |